2016-07-29 130 views
-1

我準備了一個shell腳本來運行一個Java文件。我已經給出了Java路徑,類路徑和依賴關係。我正在執行基於條件的文件。Linux shell腳本執行掛起

以下是代碼片段。代碼正在執行,但控件不會出現提示。

CMD=""$JRE_BIN_PATH/java" $SP -cp $CP org.aditya.test.MainClass "[email protected]"" 

if [ "$1" == 'server' ] && [ "$2" == 'start' ] 
then 
$CMD & 
elif [ "$1" == 'process' ] 
then 
$CMD & 
else 
$CMD 
fi 

命令,因爲它是使用在末端「&」掛起時ifelif執行。但是,如果控制權轉到其他(不包括'&')控制立即出來。我已經刪除'&',一切正常。我的問題是,CMD結束時'&'的用法是什麼。它爲什麼會導致問題。

+0

'CMD =「」$ JRE_BIN_PATH/java「$ SP -cp $ CP org.aditya.test.MainClass」$ @「」' - 在shell中引用並不像你認爲的那樣工作,那些多餘的雙引號aren不要把它變成CMD的值 – davmac

+2

可能的重複[在bash中,爲什麼shell命令在參數作爲變量傳遞給參數時忽略參數中的引號?](http://stackoverflow.com/questions/12136948/in-bash-why-do-shell-commands-ignore-quotes-in-arguments-when-the-arguments-are) – tripleee

+0

也http://mywiki.wooledge.org/BashFAQ/050 – tripleee

回答

1

基本上,&是「在後臺運行」的Linux shell標記。該任務將立即分叉然後返回。它不會訪問父進程的標準輸入和輸出。

對於需要用戶輸入的任務,您絕對不應該使用&&應保留用於後臺任務,如服務或獨立維護任務(請注意,在標準行爲下,除非使用諸如screen之類的工具,否則後臺任務可能會在終止後臺運行的父進程終止時終止

+0

你在這裏所做的一些陳述並不完全正確。 「它不會訪問父進程的標準輸入和輸出」 - 甚至不能確定你的意思,但子進程當然仍然繼承那些文件句柄,並且可以寫入與父進程相同的輸出通道。 「你永遠不應該用&需要用戶輸入的任務」 - 在一個腳本中,這可能或多或少是真實的,但是一般來說,後臺需要用戶輸入的進程是很好的;您當然需要將其前景以提供輸入。 – davmac

+0

你是部分正確的:它會繼承stdout/stderr,但不是stdin。 –

+0

同樣,這是不正確的。它肯定會繼承stdin。 – davmac