我试过这个:
qs@BF:~$ echo aaa | read c qs@BF:~$ echo $c
它什么都不给,这意味着$ c是一个空的macros。
但为什么下面这个工作:
qs@BF:~$ cat trim.hs | read cc qs@BF:~$ echo $cc import qualified Data.Text as T
它正确地给出了trim.hs的第一行
从命令行在Linux中连接opendocument文本文件
什么是UNIX shell脚本的Windows等价物?
如何更新Perl命令行应用程序上的进度显示?
subprocess拥有用于redirect其父进程的标准输出的文件
不能在Linux的python命令行中编辑行
有echopipe道read时有接缝是一个例外。 我对吗? 你能帮我使echo与read兼容吗? 请。
使用shell来遍历文件
这些“工作”
echo aaa | read c cat trim.hs | read cc
在bash中,管道中的命令全部在子壳体中执行。 所以, read命令在变量c 中设置了一个子shell ,但是这个子shell退出并且它的环境消失了
为了演示,我们使用一个分组结构来查询子shell中$c的值:
unset c echo 123 | { read c; echo in subshell: ">$c<"; } echo in parent: ">$c<"
in subshell: >123< in parent: ><
bash确实有一个设置允许管道中的最后一个命令在当前 shell中运行:
set +m # job control must be disabled shopt -s lastpipe # enable the option unset d echo 456 | read d echo ">$d<"
>456<
我认为这里的底层问题是read运行的子shell。这些不会(总是)将值传播到您的调用。
从POSIX read标准中 ,概述了如何在调用程序中使用子shell内的read :
如果在子shell或单独的实用程序执行环境中调用它,如下面的其中一个:
(read foo) nohup read ... find . -exec read ... ;
它不会影响调用者环境中的shell变量。
注意到这些shell提示 :
POSIX允许管道中的任何或所有命令在子shell中运行,并且在主shell中运行的命令(如果有的话)在实现之间差别很大 – 特别是Bash和ksh在这里有所不同。 克服这个问题的标准成语是使用here文件:
IFS= read var << EOF $(foo) EOF
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。