回答:
bash
パイプラインの右側に実行中サブシェルコンテキストをので(何である変数を変更し、read
ない)に保存されていない-彼らは、コマンドの最後に、サブシェルがないときに死にます。
代わりに、プロセス置換を使用できます。
$ read a b dump < <(echo 1 2 3 4 5)
$ echo $b $a
2 1
この場合、read
はプライマリシェル内で実行され、出力生成コマンドはサブシェルで実行されます。<(...)
構文は、作成サブシェルを、我々はの入力にリダイレクトパイプへの出力を接続するread
通常と<
操作。read
メインシェルで実行されたため、変数は正しく設定されています。
コメントで指摘されているように、文字列を文字列を何らかの形で変数に分割することが目標であれば、here文字列を使用できます。
read a b dump <<<"1 2 3 4 5"
それ以上のものがあると思いますが、もしなければこれはより良い選択肢です。
read a b dump <<< '1 2 3 4 5'
。
cat /etc/passwd | (read -r line ; echo $line)
。ただし、次echo
は$line
パイプラインにないため、値は括弧(サブシェル)の間に存在するため、画面には何も表示されません。希望、それは誰かを助ける。
これはbash
バグであり、振る舞いのPOSIX
両方を許可するため、観察している不幸な矛盾につながります。bash
ksh
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_12
さらに、マルチコマンドパイプラインの各コマンドはサブシェル環境にあります。ただし、拡張機能として、パイプラインの一部またはすべてのコマンドを現在の環境で実行できます。他のすべてのコマンドは、現在のシェル環境で実行されます。
ただし、bash 4.2
新しいバージョンではlastpipe
、非対話型スクリプトでオプションを設定して、期待される結果を得ることができます。例:
#!/bin/bash
echo 1 2 3 4 5 | read a b dump
echo before: $b $a
shopt -s lastpipe
echo 1 2 3 4 5 | read a b dump
echo after: $b $a
出力:
before:
after: 2 1
lastpipe
は、他のシェル(ダッシュなど)では機能しないことです。そのサブシェル内のすべてを実行しているこのポータブル短いを行うには方法は基本的にありません、見stackoverflow.com/questions/36268479/...