如果没有xargs的参数,请尽早退出管道

时间:2018-09-26 01:56:59

标签: bash shell unix pipe xargs

说我有这个管道:

pgrep -P $$ | xargs kill -INT; sleep 0.6; pgrep -P $$ | xargs kill -9; 

我想做的是避免在没有xargs参数的情况下进行sleep调用。

类似这样的东西:

pgrep -P $$ | (exit if no args) | xargs kill -INT; sleep 0.6; pgrep -P $$ | xargs kill -9; 

我怎样才能做到这一点?我不想弄乱管道并得到奇怪的错误。

2 个答案:

答案 0 :(得分:2)

GNU xargs具有专门用于此用例的-r选项。您将不得不稍微重构脚本。我只会跟着去

pgrep -P $$ | xargs -r kill -INT
( sleep 0.6; pgrep -P $$ | xargs -r kill 9 ) &

如果第一个命令设法杀死所有子进程,那么第二个命令将最终变成无操作。

这不能移植到* xargs缺少此选项的* BSD上。

答案 1 :(得分:1)

此处要处理的数据量(PID列表)很小,因此您不需要管道和“ xargs”。试试:

if childpids=$(pgrep -P $$) ; then
    kill -INT $childpids
    sleep 0.6
    childpids=$(pgrep -P $$) && kill -9 $childpids
fi

ShellCheck抱怨$childpids上缺少引号,但是在这种情况下省略引号是无害的,添加它们是错误的。

相关问题