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?


"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á.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.