Bashでは、パイプが値を設定しなかった後に読み込みます。

Bashでは、パイプが値を設定しなかった後に読み込みます。

kshの場合、値を区別するための便利な方法としてreadを使用します。

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
2 1
$

しかし、Bashでは失敗します。

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
  
$

マニュアルページで失敗の理由が見つかりませんでした。どんなアイデアがありますか?

ベストアンサー1

bash パイプラインの右側を実行します。サブシェルのコンテキストしたがって、変数への変更(完了した操作read)は維持されません。コマンドの最後にサブシェルが保存されると消えます。

代わりに、次のものを使用できます。プロセスの交換:

$ read a b dump < <(echo 1 2 3 4 5)
$ echo $b $a
2 1

この場合、readデフォルトシェルで実行され、出力生成コマンドはサブシェルで実行されます。<(...)文法作るreadサブシェルを作成し、出力をパイプに接続して通常の入力にリダイレクトします。<仕事readメインシェルで実行されているため、変数が正しく設定されています。

コメントで指摘したように、実際に文字列を何らかの方法で変数に分割することが目標である場合は、次のようになります。ここにある文字列:

read a b dump <<<"1 2 3 4 5"

やるべきことがあると思いますが、そうでない場合はこれがより良い選択です。

おすすめ記事