Bash
GNU 並行進度條的 Zenity 取消按鈕
正如GNU parallel 的手冊所示,您可以使用並行的 zenity 進度條:
seq 1000 | parallel -j30 --bar '(echo {};sleep 0.1)' \ 2> >(zenity --progress --auto-kill) | wc
但是,在該範例中,取消按鈕不起作用。當與更常用的命令(即非並行)一起使用時,我已經閱讀了有關此按鈕的類似問題,以及有關取消按鈕如何工作的更多見解,但這並沒有真正幫助我。Parallel 似乎以完全不同的方式使用它,我不知道如何讓那個取消按鈕停止該過程。
我主要對
2> >
和感到困惑wc
。如果我只使用 a|
代替,取消按鈕可以工作,但現在進度條走得更快並且過早完成(我猜它只顯示工作的第一個拆分部分的進度?但如果是這種情況,它應該是 30 次更快,但事實並非如此,所以我不確定)。**PS:**只是為了讓你知道,我已經在並行郵件列表中講述了這個問題。
Zenity 設計為讀取兩行,一行用於進度條,一行以“#”開頭表示進度文本:
for ((i=0;i<=100;i++));do echo "$i" # bar echo "#percent done $i" # text sleep .1 done | zenity --progress
我猜想**–bar**選項將進度寫入 stderr 但不會關閉它或不會在行尾寫入換行符。這會阻止 zenity 期待新的線路。解決方法是將換行符列印到預設為文件描述符 2 的 stderr。
seq 1000 | parallel -j30 --bar '(echo {}; echo >&2; sleep 0.1)' \ 2> >(zenity --progress --auto-kill) | wc