¿Puedo pasar argumentos a un comando de alias?

19

Quiero saber si puedo pasar una discusión con un comando de alias.

por ejemplo:

alias d="dmesg|grep -iw usb|tail -5" 

Ahora dimprimirá las últimas 5 líneas. Si quiero usar d para imprimir un número diferente de líneas, tengo que hacer cambios en la declaración del comando alias de dnuevo.

¿Hay alguna manera de modificar la declaración de un alias para no tener que volver a escribir la declaración para cambiar el número de líneas? ¿Como incorporar pasar el número de líneas como argumento al declarar alias para d? ¿O hay algún otro método para resolver esto?

srk_cb
fuente
En (t) csh, "\! *" Hace referencia a argumentos a un alias (la barra invertida es solo para escapar del signo de exclamación que normalmente significa "historial"), e incluso puede hacer referencia a argumentos individuales, aunque no recuerdo cómo. Entonces, tal vez "tail -n \! *" O algo así (no creo que \! * Funcione con un signo menos inmediatamente antes). Sin embargo, no estoy seguro si esto funcionará en (ba) sh.
barrycarter

Respuestas:

20

Los alias no toman argumentos. Con un alias como alias foo='bar $1', el $1shell expandirá el primer argumento del shell (que probablemente no sea nada) cuando se ejecute el alias.

Entonces: use funciones , en su lugar.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} usa el primer argumento, con un valor predeterminado de 5 si no se proporciona.

Entonces puedes hacer:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

O, si cambia las opciones que usó ligeramente:

alias d="dmesg|grep -iw usb|tail -n 5"

Luego puede pasar -nopciones adicionales :

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Si -nse especifican varias opciones para tail, solo se usa la última.

muru
fuente
Para la funcionalmente desafiado como yo :) podría ser útil para explicar brevemente dónde poner la función ... es decir, ~/.bashrco rc.localo donde sea?
WinEunuuchs2Unix
@ WinEunuuchs2Unix donde se haya puesto el alias.
muru
5

Debe tener una función para esto como se describe en el SO y aquí . Intenta lo siguiente:

foo() { /path/to/command "$@" ;}

y llame al foocon:

foo arg1 arg2 arg3
Ron
fuente
4

Solución de limitaciones de alias con comando de grupo y here-string

Los alias no pueden tomar argumentos, pero podemos "simular" eso. Tomemos, por ejemplo, un ejemplo de mi respuesta a esta pregunta .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Puntos clave que están sucediendo aquí:

  • Usamos readincorporado para leer una cadena en una variable d. Debido a que queremos leer una cadena completa que incluya caracteres en blanco (líneas nuevas, pestañas, espacios), utilizamos IFS=y deshabilitamos los escapes de barra invertida -r.
  • <<<que es operador de cadena aquí nos permite redirigir cualquier cadena que proporcionemos como argumento al mkcdalias; el uso sería comomkcd "some directory"
  • múltiples comandos dentro del alias se combinan y ejecutan en el shell actual usando la { list; }estructura (que se conoce como group commanden el bashmanual) Tenga en cuenta que se requieren espacios iniciales después {y ;una lista individual de comandos.

En su ejemplo específico podríamos hacer:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

También podríamos hacer uso de la división de palabras para almacenar argumentos separados por espacios:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

O podríamos usar matrices para proporcionar múltiples argumentos:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

¿Pero es este buen enfoque?

No necesariamente. El problema con este enfoque es que es muy específico: los argumentos no se pueden citar fácilmente, lo que significa que solo podemos tener argumentos sin espacios.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Por supuesto, esto no es algo que se usaría ampliamente, simplemente porque en el mundo real tenemos que lidiar con argumentos complejos, por lo que este enfoque no es muy práctico. Las funciones son mucho más flexibles. Y la necesidad de citar una cadena de args se vuelve molesta rápidamente.

A pesar de las limitaciones, esto funciona con cadenas simples como argumentos donde podemos permitirnos la división de palabras, por lo que en parte nos permite dar argumentos a los alias.

Sergiy Kolodyazhnyy
fuente