在 Bash 中为什么 echo hello | read myvar && echo $myvar 不输出? Zsh 工作正常

在 Bash 中为什么 echo hello | read myvar && echo $myvar 不输出? Zsh 工作正常

myvar我完全不明白为什么 Bash在这个例子中不具有 的价值。

 echo hello | read myvar && echo $myvar

我会理解,如果我将该命令作为两个单独的命令运行,那么第二行将不存在变量的范围。

答案1

管道进程在子 shell 中运行,子进程不可能影响其父进程的环境(当子进程终止时,它们自己的环境也会消失)。在您的示例中,read myvar在子 shell 中运行 - 设置了 myvar,但不会(不能)传播回运行这两个echo语句的父 shell。

您需要使用此处的字符串或重定向,并且流程替代而不是管道。例如:

这里的字符串:

$ read myvar <<<"hello" && echo $myvar
hello

该字符串可以是固定字符串或变量或两者的组合:

$ read myvar <<<"Hello $USER, your home is $HOME" && echo $myvar
Hello cas, your home is /home/cas

重定向和进程替换:

$ read myvar < <(echo hello) && echo $myvar
hello

也可以看看: 为什么我的变量在一个“while read”循环中是本地变量,但在另一个看似相似的循环中却不是?

相关内容