¿Cómo pasar parámetros a un alias?

64

Para el script bash, puedo usar "$@"para acceder a los argumentos. ¿Cuál es el equivalente cuando uso un alias?

prosseek
fuente

Respuestas:

50

Los alias son como comandos en el sentido de que todos los argumentos a ellos se pasan como argumentos al programa alias. Por ejemplo, si usted fuera a alias lspara ls -la, a continuación, escribiendo ls foo barsería realmente ejecutar ls -la foo baren la línea de comandos.

Si desea tener un control real sobre cómo se interpretan los argumentos, puede escribir una función como esta:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}
anfetamaquina
fuente
3
opengroup.org/onlinepubs/009695399/utilities/… Las funciones shestán definidas my_program_wrapper() { ...; }. Bash maneja la palabra clave, functionpero ¿por qué no ir con lo que es más portátil?
Ephemient
2
@ephemient Muy cierto. Quiero decir, además del hecho de que todos usan GNU Bash y no el shell POSIX básico.
anfetamáquinas
21

Solución de alias

Si realmente está en contra de usar una función per se, puede usar:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Puede reemplazar $@con $1si solo desea el primer argumento.

Explicación

Esto crea una función temporal f, a la que se le pasan los argumentos.

Los argumentos de alias solo se pasan al final. Tenga en cuenta que fse llama al final del alias.

La unset -fquita la definición de función como el alias se ejecuta de manera que no cuelgue alrededor después.

Tom Hale
fuente
Humm? wrap_args x y zme da: bash: error de sintaxis cerca de token inesperado `('
Vista elíptica
@Elipticalview Hmm, ¿copiar problema de pegar? Confirmado trabajando en bash 4.4.12.
Tom Hale
1
Me había faliasado. Una vez que lo desajuste f, funciona bien. La vieja colisión de nombres.
Vista elíptica
command type f:)
Tom Hale
1
¡Excelente! esa es la variante más vaga!
Sergio
19

Además de las respuestas actuales, una cosa importante a tener en cuenta sobre cómo funcionan los alias es que todos los parámetros que escriba después de un comando con alias se usarán literalmente al final. Por lo tanto, no hay forma de usar alias para dos comandos (canalizados o no), de los cuales el primero debe interpretar los parámetros. Para que quede claro, aquí hay un ejemplo de algo que no funcionaría como se esperaba:

alias lsswp="ls -l | grep swp"

(un ejemplo inspirado en esta pregunta ) esto siempre usará el resultado de ls -lrealizado en el directorio actual y hará un grep sobre eso, así que usando

lsswp / tmp /

sería equivalente a ls -l | grep swp /tmp/ y no ls -l /tmp/ | grep swp .

A todos los efectos, donde los argumentos deben ser utilizados en algún punto intermedio, es necesario utilizar un functionlugar de alias.

rozcietrzewiacz
fuente
15

No tienes que hacer nada, en realidad; los alias hacen esto automáticamente. Por ejemplo:

$ alias less="less -eirqM"
$ less foo.txt

Verá la primera página de foo.txt y se lesscerrará en EOF (-e), las búsquedas no distinguen entre mayúsculas y minúsculas (-i), etc.

Warren Young
fuente
¿Puedes mirar mi pregunta ? Ninguna de las soluciones funciona para mí y no se me permite comenzar una recompensa.
JJD
1
@JJD El que respondió a su pregunta es correcto: desea una función en ese caso, no un alias. Dado que la respuesta aceptada a esta pregunta es esencialmente la misma, su pregunta se cerró correctamente.
Warren Young
1

Estoy respondiendo por csh:

Sí, puede usar los parámetros en alias y, como diferencia con lo que se ha dicho anteriormente, puede referirse a ellos en cualquier lugar de la definición de alias, no solo al final.

Ejemplo para tar-gz -ing algo:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, dónde !:1y cuáles !:2son los parámetros que proporcionará al llamar a su alias.

Ejemplo de uso:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

Lo que efectivamente significa que usó dos parámetros que insertó en lugares arbitrarios del comando tar, haciendo de todo un alias tgz

stevica
fuente