サブシェルなしのシェル関数の出力キャプチャ

サブシェルなしのシェル関数の出力キャプチャ

私のコンピュータに(Ruby Version Manager)をインストールしましたが、rbenv次のように動作します。

$ rbenv local
2.3.1

に書く標準出力私のローカルバージョンのRubyです。このバージョンを救出し、他の場合に再利用できるように変数に宣言したいと思います。

$ declare -r RUBY_DEFINED_VERSION=$(rbenv local)
$ echo Using ruby version $RUBY_DEFINED_VERSION
Using ruby version 2.3.1

効果がある!

しかし、使用したくないサブシェル作業を完了します($()または使用``)。私も同じように使いたいシェルtmp操作を完了するために必要なファイルです。

これを行う方法はありますか?

メモ: declare -r必須ではなく、簡単にすることができますvar=FOOBAR

ベストアンサー1

ハッキングがありますが、ループを介して実行する必要がある場合は意味があると思います。

次のように開くことができますcat coproccoproc CAT { cat; }

これにより、catバックグラウンドでコマンドが実行され、2つの環境変数(CAT_PIDおよび)が設定されますCAT。この変数は、使用されるファイル記述子(パイプ)を(順番に)含むCAT配列です。STDOUTSTDINcat

&${CAT[1]}したがって、表示されるすべての項目に出力を書き込むことができ、STDIN組み込みコマンドを使用してread読み取る変数をcatに設定${CAT[0]}できますSTDOUT

例は次のとおりです。

coproc CAT { cat; }
echo 123 >&${CAT[1]}
read myvar <&${CAT[0]}

テストするには:

echo $myvar
123

使用後は猫をブロックすることを忘れないでください。プロセスを終了したらこれを行うことができます。

kill $CAT_PID

これはパフォーマンスチューニングに大きな影響を与えます。

更新:区切り文字列をbash実装しましたnull。だからバイナリデータを扱うときはread本当に面倒です。一度に1バイトずつ読み取ることができ、nullは変数の空の文字列にLC_ALL=C read -r -n1 -d $'\0'なります。${REPLY}

おすすめ記事