/ / Wie kann zsh die gesamte Zeile ausfallen lassen, wenn eine Befehlsersetzung fehlschlägt? - zsh, Befehlssubstitution

Wie kann zsh die gesamte Zeile ausfallen lassen, wenn eine Befehlsersetzung fehlschlägt? - zsh, Befehlssubstitution

Wenn ich mache:

$(blah) bleh

Ich bekomme

zsh: command not found: blah
zsh: command not found: bleh

Das hat mich etwas beunruhigt, weil es bedeutet, dass zsh ausgeführt wird bleh das war nie beabsichtigt, ein Befehl zu sein; Was ist, wenn es ausführbar ist und etwas tut, was ich nicht wollte?

Gibt es eine Möglichkeit, die ganze Linie in diesem Moment zum Scheitern zu bringen? blah scheitert?

Antworten:

1 für die Antwort № 1

Der Grund bleh ist versucht, das ist $(blah) wird ersetzt durch eine leere Zeichenfolge wenn blah Existiert nicht. In welchem ​​Fall bleh wird das erste Wort auf der vollständig geparsten Befehlszeile sein und somit als Befehl interpretiert werden.

Sie müssen also die leere Zeichenfolge abfangen und die weitere Ausführung verhindern. Zum Glück hat ZSH eine Parametererweiterung, nämlich ${name:?word} das kann nur für diesen Fall verwendet werden:

${$(blah):?No such thing} bleh

Ob blah existiert nicht, ZSH wird drucken No such thing und zur Eingabeaufforderung zurückkehren (oder die Shell beenden, wenn sie nicht interaktiv ist):

zsh: : No such thing

sonst wird es nur der ersetzte Befehl

% alias blah="echo echo ">>>""
% ${$(blah):?No such thing} bleh
>>> bleh

0 für die Antwort № 2

Verwenden && Trennen von Befehlen wird bei einem Fehler beendet:

$(blah) && bleh