Ich habe das folgende Shell-Skript.
%Vor% Erzeugt die folgenden Ausgaben in bash, zsh, dash und posh. Es macht Sinn, weil es keinen solchen Befehl namens bogus
auf dem System gibt.
Aber in ksh unter Debian wird die Fehlermeldung nicht ausgegeben, weil der Befehl bogus
aufgerufen wurde.
Was ist schiefgelaufen?
Falls Sie mehr über die Systemdetails und die Versionsdetails der Shell erfahren möchten, lesen Sie bitte die folgenden Ausgaben.
%Vor%Auf einem CentOS-System sehe ich die erwartete Ausgabe.
%Vor% Wenn ich die Befehlssubstitution in der Funktion foo
entferne, erzeugen alle Shells eine ähnliche Ausgabe unter Debian.
Warum druckt ksh
den Fehler aufgrund des Befehls bogus
im ersten Beispiel auf Debian nicht, sondern erzeugt ihn auf CentOS?
Ich fand den folgenden Text im POSIX.1-2008 Standard:
Mit dem Formular $ (Befehl) folgen alle Zeichen dem Öffnen Klammer zu der passenden schließenden Klammer bilden die Befehl. Jedes gültige Shell-Skript kann für den Befehl verwendet werden, außer a Skript, das nur aus Umleitungen besteht, die unspezifiziert erzeugt Ergebnisse .
Ich vermute, dass der Teil des Textes, den ich fett hervorgehoben habe, dafür verantwortlich ist, in den obigen Beispielen unspezifisches Verhalten zu verursachen. Ich bin mir jedoch nicht ganz sicher, weil ich im Standard keine Definition für "ein Skript, das nur aus Umleitungen besteht" finden kann.
Ich habe zwei Fragen.
ksh
im ersten Beispiel ein Fehler oder ist
nicht? Ich habe nach diesem Problem gesucht und folgendes gefunden:
Laut Standard ist dies ein Fehler, denn wenn ein Befehl nicht gefunden wird, wird ein Fehler "Befehl nicht gefunden" angezeigt.
Dies ist ein Fehler, der im Beta-Zweig von ksh behoben wurde. Benutze diesen Zweig. Ich habe es in Ubuntu getestet und es funktioniert für mich.
So habe ich das gemacht:
%Vor%Es gibt viele Bugs in ksh des Master-Zweiges. Überprüfen Sie die Commit-Protokolle in Ссылка .
Tags und Links linux shell posix ksh io-redirection