Rozważ następującą (nieco głupią) nazwę skryptu „test1.sh”:
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Kiedy go uruchamiam, otrzymuję nie tylko wynik echa, ale także raport bash o śmierci snu na stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
W takim przypadku chciałbym pominąć wydruk na stderr. Wiem, że mogę to zrobić w wierszu polecenia, jak w:
$ ./test1.sh 2> /dev/null
... ale czy jest jakiś sposób, aby ukryć to w skrypcie? (Wiem, że mogę owinąć go w drugi skrypt i przekierować opakowanie, ale musi być coś łatwiejszego ...)
bash
shell-script
stderr
nieustraszony głupiec
źródło
źródło
Odpowiedzi:
Masz rację; pkill nie generuje wiadomości, bash jest. Sugerujesz to
jest możliwym rozwiązaniem. Jak wskazuje UVV, równoważne działanie z poziomu skryptu to
Spowoduje to przekierowanie stderr skryptu do
/dev/null
tej instrukcji, dopóki nie zostanie zmieniona z powrotem. Niezdarne sposoby na przywrócenie tego obejmująktóry przekierowuje stderr do terminala. Prawdopodobnie jest to (ale niekoniecznie) pierwotna wersja.
Lub
która ustawia stderr na to samo co stdout i prawdopodobnie się myli.
Bardziej niezawodnym sposobem jest
który zapisuje oryginalny stderr w deskryptorze pliku 3, a później go przywraca.
Inne sposoby tłumienia samego ogłoszenia procesu śmierci obejmują
i
które zmieniają stderr tylko dla zgrupowanych poleceń.
źródło
stdin
i tworzeniemstderr
nowych deskryptorów plików, wysyłaniem oryginalnych deskryptorów/dev/null
i przywracaniem ich?{ sleep 10 & pkill sleep;} 2> /dev/null
Zgodnie z tym możesz zrobić coś takiego:
źródło