Novo alias não disponível depois;

9

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, kshE bashse 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?

user3224237
fonte
"Eu pensei que um ponto e vírgula no shell tem (de alguma forma) o mesmo significado que uma quebra de linha" Quase. Não é bem assim!
Lightness Races in Orbit
1
A interpretação de ponto e vírgula e nova linha depende de como o analisador é chamado. Para o comando "ponto", o Bourne Shell chama o analisador com o "NLFLG" que diz para tratar nova linha e ponto e vírgula iguais em algumas situações, mas esse não é o caso em outros lugares. Em geral, ponto e vírgula e quebra de linha não são equivalentes, pois você pode ter uma quebra de linha, onde um ponto e vírgula causaria um erro de sintaxe.
schily

Respostas:

9

A sintaxe do alias que você está usando é inadequada para um shell POSIX. Para um shell POSIX, é necessário 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 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á.

esperto
fonte
Além disso, algumas conchas gostar yashou zshnão expandir o alias no shell -c 'alias name=replacement<newline>replacement'. Para a AT&T ksh, você teria o problema com scripts de origem .
Stéphane Chazelas
Eu preciso usar o csh neste caso - não há nenhum =usado na aliassintaxe.
precisa saber é o seguinte
@ user3224237 - isso não tem nada a ver com o =. é porque a expansão do alias acontece quando o shell vê a linha pela primeira vez, antes de você definir o alias.
cas
@ Stéphane Chazelas O comportamento dos scripts "de origem" é causado pelo fato de o shell Bourne analisar completamente esses arquivos antes de serem executados. O Ksh é baseado na fonte Bourne Shell e tudo o que não foi alterado se comporta da mesma maneira.
schily
@ Schily, sim, é a mesma razão para zsh/yash -c 'code'onde codeé analisado como um todo. Não parece ser o caso do shell Bourne. Então, suponho que o shell Bourne analise que codehá uma linha de cada vez.
Stéphane Chazelas
5

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 comando aliasnão foi executado.

cuonglm
fonte