2016-07-10 56 views
0

我想調用一個shell函數,並且在此函數處理的同時,應該顯示一個zenity進度對話框。 但是,我希望將該函數的echo'ed字符串存儲在變量中以供進一步處理,以及該函數的返回碼。Zenity - 進程返回字符串和返回碼(POSIX shell)

而這一切都在POSIX shell中。

我目前的做法是這樣的:

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

您可以創建一個子shell並在其中運行命令。唯一需要注意的是,進度對話框完成後執行的命令不允許寫入標準輸出。否則,你會得到一個I/O錯誤。

你的情況,這將是這樣的:

(
    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 

我用它來創建一個小的 「GUI」 包裝到sha256sum,像這樣:

(
    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