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
, ksh
Et bash
le même comportement. Au moins, csh
peu 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?
Réponses:
La syntaxe d'alias que vous utilisez est inappropriée pour un shell POSIX, pour un shell POSIX, vous devez utiliser:
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.
la source
yash
ouzsh
ne développent pas l'alias dansshell -c 'alias name=replacement<newline>replacement'
. Pour AT&Tksh
, vous auriez le problème avec les scripts sourcés .=
dans laalias
syntaxe.=
. 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.zsh/yash -c 'code'
laquellecode
est analysé dans son ensemble. Cela ne semble pas être le cas pour le shell Bourne. Je suppose donc que le shell Bourne analysecode
une ligne à la fois.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 commandealias
n'a pas été exécutée.la source