编辑:管子的左侧是子壳?
下面关于sed '[email protected]^@ @' <(f1)
我的评论是不正确 虽然$BASH_SUBSHELL
表明我们是在同一水平发射,变量在主脚本丢失。 基于戈登答案我测试了f1 > >(sed '[email protected]^@ @')
而不是这似乎工作正常。但是,对于第一种形式,不应该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 '[email protected]^@ @'
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_SUBSH ELL和我
我知道为什么在脚本的末尾,我们得到i=1
的电流值,其因为第二次调用是在一个子shell,我在壳层1的值丢失。
什么我不知道的是,为什么管的左侧在当前shell
虽然我想,我可以sed '[email protected]^@ @' <(f1)
我想避免这种情况知道为什么左侧是未执行与主脚本不在同一级别
我觉得shell允许在子shell中有管道的两端 – sehe 2011-04-22 22:32:54
快速谷歌发现这个:http://www.linuxprogrammingblog.com/pipe-in-bash-can-be-a-trap – 2011-04-22 22:37:28
@布赖恩那篇文章没有讨论管道的左侧...我已经知道这对管道右侧的变量赋值是个坏消息 – nhed 2011-04-22 22:51:54