come interrompere bash dalla printing degli avvisi?

Quando si uccide un process con kill -9 $PID &>/dev/null in uno script, un messaggio viene ancora printingto al terminal dopo che termina il command successivo. Come si arresta questo comportmento?

Per esempio

 while true; do /usr/bin/dostuff -a -b -c PID=$(pidof -o %PPID /usr/bin/dostuff) sleep 1; kill -KILL $PID &>/dev/null echo "hello" done 

stamperà qualcosa di simile

 hello ./my-cript.sh: line 12: 7134 Killed /usr/bin/dostuff -a -b -c 

Quando voglio solo printingre "ciao"

EDIT: La soluzione pulita è quella di eseguire il programma in un sottofondo o di disconnetterlo.

 #SOLUTION while true; do /usr/bin/dostuff -a -b -c & disown PID=$! sleep 1; kill -KILL $PID &>/dev/null echo "hello" done 

Le linee di output non vengono reindirizzate a / dev / null perché non sono STDOUT / STDERR dal process di uccisione . Viene generata dai meccanismi di controllo dei lavori della shell.

Se si utilizza bash , è ansible eseguire un disapprovazione immediatamente dopo l'invocazione del process:

 while true; do /usr/bin/dostuff -a -b -c ### remove from shell job table disown PID=$(pidof -o %PPID /usr/bin/dostuff) sleep 1; kill -KILL $PID &>/dev/null echo "hello" done 

Ho provato questo in bash v3.2.39 su Debian Lenny, con /bin/sleep 10 & al posto del command precedente /usr/bin/dostuff :

 ./tmp.sh hello hello hello hello ^C 

Il reindirizzamento degli errori è inefficace poiché questo messaggio non viene printingto dall'uccello; viene printingto dalla shell quando il lavoro di background termina (suppongo che un & manca).

Puoi evitare questo da eseguire in una sottofondo, utilizzando parentesi (ma sappiate di altri problemi potenziali):

 while true; do ( /usr/bin/dostuff abc & PID=$! sleep 1 kill -9 $PID ) echo hello done 

Potresti fare set -b e installare una trappola su SIGCHLD. Penso che il gestore SIGCHLD predefinito è quello che (immediatamente) stamperà lo stato del lavoro al terminal quando hai set -b . Qui saresti sopraffina.