Bash: espacios en nombre de alias

117

Estoy tratando de crear un alias en bash. Lo que quiero hacer es asignar ls -laals -la | more

En mi archivo .bashrc esto es lo que intenté:

alias 'ls -la'='ls -la | more'

Sin embargo, no funciona porque (supongo) tiene espacios en el nombre del alias. ¿Hay una solución para esto?

Sixtyfootersdude
fuente
8
¿Por qué no hacerloalias lsm='ls -la | more'
Nifle

Respuestas:

126

La documentación de Bash dice "Para casi cualquier propósito, las funciones de shell son preferibles a los alias". Aquí hay una función de shell que reemplaza lsy hace que la salida se canalice moresi el argumento consiste en (solo) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Como una línea:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Salida de tubería automática:

ls -la
Dennis Williamson
fuente
1
¿Por qué necesita usar corchetes dobles dentro de la instrucción if?
sixtyfootersdude
1
@sixtyfootersdude: la forma de doble paréntesis es más poderosa y la uso por costumbre. Ver mywiki.wooledge.org/BashFAQ/031
Dennis Williamson
Entonces, ¿cuál es el comando final? alias ls = 'ls ()' ??
Jeef
1
@Jeef: No, mi respuesta usa una función en lugar de un alias. Lo he editado para intentar aclararlo.
Dennis Williamson
66
@merlinpatt: commandevita que la función se llame de forma recursiva.
Dennis Williamson
53

Desde la página de manual de alias :

La primera palabra de cada comando simple, si no se cita, se verifica para ver si tiene un alias. Si es así, esa palabra se reemplaza por el texto del alias. El nombre de alias y el texto de reemplazo pueden contener cualquier entrada de shell válida, incluidos los metacaracteres de shell, con la excepción de que el nombre de alias no puede contener `= '.

Por lo tanto, solo se verifica la coincidencia de alias en la primera palabra, lo que hace imposible los alias de varias palabras. Es posible que pueda escribir un script de shell que verifique los argumentos y llame a su comando si coinciden y, de lo contrario, solo llama a lo normal ls(consulte la respuesta de @Dennis Williamson )

pesado
fuente
8
+1 Para explicar por qué no se me permite usar ls -la como un alias.
sixtyfootersdude
77
Esto fue útil porque en lugar de tratar de resolverlo, respondió la pregunta. Vine aquí porque quería crear un alias con un espacio y eso simplemente no sucederá.
angryundead
Esto no solo respondió a mi pregunta, sino que me dio información valiosa sobre cómo funciona realmente el mecanismo de alias. Su cita de la página del manual fue bastante útil.
Lily Finley
14

Un enfoque ligeramente mejorado tomado de la respuesta de Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

O el one-liner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Esto permite agregar más opciones / argumentos después del comando si es necesario, por ejemplo ls -la -h

ld_pvl
fuente
2
¿Cómo se maneja esto si quiero ls -latser excluido de este tratamiento? Necesitaría poner un estuche para manejarlo encima de la -la*entrada, ¿sí?
Steven Lu
-1

Todavía puede invocar este alias, pero necesita una cita para que el espacio sea parte de la palabra de comando. Entonces "ls -la" -p patternpasará la -p patternopción a more, no ls.

Charles Stewart
fuente