コマンドは標準出力にアクセスできません。

コマンドは標準出力にアクセスできません。

私は次のコマンド形式を使用しています。

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.shstderrと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

おすすめ記事