はじめに
以下のような変数への格納と標準出力を、同時に行う方法を調べてみました。
$ var=hello
$ echo $var
hello
結論
tee
コマンドと、端末/dev/tty
を使用します。
$ var=$(echo "hello" | tee /dev/tty)
hello
$ echo $var
hello
詳細
tee
tee
コマンドは、リダイレクトされた内容を、引数のファイルや変数にコピーするコマンドです。
# helloを hello.txt にコピー
$ echo "hello" | tee hello.txt
hello
$ cat hello.txt
hello
tee
(T)という名前は、このスキームに由来するそうです (下図がT
のように見えることから)
引用: https://en.wikipedia.org/wiki/Tee_(command)
/dev/tty
/dev/tty
は現在のプロセスの制御端末を指します。
そのため、/dev/tty
になにかを入力すると、現在の端末に出力されます。
$ echo 1 > /dev/tty
1
この 2 つを合わせることで、変数への格納と標準出力を同時に行います。
$ echo "hello" | tee /dev/tty
hello # echo "hello" の出力結果
hello # tee で /dev/tty にコピーされ、現在の端末に出力されたもの
# echo "hello" の出力結果が、$var に格納される
$ var=$(echo "hello" | tee /dev/tty)
hello # tee で /dev/tty にコピーされ、現在の端末に出力されたものは、変化なし