Até agora, pensei que um ponto-e-vírgula no shell tivesse (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. 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 é pretendido?
Respostas:
A sintaxe do alias que você está usando é inadequada para um shell POSIX. Para um shell POSIX, é necessário usar:
Mas para todos os shells, isso não pode funcionar, pois a substituição do alias é feita no início do analisador.
Antes de sua configuração de 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, ele funcionará.
fonte
yash
ouzsh
não expandir o alias noshell -c 'alias name=replacement<newline>replacement'
. Para a AT&Tksh
, você teria o problema com scripts de origem .=
usado naalias
sintaxe.=
. é porque a expansão do alias acontece quando o shell vê a linha pela primeira vez, antes de você definir o alias.zsh/yash -c 'code'
ondecode
é analisado como um todo. Não parece ser o caso do shell Bourne. Então, suponho que o shell Bourne analise quecode
há uma linha de cada vez.Esse comportamento é pretendido e especificado pelo POSIX em Substituição de alias .
Um alias foi substituído logo após o shell executar o Reconhecimento de Token e antes de qualquer regra gramatical ser aplicada. No momento em que você chamou o alias
<name>
, o comandoalias
não foi executado.fonte