Até agora eu pensava que um ponto e vírgula no shell tinha (de alguma forma) o mesmo significado que uma quebra de linha. Então fiquei surpreso que por
alias <name>=<replacement text>; <name>
<name>
é desconhecido enquanto é conhecido na próxima linha. csh
, tcsh
, sh
, ksh
e bash
se comportam da mesma forma. Pelo menos csh
não importa se o alias é usado diretamente ou se um script é originado antes do ponto e vírgula - os aliases não são conhecidos depois, ;
mas são conhecidos na próxima linha de comando. Isso é um bug ou esse comportamento é intencional?
Responder1
A sintaxe do alias que você está usando é inadequada para um shell POSIX; para um shell POSIX, você precisa usar:
alias name='replacement'
Mas para todos os shells, isso não pode funcionar, pois a substituição do alias é feita no início do analisador.
Antes da configuração do seu alias ser executada, toda a linha foi lida pelo analisador e por esse motivo, sua linha de comando não funcionará.
Se o alias aparecer na próxima linha de comando, funcionará.
Responder2
Este comportamento é pretendido e especificado pelo POSIX emSubstituição de Alias.
Um alias foi substituído logo após a execução do shellReconhecimento de tokene antes de qualquerRegras de gramáticaaplicado. No momento em que você chamou o alias <name>
, o comando alias
não foi executado.
Responder3
Se você realmente queruma linha, então você podeuse função em vez de alias.
Por exemplo, você cria py3
um alias, mas só funciona na segunda linha:
$ alias py3=python3; py3 -c 'print("hello, world")'
Command 'py3' not found, did you mean:
command 'py' from deb pythonpy
command 'hy3' from deb python3-hy
command 'pyp' from deb pyp
Try: sudo apt install <deb name>
$ py3 -c 'print("hello, world")'
hello, world
Você pode definir py3
como function
em vez de alias
:
$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world
Ou export -f
antes de ser usado no processo filho posteriormente:
$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world
E se você estiver ciente da diferença devariável vs alias/função, então você pode usarvariáveltambém:
$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world
e não há necessidade export -f
:
$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world