1. ホーム
  2. bash

[解決済み] 標準出力を変数に取り込み、コンソールに表示する。

2023-06-18 03:17:23

質問

いくつかの長時間実行するプロセスを呼び出すbashスクリプトを持っています。 処理上の理由から、これらの呼び出しの出力を変数に取り込みたいと考えています。 しかし、これらは長く実行されているプロセスであるため、私は rsync 呼び出しの出力をコンソールに表示するために リアルタイム で、事後ではなく、コンソールに表示されることを望みます。

この目的のために、私は が見つかった という方法がありますが、これはテキストを /dev/stderr に出力することに依存しています。 dev/stderr に出力するのは、あまり良い方法ではない気がします。

VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee /dev/stderr)

VAR2=$(rsync -r -t --out-format='%n%L' --delete -s /path/source1/ /path/target1 | tee /dev/stderr)

VAR3=$(rsync -r -t --out-format='%n%L' --delete -s /path/source2/ /path/target2 | tee /dev/stderr)

上の例では、rsyncを何度か呼び出しているので、処理されるファイル名を見たいのですが、最終的には、後で解析するので、やはり変数に出力してほしいのです。

これを達成するための「よりクリーンな」方法はありますか?

もし違いがあるとすれば、私はUbuntu 12.04、bash 4.2.24を使用しています。

どのように解決するのですか?

シェルの中で &1 を複製し(私の例では 5)、サブシェルで &5 を使用します(親シェルの標準出力(&1)に書き込むようにします)。

exec 5>&1
FF=$(echo aaa|tee >(cat - >&5))
echo $FF

aaaを2回表示します。1回目はサブシェルでechoされたためで、2回目は変数の値を表示します。

あなたのコードでは

exec 5>&1
VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee >(cat - >&5))
# use the value of VAR1