Respuestas:
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 ls
para ls -la
, a continuación, escribiendo ls foo bar
sería realmente ejecutar ls -la foo bar
en 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 "$@"
}
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 $1
si 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 f
se llama al final del alias.
La unset -f
quita la definición de función como el alias se ejecuta de manera que no cuelgue alrededor después.
wrap_args x y z
me da: bash: error de sintaxis cerca de token inesperado `('
f
aliasado. Una vez que lo desajuste f
, funciona bien. La vieja colisión de nombres.
command type f
:)
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 -l
realizado 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 function
lugar de alias
.
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 less
cerrará en EOF (-e), las búsquedas no distinguen entre mayúsculas y minúsculas (-i), etc.
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 !:1
y cuáles !:2
son 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
sh
están definidasmy_program_wrapper() { ...; }
. Bash maneja la palabra clave,function
pero ¿por qué no ir con lo que es más portátil?