gpt4 book ai didi

bash - 管道的左侧是子壳?

转载 作者:行者123 更新时间:2023-11-29 08:50:19 25 4
gpt4 key购买 nike

编辑:

我在下面关于 sed 's@^@ @' <(f1) 的评论是不正确的同时 $BASH_SUBSHELL表示我们和launch处于同一关卡,变量在主脚本中丢失。基于戈登的回答我测试了f1 > >(sed 's@^@ @')相反,这似乎工作正常。不过,对于第一种形式,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 's@^@ @' <(f1) 来避免这种情况我想知道为什么左边和主脚本不在同一层

最佳答案

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

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

f1
f1 | f1 | f1

echo "at end, i=$i"

它打印:

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

因为管道中对 f1 的所有 3 次调用都在子 shell 中运行。

关于bash - 管道的左侧是子壳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5760640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com