Warum kann ksh bei geschachtelten Befehlsersetzungen keinen Standardfehler erfassen?

8

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.

%Vor%

Aber in ksh unter Debian wird die Fehlermeldung nicht ausgegeben, weil der Befehl bogus aufgerufen wurde.

%Vor%

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.

%Vor%

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.

  1. Können wir mit genügend Referenzen auf den Standard oder den Menschen beweisen? Seiten, ob die Ausgabe von ksh im ersten Beispiel ein Fehler oder ist nicht?
  2. Wie kann ich sonst den von einer Shell geschriebenen Standardfehler erfassen? Funktion, bei der die Shell-Funktion Befehle ausführt Substitution?
Susam Pal 01.05.2016, 09:57
quelle

1 Antwort

2

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 Ссылка .

    
khrm 13.05.2016, 12:12
quelle