Ранний выход из конвейера, если нет аргументов для xargs - PullRequest
0 голосов
/ 26 сентября 2018

Скажем, у меня есть этот конвейер:

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

Что я хочу сделать, это избежать вызова сна, если нет аргументов для xargs.

Примерно так:

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

Как я могу сделать это чисто?Я не хочу портить конвейер и получать странные ошибки.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Объем обрабатываемых здесь данных (список PID) крошечный, поэтому вам не нужны каналы и 'xargs'.Попробуйте:

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

ShellCheck жалуется на пропущенные кавычки на $childpids, но в этом случае их безобидно опускать, и было бы неправильно добавлять их.

0 голосов
/ 26 сентября 2018

GNU xargs имеет опцию -r специально для этого случая использования.Вы должны будете немного реорганизовать скрипт;Я бы просто сказал:

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

Вторая команда просто перестанет работать, если первой удастся уничтожить все подпроцессы.

Это не переносимо на * BSD и т. Д.где xargs не имеет этой опции.

...