linux - 如何使 echo 与 bash 中的 read 兼容?

标签 linux bash command-line pipe echo

我尝试过这个:

qs@BF:~$ echo aaa | read c
qs@BF:~$ echo $c

它什么也没给出,这意味着 $c 是一个空宏。

但是为什么下面这个有效:

qs@BF:~$ cat trim.hs | read cc
qs@BF:~$ echo $cc
import qualified Data.Text as T

它正确地给出了trim.hs的第一行

echo 通过 read 进行管道传输时,可能会出现异常。 我对吗?您能帮助我使 echoread 兼容吗?请。

最佳答案

这些都“不起作用”

echo aaa | read c
cat trim.hs | read cc

在bash中,管道中的命令都是在子shell中执行的。因此,read 命令在子 shell 中设置变量 c ,但随后该子 shell 退出并且其环境消失

为了演示,让我们使用分组构造在子 shell 中查询 $c 的值:

unset c
echo 123 | { read c; echo in subshell: ">$c<"; }
echo in parent: ">$c<"

输出

in subshell: >123<
in parent: ><

bash 确实有一个设置,允许管道中的last 命令在当前 shell 中运行:

set +m               # job control must be disabled
shopt -s lastpipe    # enable the option
unset d
echo 456 | read d
echo ">$d<"
>456<

关于linux - 如何使 echo 与 bash 中的 read 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605800/

相关文章:

command-line - 无法将参数传递给 pentaho kjb 文件

bash - 从正常运行时间中找出平均负载

c - 结构和指针有问题(不兼容的指针类型)

java - maven shade plugin 会在 Windows 上自动缩小包名吗?

linux - 如何使用 shell 脚本执行命令并将文件存储在文件夹中?

Linux 面向行的文本文件操作

bash 方法从 csv 文件中删除最后 4 列

linux - 使用 ls 和 grep 查找可执行文件

c - 如何捕获Control+D信号?

c - 是否有预先存在的函数或代码可用于计算 POSIX 程序中的 TCP 段校验和