Oto jak to zrobić w obu przypadkach {ba,z}sh
.
Korzystanie z funkcji pomaga nie potrzebują, aby zapisać i przywrócić stan zsh
„s monitor
zmiennej przy użyciu setopt local_options
.
# Run the command given by "$@" in the background
silent_background() {
if [[ -n $ZSH_VERSION ]]; then # zsh: /superuser//a/1285272/365890
setopt local_options no_notify no_monitor
"$@" &
elif [[ -n $BASH_VERSION ]]; then # bash: /programming//a/27340076/5353461
{ 2>&3 "$@"& } 3>&2 2>/dev/null
else # Unknownness - just background it
"$@" &
fi
}
Używając tego w następujący sposób:
trap 'echo child done' CHLD
silent_background sleep 1
Wyprodukuje oczekiwany child done
komunikat.
Przekierowanie danych wyjściowych polecenia wydaje się być nieistotne, ponieważ powiadomienie jest wysyłane przez powłokę, gdy zadanie jest uruchamiane asynchronicznie. Mówiąc dokładniej, jest to funkcja powłoki (funkcja) związana z kontrolą zadań .
Tutaj cytat z „Bash Reference Manual”, rozdział „Job Job”, rozdział pierwszy.
Zauważ, że skrypt powłoki nie wyświetla tego powiadomienia.
W rzeczywistości
Zsh
Dokumentacja Zsh zawiera podobne informacje na temat tych powiadomień, patrz
man 1 zshmisc
sekcja „ZADANIA”. Te powiadomienia nie są wyświetlane, gdy kontrola zadań jest wyłączona.Grzmotnąć
Wygląda na to, że Bash zawsze wyświetla np
[1] 25647
. „Ostateczne powiadomienie” np.[1]+ Done true
Nie jest wyświetlane, gdy kontrola zadań jest wyłączona.Kontrola zadań wyłączona
Wniosek
Nie wiem, czy wyłączenie kontroli zadań w celu ukrycia powiadomień jest dobrą rzeczą?
Zasoby
man 1 zshmisc
, sekcja PRACA.man 1 zshoptions
.źródło
Możesz wywołać
zsh
jako nieinteraktywną powłokę, aby wyłączyć powiadomienia o zadaniach.źródło
Zobacz następujący przykład:
To działa dobrze. Nie ma potrzeby
( )
: tworzy niepotrzebną podpowłokę.{ }
to tylko polecenia grupujące.źródło
[2] 49591
a[2] + 49591 exit 1 find /usr
kiedy nie powinno drukować żadnego z nich!To stare pytanie, ale możliwą odpowiedzią (w bash, nie testowane z zsh) jest użycie kontroli zadań w podpowłoce:
(command & wait)
Uwaga: bash pomija początkowe / końcowe komunikaty zadań w tle w podpowłoce i nie ma potrzeby przekierowywania.
źródło
(sleep 5 & wait)
opóźnia 5 sekund.