Como outros já disseram, "alias" não processa os argumentos da linha de comando dados na linha de comando que invoca o comando "aliased". Ele simplesmente passa adiante todos os argumentos da linha de comando para o comando substituído, anexando os argumentos ao final.
Aqui está um exemplo de script teste para mostrar esse efeito ...
Comece com um script como este:
[~]# cat /some...path/ls1.sh
#!/bin/sh
dollarpound="$1"
shift
dollarone="$1"
shift
echo ""
echo "dollarpound=\"$dollarpound\""
echo "dollarone=\"$dollarone\""
echo "\$*=\"$*\""
echo "\$@=\"$@\""
echo "\=\"$1\""
echo "\=\"$2\""
echo ""
if [ $# -eq 0 ]; then
echo ls --color -lh *
else
echo "ls --color -lh $*"
fi
echo ""
[~]#
Em seguida, atribua esse script a um alias:
[~]#alias lsx='/some...path/ls1.sh $# "$1"'
[~]#
Invoque o alias lsx
sem argumentos:
[~]# lsx
dollarpound="0"
dollarone=""
$*=""
$@=""
$1=""
$2=""
ls --color -lh ant bat cat dog eel.txt fox.txt goat.jpg horse.jpg
[~]#
Invoque o alias lsx
com 1 argumento: "*.txt"
:
[~]# lsx *.txt
dollarpound="0"
dollarone=""
$*="eel.txt fox.txt"
$@="eel.txt fox.txt"
$1="eel.txt"
$2="fox.txt"
ls --color -lh eel.txt fox.txt
[~]#
Observe que o script chamado pelo comando "aliased" relata 0
argumentos em vez de 1
( "*.txt"
) ou 2
( "eel.txt", "fox.txt"
).
Invoque o alias lsx
com 4 argumentos:
[~]# lsx ant bat cat dog
dollarpound="0"
dollarone=""
$*="ant bat cat dog"
$@="ant bat cat dog"
$1="ant"
$2="bat"
ls --color -lh ant bat cat dog
[~]#
Observe que o script chamado pelo comando "aliased" relata os argumentos 0
em vez de 4
.
Então, uma versão funcional do script é:
[~]# cat /some...path/ls2.sh
#!/bin/sh
if [ $# -eq 0 ]; then
\ls --color -lh *
else
\ls --color -lh $*
fi
[~]#
(Observe o \
antes de ls
. Isso impede que ls
seja substituído por outros "aliases", etc ...).
Atribua o script de trabalho a um alias:
# alias lsx='/some...path/ls2.sh'
[~]#
Invoque o alias lsx
sem argumentos:
[~]# lsx
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 fox.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 goat.jpg
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 horse.jpg
ant:
total 0
bat:
total 0
cat:
total 0
dog:
total 0
[~]
Observe que o script detectou que não havia argumentos e executou "ls *"
em vez de "ls"
(sem argumentos).
Invoque o alias lsx
com 1 argumento: "*.txt"
:
[~]# lsx *.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 fox.txt
[~]
Invoque o alias lsx
com 4 argumentos:
[~]# lsx ant bat cat dog
ant:
total 0
bat:
total 0
cat:
total 0
dog:
total 0
[~]#
Se houver um motivo pelo qual você deseja fazer isso com um "alias", isso deve funcionar para você. Apenas dê o apelido e o script, qualquer que seja o nome que você goste. Por exemplo, se você quiser "alias" o comando ls
, use alias ls='/some...path/ls2.sh'
(com o caminho e o nome usados para o script).
Por outro lado, se você quiser que esse comando tenha um nome exclusivo, como lsx
por exemplo, pode ser mais simples apenas fornecer o script com esse nome e colocar o script em um pasta incluída no caminho, como: /bin/lsx
, ou o que você quiser.