Betrachten Sie den folgenden (etwas albernen) Skriptnamen 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Wenn ich es starte, erhalte ich nicht nur die Ausgabe des Echos, sondern auch die bash-Meldung über den Tod des Schlafes auf stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
In diesem Fall möchte ich den Ausdruck auf stderr unterdrücken. Ich weiß, dass ich es auf der Kommandozeile machen kann, wie in:
$ ./test1.sh 2> /dev/null
... aber ist es eine Möglichkeit , es aus zu unterdrücken , in dem Skript? (Ich weiß, ich könnte es in ein zweites Skript einbinden und den Wrapper umleiten lassen, aber es muss etwas einfacher sein ...)
bash
shell-script
stderr
furchtloser Dummkopf
quelle
quelle
Antworten:
Du hast recht; pkill generiert die Nachricht nicht, bash ist. Sie schlagen das vor
ist eine mögliche Lösung. Wie UVV hervorhebt, ist die entsprechende Aktion innerhalb des Skripts
Das leitet das stderr für das Skript
/dev/null
von dieser Anweisung weiter, bis es wieder geändert wird. Unbeholfene Möglichkeiten, es wieder zu ändern, umfassenwelches stderr zum terminal umleitet. Dies ist wahrscheinlich (aber nicht unbedingt) der Ort, an dem es ursprünglich war.
Oder
Das setzt stderr auf das Gleiche wie stdout und ist wahrscheinlich falsch.
Ein zuverlässigerer Weg ist
Dadurch wird das ursprüngliche stderr in Dateideskriptor 3 gespeichert und später wiederhergestellt.
Andere Möglichkeiten, nur die Ankündigung des Todesprozesses zu unterdrücken, umfassen
und
die das stderr nur für die gruppierten Befehle ändern.
quelle
stdin
und Wiederherstellenstderr
neuer Dateideskriptoren, indem die ursprünglichen Deskriptoren an/dev/null
diese gesendet und anschließend wiederhergestellt werden?{ sleep 10 & pkill sleep;} 2> /dev/null
Nach dieser könnte man so etwas wie folgt vorgehen:
quelle