Bisher dachte ich, dass ein Semikolon in der Shell (irgendwie) die gleiche Bedeutung hat wie ein Zeilenumbruch. Daher war ich überrascht, dass für
alias <name>=<replacement text>; <name>
<name>
ist unbekannt, während es in der nächsten Zeile bekannt ist. csh
, tcsh
, sh
, ksh
und bash
verhalten sich gleich. Zumindest für csh
ist es egal, ob der Alias direkt verwendet wird oder ob vor dem Semccolon ein Skript als Quelle verwendet wird – die Aliase sind danach nicht bekannt, ;
aber in der nächsten Befehlszeile sind sie bekannt. Ist das ein Fehler oder ist dieses Verhalten beabsichtigt?
Antwort1
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 bei allen Shells funktionieren, da der Alias-Ersatz schon früh im Parser erfolgt.
Bevor Ihr Alias-Setup ausgeführt wird, wurde die gesamte Zeile vom Parser gelesen und aus diesem Grund funktioniert Ihre Befehlszeile nicht.
Wenn der Alias in der nächsten Befehlszeile erscheint, funktioniert es.
Antwort2
Dieses Verhalten ist beabsichtigt und spezifiziert durch POSIX unterAlias-Ersetzung.
Ein Alias wurde direkt nach der Shell-Ausführung ersetztToken-Erkennungund vor jedemGrammatik regelnangewendet. Zum Zeitpunkt des Aufrufs des Alias wurde <name>
der Befehl nicht ausgeführt.alias
Antwort3
Wenn du wirklich willstEinzeiler, dann kannst duFunktion statt Alias verwenden.
Z. B. erstellen Sie py3
einen Alias, aber dieser funktioniert nur in der zweiten Zeile:
$ 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
Sie können anstelle von py3
Folgendes definieren :function
alias
$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world
Oder export -f
vor der späteren Verwendung im untergeordneten Prozess:
$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world
Und wenn Sie sich des Unterschieds bewusst sindVariable vs. Alias/Funktion, dann können Sie verwendenVariablezu:
$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world
und keine Notwendigkeit export -f
:
$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world