Bash:パイプの出力を変数に割り当てる

Bash:パイプの出力を変数に割り当てる

パイプの出力を変数に入れようとしています。私は以下を試しました:

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"

(出力なし)

ksh931つのソリューションは、よりスマートなソリューションに切り替えることです。

$ echo 'hello' | read message
$ echo "$message"
hello

別の解決策はシェルオプションをbash設定することです。lastpipeこれにより、パイプラインの最後の部分が現在の環境で実行されます。ただし、lastpipeジョブ制御を有効にしてはいけないため、対話型シェルでは機能しません。

#!/bin/bash

shopt -s lastpipe
echo 'hello' | read message
echo "$message"

おすすめ記事