パイプの出力を変数に入れようとしています。私は以下を試しました:
echo foo | myvar=$(</dev/stdin)
echo foo | myvar=$(cat)
echo foo | myvar=$(tee)
しかし、$myvar
それは空でした。
私はしたくありません:
myvar=$(echo foo)
サブシェルを作成したくないからです。
どんなアイデアがありますか?
編集する:パイプの前のコマンドを使用するにはグローバル変数を編集する必要がありますが、サブシェルではこれを実行できないため、サブシェルを作成したくありません。できますか?状況はecho
単純化するためのものです。それは次のとおりです。
complex_function | myvar=$(</dev/stdin)
なぜこれがうまくいかないのか分かりません。たとえば、次のようになります。
complex_function | echo $(</dev/stdin)
ベストアンサー1
正しい回避策は、次のコマンド置換を使用することです。
variable=$(complex_command)
良い
message=$(echo 'hello')
(またはmessage=hello
この場合)。
あなたのパイプライン:
echo 'hello' | message=$(</dev/stdin)
または
echo 'hello' | read message
実際に動作します。唯一の問題は、サブシェルがパイプラインの2番目の部分を実行するシェルを使用していることです。パイプが終了すると、サブシェルが破壊されるため、値は$message
シェルに保持されません。
ここでどのように動作するかを確認できます。
$ echo 'hello' | { read message; echo "$message"; }
hello
...しかし、サブシェルの環境は独立しているので(そして消えます):
$ echo "$message"
(出力なし)
ksh93
1つのソリューションは、よりスマートなソリューションに切り替えることです。
$ echo 'hello' | read message
$ echo "$message"
hello
別の解決策はシェルオプションをbash
設定することです。lastpipe
これにより、パイプラインの最後の部分が現在の環境で実行されます。ただし、lastpipe
ジョブ制御を有効にしてはいけないため、対話型シェルでは機能しません。
#!/bin/bash
shopt -s lastpipe
echo 'hello' | read message
echo "$message"