2016-07-10 8 views
0

シェル関数を呼び出そうとしていますが、この関数が処理する間、zenity progressダイアログが表示されます。 しかし、私はその関数のecho'ed文字列を、さらに処理するための変数とその関数の戻りコードに格納することを望みます。Zenity - progress return stringとreturn code(POSIXシェル)

これはすべてPOSIXシェルです。

私の現在のアプローチは、このようなものです:

output="$(compress "${input}" | \ 
    zenity --progress \ 
    --pulsate \ 
    --title="Compressing files" \ 
    --text="Scanning mail logs..." \ 
    --percentage=0 \ 
)"; 

if [ "$?" != "0" ]; then 
    echo "${output}" 
    exit 1 
fi 

進捗ダイアログが現れ、しかし、$outputが最後に空です。

compressの出力を取得するにはどうすればよいですか?

答えて

0

zenityこれは行いません。進捗ダイアログでは、環境に戻すのはすべて終了コードです。最後に

  • main.c
  • で使用され、
  • zenity_util_return_exit_codeを呼び出し、zenity_progress_dialog_responseに、ファイルの終わり近くに、

    • progress.c:

      あなたは、ソースコードでそれを見ることができます

    唯一のテキストは、zenityからシェルに印刷されています。これは単にGUIを更新し、進行メッセージのテキストを廃棄するだけです。例えば、zenity_progress_update_time_remaining

  • 0

    サブシェルを作成してコマンドを実行することができます。唯一の注意点は、進行状況ダイアログが終了した後に実行されるコマンドは、標準出力に書き込むことができないということです。それ以外の場合は、I/Oエラーが発生します。あなたのケースでは

    が、これは次のようになります。

    (
        HASH=$(sha256sum "$1") 
        # send EOF to end the zenity progress dialog 
        exec 1>&- 
        zenity --title="sha256sum" --info --text="$HASH" --no-wrap 
    ) | zenity --progress --title="sha256sum" --pulsate --auto-close --no-cancel 
    

    (
        output="$(compress "${input}")" 
    
        if [ "$?" != "0" ]; then 
         #echo "${output}" <- this would result in an I/O error because the pipe is closed 
         # write to somewhere else, maybe standard error like so: 
         echo "${output}" >&2 
         exit 1 
        fi 
    ) | \ 
        zenity --progress \ 
        --pulsate \ 
        --title="Compressing files" \ 
        --text="Scanning mail logs..." \ 
        --percentage=0 
    

    を私はそうのように、sha256sumする小さな "GUI" ラッパーを作成し、これを使用