变量赋值在管道中不起作用

变量赋值在管道中不起作用

为什么在通过管道传输时没有将值分配给变量。例如:

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 中设置的特定方式。

我的示例将有fooin$REPLY如果您尝试使用bosh,ksh93或,并且在其他 shell 上zsh会有一个空。REPLY

这是因为boshksh93并且zsh在主 shell 中运行管道最右边的程序(如果它是内置 shell),而其他 shell 总是在子 shell 中运行最右边的程序,该子 shell 读取回复然后立即终止。

相关内容