2012-04-30 36 views
1

我寫了一個簡單的腳本來wget和zenity會被取消:Zenity不會取消或顯示消息,因爲它沒有看到變量

#!/bin/bash 
((
    wget http://d3qnbzt7ix5jlv.cloudfront.net/ubuntu-12.04-desktop-i386.iso & export PID=$$ 
    wait $PID 
    export YES=$? 
)&) | zenity --progress --pulsate --auto-close 
if [ $? -eq 1 ]; then 
    kill $PID 
fi 
if [ "$YES" = "0" ]; then 
    zenity --info 
elif [ "$YES" = "1" ]; then 
    zenity --error 
fi 

殺不看過程$ PID。 Zenity不顯示最終窗口($ YES)。爲什麼?

+0

你正在創建了兩個子shell即「(」第一子shell,「(」第二子shell在腳本中的第一個2個字符沒有孩子。進程可以改變這個值或者在父進程中創建一個變量,對於shell也是如此,你可以在父進程中傳回一個賦值的值,即YES = $(wget ...),但是因爲你想管道可能有辦法複製輸出或使用'exec 4>&1'類型的符號爲每個進程重新分配標準輸入,但我沒有時間弄清楚它的含義你的第一句話結尾不清楚,祝你好運 – shellter

+0

我想讓shell從子shell $讀取!和$ ?. – user1365064

+0

設置了一些簡單的測試,忽略管道到zenity,你會發現你不能改變subshel​​l之間的變量值,你只能'通過cmd-substitution''返回'值,即'var = $(printf 「價值\ n」)'祝你好運。 – shellter

回答

0

這不完全是一個答案,但評論會斷章取義的代碼片段:


/usr/bin/userinstall-wget

#!/bin/sh 
# a wget wrapper to get these under a separate shell *and* progname 

[ -n "$1" -a -n "$2" ] || exit 1 

LANG=C \ 
wget -O "$1" --content-disposition --progress=bar:force:noscroll "$2" 2>&1 \ 
| stdbuf -i0 -o0 -e0 tr '>' '\n' \ 
| stdbuf -i0 -o0 -e0 sed -rn 's/^.*\<([0-9]+)%\[.*$/\1/p' 

# NB: those coughing at this particular killall are welcome with patches 
download() { 
     userinstall-wget "$outfile" "$url" | (
       trap 'killall userinstall-wget' HUP 
       zenity --progress --time-remaining --auto-close --auto-kill \ 
         --text="Wait please..." \ 
         --title="Downloading file" 
     ) 
} 

這些都被放在一起作爲一個屬於ALT的userinstall包裝腳本的一部分Linux操作系統。

HTH

PS:滴--progress=bar:force:noscroll與舊的wget