加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在bash中退出管道

发布时间:2020-12-15 22:58:55 所属栏目:安全 来源:网络整理
导读:对于以下bash语句: tail -Fn0 /tmp/report | while [ 1 ]; do echo "pre"; exit; echo "past"; done 我得到了“pre”,但没有退出bash提示符,然后如果我在/ tmp / report中输入内容,我可以退出这个脚本并进入bash提示符. 我认为这是合理的. ‘exit’使’whil
对于以下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’退出.

>我说得对吗?如果没有,有人会提供正确的解释吗?
>是否可以在’while’语句中添加任何内容以立即退出整个管道语句?我知道我可以把尾巴的pid保存到一个临时文件中,然后在’while’中读取这个文件,然后杀掉尾巴.有更简单的方法吗?
>让我扩大我的问题.如果在脚本文件中使用此尾部|是否可以同时执行以下项目?
一个.如果输入Ctrl-C或发出主shell进程的信号,主shell生成的主shell和各种子shell和后台进程将退出
湾我只能在触发器情况下从尾部退出,并保留其他子进程继续运行
C.最好不要使用临时文件或管道文件.

解决方法

你可以(不可靠)逃脱杀死进程组:

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]完全相同).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读