Neuer Alias ​​nach nicht verfügbar;

9

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, kshUnd bashgleich verhalten. Zumindest spielt cshes 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?

user3224237
quelle
"Ich dachte, dass ein Semikolon in der Shell (irgendwie) die gleiche Bedeutung hat wie ein Zeilenumbruch" Fast. Nicht ganz!
Leichtigkeitsrennen im Orbit
1
Die Interpretation von Semikolon und Zeilenumbruch hängt davon ab, wie der Parser aufgerufen wird. Für den Befehl "dot" ruft die Bourne-Shell den Parser mit dem "NLFLG" auf, der ihn anweist, Zeilenumbruch und Semikolon in einigen Situationen gleich zu behandeln, aber dies ist anderswo nicht der Fall. Im Allgemeinen sind Semikolon und Zeilenumbruch nicht gleichwertig, da Sie einen Zeilenumbruch haben können, bei dem ein Semikolon einen Syntaxfehler verursachen würde.
schily

Antworten:

9

Die von Ihnen verwendete Alias-Syntax ist für eine POSIX-Shell ungeeignet. Für eine POSIX-Shell müssen Sie Folgendes verwenden:

alias name='replacement'

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.

schily
quelle
Darüber hinaus mögen einige Shells den Alias ​​in yashoder zshwürden ihn nicht erweitern shell -c 'alias name=replacement<newline>replacement'. Für AT & T ksh, dann würden Sie das Problem mit haben sourced Skripten.
Stéphane Chazelas
In diesem Fall muss ich csh =verwenden - in der aliasSyntax wird no verwendet .
user3224237
@ user3224237 - das hat nichts mit dem zu tun =. Dies liegt daran, dass die Alias-Erweiterung erfolgt, wenn die Shell die Zeile zum ersten Mal sieht, bevor Sie den Alias ​​definieren.
Cas
@ Stéphane Chazelas Das Verhalten bei "Sourcing" -Skripten wird durch die Tatsache verursacht, dass die Bourne-Shell solche Dateien vollständig analysiert, bevor sie ausgeführt werden. Ksh basiert auf der Bourne Shell-Quelle und alles, was nicht geändert wurde, verhält sich gleich.
schily
@schily, ja, es ist der gleiche Grund, zsh/yash -c 'code'wo codeals Ganzes analysiert wird. Bei der Bourne-Shell scheint dies nicht der Fall zu sein. Ich nehme an, die Bourne-Shell analysiert jeweils codeeine Zeile nach der anderen.
Stéphane Chazelas
5

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 Befehl aliasnicht ausgeführt.

cuonglm
quelle