如何阻止 bash 打印警报?

bri*_*ice 3 linux unix script bash process

kill -9 $PID &>/dev/null在脚本中杀死进程时,在下一个命令终止后仍会向终端打印一条消息。你如何阻止这种行为?

例如

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
Run Code Online (Sandbox Code Playgroud)

会打印类似的东西

hello
./my-cript.sh: line 12:  7134 Killed
/usr/bin/dostuff -a -b -c
Run Code Online (Sandbox Code Playgroud)

当我只想打印“你好”时

编辑: 干净的解决方案是在子shell中运行程序,或者否认它。

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

qua*_*ote 5

输出线不会被重定向到的/ dev /空,因为他们不是STDOUT / STDERR进程。它们是 shell 的作业控制机制的输出。

如果您使用的是bash,则可以在作业调用后立即运行disown

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
Run Code Online (Sandbox Code Playgroud)

我在 Debian Lenny 上的bash v3.2.39 中对此进行了测试/bin/sleep 10 &,代替了上述/usr/bin/dostuff命令:

./tmp.sh
hello
hello
hello
hello
^C
Run Code Online (Sandbox Code Playgroud)

  • 如果你运行带有尾随的 `&` 的 `dostuff`,那么你可以得到它的 pid 为 `$!`(直到你后台另一个进程)。这将为您节省`pidof` 查找...哦,是的,有人已经说过了。 (2认同)