到目前为止,没有任何东西是有效的,但我注意到this post 中有一些有趣的东西:
find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \;
以及this post 中有关管道和进程组的更多信息:
如果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
起初我担心会出现“终止”文本,但它不在标准输出上,因此不会妨碍:
$ 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