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

bash – 管道的左侧是子壳?

发布时间:2020-12-16 01:40:35 所属栏目:安全 来源:网络整理
导读:编辑: 我在下面关于sed的@ ^ @ @’(f1)的评论不正确 虽然$BASH_SUBSHELL表示我们与启动处于同一级别,但变量在主脚本中丢失. 根据戈登的回答,我测试了f1 (sed的@ ^ @ @’)相反,这似乎工作正常.不过,对于第一种形式,BASH_SUBSHELL不应该是1而不是0吗? 考虑这
编辑:

我在下面关于sed的@ ^ @ @’<(f1)的评论不正确
虽然$BASH_SUBSHELL表示我们与启动处于同一级别,但变量在主脚本中丢失.
根据戈登的回答,我测试了f1> >(sed的@ ^ @ @’)相反,这似乎工作正常.不过,对于第一种形式,BASH_SUBSHELL不应该是1而不是0吗?

考虑这个小测试

#!/bin/bash
declare -i i=0
function f1()
{
  let i++
  echo "In f1,SUBSHELL: $BASH_SUBSHELL,i=$i" >&2
}

f1
f1 | sed 's@^@     @'

echo "at end,i=$i"

具有以下输出:

In f1,SUBSHELL: 0,i=1
In f1,SUBSHELL: 1,i=2
at end,i=1

(sed的目的只是为了得到一些东西,不要指望它做什么,因为f1输出到stderr)

函数f1记录当前的BASH_SUBSHELL和i的当前值

我知道为什么在脚本结束时我们得到i = 1,因为第二次调用是在子shell中,并且子shell 1中i的值丢失了.

我不知道为什么管道的左侧没有在当前的shell中执行

虽然我认为我可以用sed的@ ^ @ @’<(f1)来避免这种情况
我想知道为什么左侧与主脚本不在同一级别

解决方法

从 bash man page开始:“管道中的每个命令都作为一个单独的进程执行(即,在子shell中).”我想可以在当前shell中执行管道的一个组件(即第一个,或者最后一个,或者可能是中间的一个),它不会像这样播放收藏夹:它们都在子shell中执行.如果您像这样修改脚本:

#!/bin/bash
declare -i i=0
function f1()
{
    let i++
    echo "In f1,i=$i" >&2
}

f1
f1 | f1 | f1

echo "at end,i=$i"

它打印:

In f1,i=2
In f1,i=1

因为管道中f1的所有3次调用都在子壳中运行.

(编辑:李大同)

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

    推荐文章
      热点阅读