Bisher dachte ich, dass ein Semikolon in der Shell (irgendwie) die gleiche Bedeutung hat wie ein Zeilenumbruch. Also war ich überrascht, dass für
alias <name>=<replacement text>; <name>
<name>
ist unbekannt, solange es in der nächsten Zeile bekannt ist. csh
, tcsh
, sh
, ksh
Und bash
gleich verhalten. Zumindest spielt csh
es keine Rolle, ob der Alias direkt verwendet wird oder ob ein Skript vor dem Semccolon bezogen wird - die Aliase sind danach nicht bekannt, ;
aber die sind in der nächsten Befehlszeile bekannt. Ist das ein Fehler oder ist dieses Verhalten beabsichtigt?
Antworten:
Die von Ihnen verwendete Alias-Syntax ist für eine POSIX-Shell ungeeignet. Für eine POSIX-Shell müssen Sie Folgendes verwenden:
Dies kann jedoch nicht für alle Shells funktionieren, da das Ersetzen des Alias früh im Parser erfolgt.
Bevor Ihr Alias-Setup ausgeführt wird, wurde die gesamte Zeile vom Parser gelesen. Aus diesem Grund funktioniert Ihre Befehlszeile nicht.
Wenn der Alias in der nächsten Befehlszeile angezeigt wird, funktioniert er.
quelle
yash
oderzsh
würden ihn nicht erweiternshell -c 'alias name=replacement<newline>replacement'
. Für AT & Tksh
, dann würden Sie das Problem mit haben sourced Skripten.=
verwenden - in deralias
Syntax wird no verwendet .=
. Dies liegt daran, dass die Alias-Erweiterung erfolgt, wenn die Shell die Zeile zum ersten Mal sieht, bevor Sie den Alias definieren.zsh/yash -c 'code'
wocode
als Ganzes analysiert wird. Bei der Bourne-Shell scheint dies nicht der Fall zu sein. Ich nehme an, die Bourne-Shell analysiert jeweilscode
eine Zeile nach der anderen.Dieses Verhalten wird von POSIX unter Alias-Substitution beabsichtigt und spezifiziert .
Ein Alias wurde direkt nach der Tokenerkennung durch die Shell und vor den angewendeten Grammatikregeln ersetzt . Zu dem Zeitpunkt, als Sie den Alias aufgerufen haben
<name>
, wurde der Befehlalias
nicht ausgeführt.quelle