2017-04-19 52 views
0

如何在函數中執行dialog,以便另一個函數可以使用它的結果?如何執行命令對話框並將其結果用於其他功能?重點原因?輸出原因?

function a(){ 

echo IN A 

     TMPFILE=$(mktemp) 

     dialog --nocancel --no-lines --no-button --no-description --menu " -" 20 50 8 \ 
     `echo "$*" | sed 's/^\(.*\)$/\1 ·/g'` 2>$TMPFILE 
     clear 
     cat $TMPFILE 
} 

function b(){ 

    echo IN B 
    a $* | sed 's/\(.*\)/oo\1oo/g' 
} 

echo IN PROG 
b $* 

要執行它,我跑:

./aaaa.sh ff1 dd2 ee33 ff66 ll11 

而結果如下。它不顯示對話框,但它應該有很多空行。

IN PROG 
IN B 
ooIN Aoo 

oo 













ff1oo 

我試圖與$(a $*)或`一個$ *`來執行它,但沒有成功

+1

不會對話框打開一個新的屏幕並在完成時將其關閉,因此當屏幕完成時您只剩下該屏幕的空間。很確定它的工作方式與使用'tcup smcup'和'tput rmcup'相同。 – 123

+0

好點。爲什麼它不打開一個新的屏幕然後關閉它? – Cedric

回答

1

在你的函數「B」的一切,是在標準輸出從「A」發送到「 SED」。這意味着「對話框」和「貓」都將其標準輸出重定向到「sed」,這會將其以當前形式分解。

這裏是固定的版本:

function a(){ 
    echo IN A 

    TMPFILE=$(mktemp) 

     dialog --nocancel --no-lines --no-button --no-description --menu " -" 20 50 8 \ 
     `echo "$*" | sed 's/\([^[:space:]]\+\)/\1 ·/g'` >&2 2>$TMPFILE 
     clear 
     cat $TMPFILE 
} 

function b(){ 

    echo IN B 
    a $* | sed 's/\(.*\)/oo\1oo/g' 
} 

echo IN PROG 
b $* 

訣竅,使其工作是不會有「對話框的」標準輸出(形式)發送功能從「B」到「sed的」。爲了達到這個目的,我將標準輸出「對話框」重定向到與當時錯誤輸出相同的位置(我們稱之爲錯誤屏幕),然後將錯誤輸出重定向到文件,但這不會影響標準輸出的位置重定向到(錯誤屏幕)。

我也修改了sed的reg-exp,因爲echo "$*"只會輸出一行,我以爲你想添加一個「。」在每個參數傳遞給腳本之後,並非在所有腳本之後。

+0

謝謝你這個高質量的答案 – Cedric