在bash中退出管道
对于以下bash语句:
tail -Fn0 /tmp/report | while [ 1 ]; do echo "pre"; exit; echo "past"; done 我得到了“pre”,但没有退出bash提示符,然后如果我在/ tmp / report中输入内容,我可以退出这个脚本并进入bash提示符. 我认为这是合理的. ‘exit’使’while’语句退出,但’tail’仍然活着.如果输入到/ tmp / report中的内容,’tail’将输出到pipe,那么’tail’将检测到管道是否关闭,然后’tail’退出. >我说得对吗?如果没有,有人会提供正确的解释吗? 解决方法
你可以(不可靠)逃脱杀死进程组:
tail -Fn0 /tmp/report | while : do echo "pre" sh -c 'PGID=$( ps -o pgid= $$| tr -d ); kill -TERM -$PGID' echo "past" done 这可能会将信号发送到比您想要的更多的进程.如果在交互式终端中运行上述命令,您应该没问题,但在脚本中,完全有可能(实际上可能)进程组将包含运行该命令的脚本.为避免发送信号,最好在后台启用监控并运行管道,以确保为管道形成新的流程组: #!/bin/sh # In Posix shells that support the User Portability Utilities option # this includes bash & ksh),executing "set -m" turns on job control. # Background processes run in a separate process group. If the shell # is interactive,a line containing their exit status is printed to # stderr upon their completion. set -m tail -Fn0 /tmp/report | while : do echo "pre" sh -c 'PGID=$( ps -o pgid= $$| tr -d ); kill -TERM -$PGID' echo "past" done & wait 请注意,我用while替换了while [1]:因为虽然[1]风格很差. (它的行为与while [0]完全相同). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |