Nouvel alias non disponible après;

9

Jusqu'à présent, je pensais qu'un point-virgule dans le shell avait (en quelque sorte) la même signification qu'un saut de ligne. J'ai donc été surpris que

alias <name>=<replacement text>; <name>

<name>est inconnu alors qu'il est connu dans la ligne suivante. csh, tcsh, sh, kshEt bashle même comportement. Au moins, cshpeu importe si l'alias est utilisé directement ou si un script est originaire avant le semccolon - les alias ne sont pas connus après ;mais le sont dans la ligne de commande suivante. Est-ce un bug ou ce comportement est-il voulu?

user3224237
la source
"Je pensais qu'un point-virgule dans la coquille avait (en quelque sorte) la même signification qu'un saut de ligne" Presque. Pas assez!
Courses de légèreté en orbite
1
L'interprétation du point-virgule et de la nouvelle ligne dépend de la façon dont l'analyseur est appelé. Pour la commande "dot", le Bourne Shell appelle l'analyseur avec le "NLFLG" qui lui dit de traiter la nouvelle ligne et le point-virgule dans certaines situations, mais ce n'est pas le cas ailleurs. En général, le point-virgule et le saut de ligne ne sont pas équivalents car vous pouvez avoir un saut de ligne, où un point-virgule provoquerait une erreur de syntaxe.
schily

Réponses:

9

La syntaxe d'alias que vous utilisez est inappropriée pour un shell POSIX, pour un shell POSIX, vous devez utiliser:

alias name='replacement'

Mais pour tous les shells, cela ne peut pas fonctionner car le remplacement de l'alias se fait tôt dans l'analyseur.

Avant que votre configuration d'alias ne soit exécutée, la ligne entière a été lue par l'analyseur et pour cette raison, votre ligne de commande ne fonctionnera pas.

Si l'alias apparaît sur la ligne de commande suivante, cela fonctionnera.

schily
la source
De plus, certains shells aiment yashou zshne développent pas l'alias dans shell -c 'alias name=replacement<newline>replacement'. Pour AT&T ksh, vous auriez le problème avec les scripts sourcés .
Stéphane Chazelas
J'ai besoin d'utiliser le csh dans ce cas - il n'y en a pas =dans la aliassyntaxe.
user3224237
@ user3224237 - cela n'a rien à voir avec le =. c'est parce que l'expansion d'alias se produit lorsque le shell voit la ligne pour la première fois, c'est-à-dire avant de définir l'alias.
cas
@ Stéphane Chazelas Le comportement des scripts "sourcés" est dû au fait que le shell Bourne analyse complètement ces fichiers avant leur exécution. Ksh est basé sur la source Bourne Shell et tout ce qui n'a pas été modifié se comporte de la même manière.
schily
@schily, oui, c'est la même raison pour zsh/yash -c 'code'laquelle codeest analysé dans son ensemble. Cela ne semble pas être le cas pour le shell Bourne. Je suppose donc que le shell Bourne analyse codeune ligne à la fois.
Stéphane Chazelas
5

Ce comportement est prévu et spécifié par POSIX sous Substitution d'alias .

Un alias a été substitué juste après que le shell a effectué la reconnaissance des jetons et avant l' application des règles de grammaire . Au moment où vous avez appelé l'alias <name>, la commande aliasn'a pas été exécutée.

cuonglm
la source