编辑:
我下面关于 sed 's@^@ @' <(f1)
的评论是不正确的。虽然$BASH_SUBSHELL
表示我们与启动程序在同一级别,但变量在主脚本中丢失了。
根据Gordon的答案,我测试了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)
来避免这种情况,但我仍然想知道为什么左侧不在与主脚本相同的级别上。