Ich habe ein Skript, das Dateinamen in ein Array mit der folgenden Methode aus einem Q & A auf SO analysiert :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Dies funktioniert hervorragend und verarbeitet alle Arten von Dateinamenvariationen perfekt. Manchmal übergebe ich jedoch eine nicht vorhandene Datei an das Skript, zB:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
Unter normalen Umständen würde ich das Skript den Exit-Code mit so etwas wie erfassen lassen RET=$?
und damit zu entscheiden, wie es weitergeht. Dies scheint mit der obigen Prozessersetzung nicht zu funktionieren.
Wie ist die korrekte Vorgehensweise in solchen Fällen? Wie kann ich den Rückkehrcode erfassen? Gibt es andere geeignetere Methoden, um festzustellen, ob im ersetzten Prozess ein Fehler aufgetreten ist?
quelle
Verwenden Sie ein Coprozess . Mit dem
coproc
eingebauten Befehl können Sie einen Unterprozess starten, dessen Ausgabe lesen und den Beendigungsstatus überprüfen:Wenn das Verzeichnis nicht existiert,
wait
wird mit einem Statuscode ungleich Null beendet.Derzeit muss die PID in eine andere Variable kopiert werden, da
$LS_PID
sie vor demwait
Aufruf nicht gesetzt wird. Weitere Informationen finden Sie unter Bash unsets * _PID-Variable, bevor ich auf Coproc warten kann .quelle
read -u
sollte genauso gut funktionieren. Das Beispiel sollte allgemein gehalten sein und zeigen, wie die Ausgabe des Coprozesses in einen anderen Befehl geleitet werden kann.Ein Ansatz ist:
Die Idee ist, den Exit-Status zusammen mit dem zufälligen Token nach Abschluss des Befehls wiederzugeben und dann reguläre Bash-Ausdrücke zu verwenden, um den Exit-Status zu suchen und zu extrahieren. Mit dem Token wird eine eindeutige Zeichenfolge erstellt, nach der in der Ausgabe gesucht werden soll.
Es ist wahrscheinlich nicht der beste Weg, dies im allgemeinen Programmiersinn zu tun, aber es ist möglicherweise der am wenigsten schmerzhafte Weg, es in bash zu handhaben.
quelle