Rakesh.N Asked: 2018-06-30 02:49:53 +0800 CST2018-06-30 02:49:53 +0800 CST 2018-06-30 02:49:53 +0800 CST 变量赋值在管道中不起作用 772 为什么在管道传输时不将值分配给变量。例如: a=15|echo $a 尝试将命令分组{}并将其传递给管道,但{}在管道之后的命令不能使用初始化的值。 bash pipe 2 个回答 Voted Best Answer Kusalananda 2018-06-30T04:30:26+08:002018-06-30T04:30:26+08:00 该命令没有什么意义,因为赋值不会产生任何输出,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 schily 2018-06-30T05:34:52+08:002018-06-30T05:34:52+08:00 你的例子没有意义,但让我举一个更好的例子: echo foo | read REPLY 是一个 shell 结构,可能工作(你可能期望的方式)或不工作,因为 POSIX 没有授予pipes在 shell 中设置的特定方式。 如果您尝试使用,我的示例将有fooin ,或者在其他 shell 上会有一个空的。$REPLYboshksh93zshREPLY 这是因为bosh,ksh93并zsh在主 shell 中运行管道最右边的程序,以防它是内置的 shell,而其他 shell 总是在读取回复然后立即死亡的子 shell 中运行最右边的程序。
该命令没有什么意义,因为赋值不会产生任何输出,
echo
也不会从其标准输入中读取。反而:
除此之外,管道的两个部分都在不同的环境中运行,因此设置
a
在左侧不会影响a
管道右侧的值。例子:
输出:
...假设
a
在执行上述操作之前没有任何价值。如果有,右手边就会得到那个值。在管道的任一部分设置值都不会改变a
周围环境中的值。如果
lastpipe
设置了 shell 选项并且shell 在没有作业控制的情况下运行(就像它是非交互式脚本一样),那么管道的最后一部分将在与周围脚本相同的环境中运行。这意味着那里的分配将“生存”管道:输出:
删除
shopt -s lastpipe
:你的例子没有意义,但让我举一个更好的例子:
是一个 shell 结构,可能工作(你可能期望的方式)或不工作,因为 POSIX 没有授予
pipes
在 shell 中设置的特定方式。如果您尝试使用,我的示例将有
foo
in ,或者在其他 shell 上会有一个空的。$REPLY
bosh
ksh93
zsh
REPLY
这是因为
bosh
,ksh93
并zsh
在主 shell 中运行管道最右边的程序,以防它是内置的 shell,而其他 shell 总是在读取回复然后立即死亡的子 shell 中运行最右边的程序。