Why is “echo foo | read a ; echo $a” not working a

2019-03-13 18:10发布

I could replicate the problem with various shells under FreeBSD, GNU/Linux, and Solaris. It had me head-scratching for more than an hour, so I decided to post the question here.

标签: linux unix shell
8条回答
smile是对你的礼貌
2楼-- · 2019-03-13 18:23

I came up with a solution that doesn't hide the variable values in a subshell, and that can also work with multiple values.

set `echo foo bar`
A=$1
B=$2
查看更多
老娘就宠你
3楼-- · 2019-03-13 18:24

According to Kernighan and Pike's The Unix Programming Environment (p. 159) "none of the shell built-in commands (as opposed to the control flow primitives, like for) can be redirected with > and <", and "this might be described as a bug in the shell". This seems to explain a) why code like

ls *.c |
while read file
do
   echo $a
done

invariably works without a problem, and b) the inconsistency that redirecting from a file works.

查看更多
登录 后发表回答