Bash读命令在循环外不起作用

时间:2013-09-27 13:31:16

标签: bash shell input

我必须遗漏一些关于Bash读命令的非常基本的东西。在shell提示符下,无法将三个输入字段分配给相应的变量:

% echo a b c | read x1 x2 x3
% echo $x1 $x2 $x3

% 

但这有效:

% echo a b c | while read x1 x2 x3 ; do
> echo $x1 $x2 $x3
> done
a b c
%

我只需阅读一行输入。这里使用while循环是不正确的,因为当循环的子进程退出时,我丢失了x1,x2和x3的值。我必须将所有访问它们的代码放在循环体内(并且可能在最后打破,为了“清晰”),这似乎非常hackish。在if命令中使用它也可以,但是遇到与while循环相同的子进程问题:

% echo a b c | if read x1 x2 x3 ; then echo $x1 $x2 $x3; fi
a b c
% echo $x1

BASH_VERSION报告为“4.2.45(1)-release”。

2 个答案:

答案 0 :(得分:11)

问题是管道。来自bash手册:

  

管道中的每个命令都作为一个单独的进程执行(即,在   一个子壳)。

你必须做反向,即在当前进程中调用read并在子进程中生成输入。例如:

$ read x1 x2 x3 < <(echo a b c)
$ echo $x1 $x2 $x3
a b c

答案 1 :(得分:2)

read是一个bash内置命令,它在bash子进程中运行。它在该子流程中设置环境变量,因此当您检查原始流程中的值时,没有任何更改。