说我有这个管道:
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;
我怎样才能做到这一点?我不想弄乱管道并得到奇怪的错误。
答案 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
上缺少引号,但是在这种情况下省略引号是无害的,添加它们是错误的。