一般化する:Stdout StderrがいるかのようにStdstatusを作成したいです。 Stdoutは配列に保存でき、Stdstatusはユーザーに印刷できます。私はstderrが他のメッセージにも使用できることを知りませんでした。しかし、Stdstatusを実装するためにそれが可能でしょうか?
私は持っています:
SomeFunction(){
PrintForArray
echo "Status"
}
mapfile -t SomeArray < <(SomeFunction)
の出力PrintForArray
はに保存されますが、一部はコマンドラインにもSomeArray
印刷したいと思います。配列に保存しないでStatus
ください。Status
どんな提案がありますか?
メモ:
これは便利です。スクリプトで「3>&1 1>&2 2>&3」は何をしますか? - UnixとLinuxスタックの交換しかし、その機能の使い方がわかりません。
状態はユーザーが読むことができるようになっています。
ログファイルに保存することも、保存しない場合もあります(両方の提案を歓迎)。
状態がエラーではないので、stderrに送信したくありません。ただユーザーが何が起こっているのかを知りたいです!
ベストアンサー1
mapfile
読むみんなstdinを配列に追加するため、関数のstdoutを使用して「ステータス」などのメッセージを表示することはできません。
次のようにしてみてください。
$ cat map.sh
#!/bin/bash
exec 3>&1
SomeFunction(){
printf "%s\n" {0..3}
echo "Status" >&3
}
mapfile -t SomeArray < <(SomeFunction)
declare -p SomeArray
説明する:
まず、スクリプトは標準出力を
&3
。mapfile
実行されると、プロセスの代替標準出力から標準入力を読み込みます。&3
はい影響を受けなかったプロセス置換を使用すると、関数はsoを引き続き使用でき、スクリプトの元の標準出力(ttyやスクリプト出力がリダイレクトされる場所)はリダイレクトされず、引き続き参照されます。SomeFunction
(リダイレクトされた)stdoutとして印刷するのではなく、ステータスメッセージを&3として印刷します。
出力:
$ ./map.sh
Status
declare -a SomeArray=([0]="0" [1]="1" [2]="2" [3]="3")
ちなみに、標準出力で印刷するよりも「&3」を使ってよりクールな作業を行うには、次のものが必要です。exec
声明ファイルや名前付きパイプなどにリダイレクトします。
たとえば、次のいずれかの方法を試してみると、リダイレクトできないことがわかります&3
。遅すぎました。すでにスクリプトの生の標準出力に移動しました。
mapfile -t SomeArray < <(SomeFunction) > /dev/null
mapfile -t SomeArray < <(SomeFunction) 3> /dev/null