Novo alias não disponível depois;

Novo alias não disponível depois;

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, kshe bashse comportam da mesma forma. Pelo menos cshnã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 aliasnão foi executado.

Responder3

Se você realmente queruma linha, então você podeuse função em vez de alias.

Por exemplo, você cria py3um 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 py3como functionem vez de alias:

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

Ou export -fantes 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

informação relacionada