Esse é o comportamento esperado e está funcionando há muito tempo. É útil para criar comandos em scripts.
Digamos, por exemplo, que às vezes eu aplique a descompactação em alguma entrada antes de enviá-la para um pipeline (e a compressão na saída depois), mas às vezes não. Usando bash
:
if (( use_compression == 1 )); then
infilter='gzip -d -c'
outfilter='gzip -c'
else
infilter='cat'
outfilter='cat'
fi
$infilter "$indatafile" | somepipeline | $outfilter >"$outdatafile"
É a substituição de comando? Não. "Substituição de comando" refere-se especificamente à substituição de $(...)
ou da variante de retrocesso pelo conteúdo de sua saída.
Esta é a expansão de parâmetros , isto é, simplesmente substituindo os parâmetros pelos seus valores. Isso acontece antes que o comando seja realmente executado e é por isso que funciona.
Isso significa que coisas como as seguintes também funcionam na linha de comando:
$ decompress='gzip -d -c'
$ ${decompress/g/gun/} filename >unzippedfilename
(que executaria gunzip
em vez de gzip
)
EDITAR : Sobre aliases.
O manual bash
diz:
For almost every purpose, aliases are superseded by shell functions.
... e eu concordo.
Os aliases são bons para coisas curtas como
alias ls="ls -F"
(esse é o único alias que eu tenho nas minhas próprias sessões de shell)
Você provavelmente não deseja usar expansões de parâmetros para comandos "aliasing" na linha de comando. Se não por qualquer outro motivo, é uma dor no pescoço para digitar. A expansão de parâmetro também não permite executar tarefas um pouco mais complexas, como pipelining.
Se você tem operações moderadamente complexas que está executando regularmente, use as funções do shell para elas.
Seguindo o exemplo da resposta aceita para a pergunta sobre U & L (com o link nos comentários abaixo):
alias my_File='ls -f | grep -v /'
Esse alias obviamente funciona, mas usando
my_File='ls -f | grep -v /'
não funcionará se você tentar usar $my_File
como um comando na linha de comando (como explicado por que nesse segmento U & L).
Com uma função de shell, você também poderá fazer coisas como passar argumentos:
function my_File {
ls -l "$@" | fgrep -v '/'
}
$ my_File -iF symlink
84416642 lrwxr-xr-x 1 kk staff 4 Jun 27 09:03 symlink@ -> file