如何阻止 bash 打印警报?

如何阻止 bash 打印警报?

在脚本中终止进程时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

将会打印类似

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

当我只想打印“你好”时

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

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

答案1

输出行不会重定向到/dev/null因为他们不是标准输出/标准错误来自进程。它们是 shell 的作业控制机制的输出。

如果你使用狂欢,你可以运行一个否认作业调用后立即执行:

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

我在测试过这个bash v3.2.39在 Debian Lenny 上,使用/bin/sleep 10 &以下命令代替上述/usr/bin/dostuff命令:

./tmp.sh
hello
hello
hello
hello
^C

答案2

错误重定向无效,因为该消息不是由 kill 打印的;它是在后台作业终止时由 shell 打印的(我假设缺少 &)。

您可以通过在子 shell 中运行并使用括号来避免这种情况(但请注意其他潜在问题):

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

答案3

您可以执行set -b并在 SIGCHLD 上安装一个陷阱。我认为默认的 SIGCHLD 处理程序会 (立即) 将作业状态打印到终端set -b。在这里您将覆盖它。

相关内容