Пока ничего не опубликовано, но я заметил кое-что интересное в этом сообщении :
find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \;
и больше информации о конвейеры и группы процессов в этой записи :
Если pid
равно 0
, то sig
отправляется каждому процессу в группе процессов вызывающего процесса.
Итак, я начал играть, и вот, на самом деле, это сработало:
$ time tar -ztf /tmp/z.txz | grep -m1 '/packagesite\.txz$'
2.2.0/FreeBSD:11:amd64/latest/packagesite.txz
53.866 real, 3.947 user, 5.119 sys
$
$ time tar -ztf /tmp/z.txz | ( grep -m1 '/packagesite\.txz$' ; kill 0 )
2.2.0/FreeBSD:11:amd64/latest/packagesite.txz
Terminated
0.008 real, 0.003 user, 0.004 sys
Сначала я волновался из-за выхода текста "Termination", но это не так на стандартный вывод, чтобы он не мешал:
$ tar -ztf /tmp/z.txz | ( grep -m1 '/packagesite\.txz$' ; kill 0 ) > z.out
Terminated
$ cat z.out
2.2.0/FreeBSD:11:amd64/latest/packagesite.txz
РЕДАКТИРОВАТЬ:
Однако я отмечаю, что это решение портит код состояния, Например:
$ tar -ztf /home/mrengert/tmp/z.txz | ( grep -m1 '/packagesite\.txz$' ; kill 0 )
2.2.0/FreeBSD:11:amd64/latest/packagesite.txz
Terminated
$ echo $?
143
Кроме того - если вы используете его в сценарии, вы должны быть осторожны с предотвращением распространения сигнала, в противном случае сценарий будет прерван. Вам нужно сделать что-то вроде этого:
#!/bin/sh
trap '' SIGTERM # ignore signal temporarily
( trap - SIGTERM ; tar -ztf z.txz | ( grep -m1 '/packagesite\.txz$' ; kill 0 ) )
trap - SIGTERM # restore signal handling