Pan*_*dey 3 shell pipe subshell
我有下面的shell脚本
var="this is a test"
ls -ltr| while read file
do
echo $var
done
echo $var
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
this is a test
this is a test
this is a test
Run Code Online (Sandbox Code Playgroud)
我如何在 while 循环中将变量“var”的值设置为“这是一个测试”,因为管道将产生一个新的子外壳,而且我也没有在主外壳中导出我的“var”变量?
据我所知,为了让孩子从父 shell 继承变量值,我们需要导出变量,但在这种情况下,变量值在没有“导出”语句的情况下被继承。
来看看Bash手册是怎么说的(3.7.3命令执行环境)
shell 有一个执行环境,它由以下部分组成:
- 通过变量赋值或设置或从环境中的 shell 父级继承的shell 参数
- 在执行期间定义的或从环境中的 shell 的父级继承的 shell 函数
命令替换、用括号分组的命令和异步命令在与shell 环境重复的子 shell 环境中调用[...]
对子shell 环境所做的更改不会影响shell 的执行环境。
管道中的每个命令都在其自己的子 shell 中执行
(当然这只适用于多命令管道)
因此,管道的各个部分以及其他子 shell 会获得所有shell 变量的副本,但对它们的任何更改对于外部 shell都是不可见的。
对于其他命令,您仍然需要export
:
当要执行除内置函数或 shell 函数之外的简单命令时,它会在包含以下内容的单独执行环境中调用。
- 标记为 export 的 shell 变量和函数,以及为命令导出的变量,在环境中传递
深思熟虑:这打印了什么?
bash -c 'f() { echo "$a $b"; }; a=1; b=1; (b=2; f); f'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1333 次 |
最近记录: |