为什么在通过管道传输时没有将值分配给变量。例如:
a=15|echo $a
尝试将命令分组{}
并将其传递给管道,但在{}
管道之后的命令无法使用初始化的值。
答案1
该命令没有什么意义,因为赋值不会产生任何输出,也echo
不会从其标准输入中读取。
反而:
a=15; printf '%s\n' "$a"
除此之外,管道的两个部分都在不同的环境中运行,因此设置a
左侧不会影响a
管道右侧的值。
例子:
{ a=15; printf 'on the left:\ta=%s\n' "$a"; } | { cat; printf 'on the right:\ta=%s\n' "$a"; }
输出:
on the left: a=15
on the right: a=
...假设a
在执行上述操作之前没有任何价值。如果有,右侧就会获取该值。设置管道任一部分的值不会改变a
周围环境中的值。
如果lastpipe
已设置 shell 选项和shell 在没有作业控制的情况下运行(就像它是非交互式脚本一样),然后管道的最后一部分将在与周围脚本相同的环境中运行。这意味着那里的分配将在管道中“生存”:
#!/bin/bash
shopt -s lastpipe
a=10
printf 'LHS: a=%s\n' "$a" | { cat; printf 'RHS: a=%s\n' "$a"; a=30; }
printf 'a is now %s\n' "$a"
输出:
LHS: a=10
RHS: a=10
a is now 30
删除shopt -s lastpipe
:
LHS: a=10
RHS: a=10
a is now 10
答案2
你的例子没有意义,但让我举一个更好的例子:
echo foo | read REPLY
pipes
是一个 shell 构造,它可能工作(按照您可能期望的方式),也可能不工作,因为 POSIX 不授予在 shell 中设置的特定方式。
我的示例将有foo
in$REPLY
如果您尝试使用bosh
,ksh93
或,并且在其他 shell 上zsh
会有一个空。REPLY
这是因为bosh
,ksh93
并且zsh
在主 shell 中运行管道最右边的程序(如果它是内置 shell),而其他 shell 总是在子 shell 中运行最右边的程序,该子 shell 读取回复然后立即终止。