私は次のコマンド形式を使用しています。
cmd0 > >(cmd1) 2> >(cmd2)
Cmd2は一部のデータを処理するときにデータをzenityにエコーする必要がありますが、zenityはエコーを聞くことができません。 cmd2がによって生成されたため、エコーが失われたようです(..)
。以下に私のコードの概要を示します。ケース1と3は正常に機能します。 Zenityはケース2からエコーを受信しません。データをファイルに転送し、ケース2が正しくエコーされていることを確認しました。私は読みながらデータをzenityにエコーする方法を探しています。
function() {
while [ "$nf" -lt "$num_of_files" ]; do
((nf=$nf+1))
case "$process" in
1)
while read -d$'\r' str1; do
(commands ... )
echo "$percent_update"
done
;;
2) #feed the standout of cmd0 to cmd1 and the standerr of cmd0 to cmd2
command0 > >(command1) 2> >(command 2 ....
while read -d$'%' str1; do
percent=$(echo "$str1" | sed 's/\x08//g' | sed 's/ //g')
percent=$(scaler "$percent" "$nf" "$num_of_files")
echo "$percent_update"
echo "$percent_update" >>just to verify data exists & is good.txt
done)
;;
3)
(more commands)
echo percent
;;
esac
done | zenity --progress --percentage=0 --auto-close
}
ベストアンサー1
問題はstderrをリダイレクトしていることです。今後標準出力をリダイレクトします。切り替えると動作します。これを説明するために、次のスクリプトを検討してください。foo.sh
stderrとstdoutで印刷する:
#!/usr/bin/env bash
## foo.sh
## Print "out" to standard output
echo out
## Print "error" to standard error
echo error >&2
bar.sh
入力を読む:
#!/usr/bin/env bash
## bar.sh
read input
## Print your input
echo "bar.sh read: $input"
またこれですbaz.sh
:
#!/usr/bin/env bash
## baz.sh
read input
## Print your input
echo "baz.sh read: $input"
今、あなたがしたいように、これら3つを実行して出力をループに渡すと、期待while
どおりに機能します。
$ foo.sh 2> >(bar.sh) > >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: error
baz.sh read: out
しかし逆にすれば失敗します。
$ foo.sh > >(bar.sh) 2> >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: out