Neuer Alias ​​nicht verfügbar nach;

Neuer Alias ​​nicht verfügbar nach;

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, kshund bashverhalten sich gleich. Zumindest für cshist 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 py3einen 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 py3Folgendes definieren :functionalias

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

Oder export -fvor 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

verwandte Informationen