编辑:
我在下面关于 sed 's@^@ @' <(f1)
不正确的评论虽然$BASH_SUBSHELL
表明我们与启动处于同一级别,但变量在主脚本中丢失了。根据戈登斯的回答,我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)
我想知道为什么左侧与主脚本不在同一级别