5

Bash の読み取りコマンドについて、非常に基本的なことが抜けているに違いありません。シェル プロンプトで、3 つの入力フィールドを対応する変数に割り当てることができません。

% 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
%

1行の入力を読むだけです。ループのサブプロセスが終了すると x1、x2、および x3 の値が失われるため、while ループの使用はここでは正しくありません。それらにアクセスするすべてのコードをループ本体内に配置する必要があります (そして、「明確にする」ために、おそらく最後で中断します)。これは非常にハックのようです。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」と報告します。

4

2 に答える 2

11

問題はパイプです。bash マニュアルから:

パイプライン内の各コマンドは、個別のプロセスとして (つまり、サブシェル内で) 実行されます。

逆に、つまり、read現在のプロセスを呼び出し、サブプロセスで入力を生成する必要があります。例えば:

$ read x1 x2 x3 < <(echo a b c)
$ echo $x1 $x2 $x3
a b c
于 2013-09-27T13:38:56.787 に答える
2

readbash サブプロセスで実行される bash 組み込みコマンドです。そのサブプロセス内で環境変数を設定しているため、元のプロセスで値を確認すると、何も変更されていません。

于 2013-09-27T13:42:34.910 に答える