2012-11-28 30 views
1

我有一個shell腳本,我想在後臺運行我的可執行文件「server」的兩個實例。但是,當我運行腳本時,出現錯誤「read:missing arguments」。當我刪除「&」以在後臺運行時,不會發生此問題,但會產生不良行爲。shell腳本打印出「讀取:缺少參數」

服務器可執行文件後面跟着成對的地址和端口,但我刪除了任何代碼檢查正確數量的參數。錯誤在哪裏被拋出,我怎樣才能使這個腳本工作?

#Location of executable. 
SERVER=server 
SERVER_NAME=`echo $SERVER | sed 's#.*/\(.*\)#\1#g'` 

$SERVER localhost 4111 localhost 4222 & 
$SERVER localhost 4222 localhost 4111 & 

echo "Press ENTER to quit" 
read 
pkill $SERVER_NAME 
+0

有沒有ne編輯使用pkill。如果你的系統支持它,只需使用'kill 0'來殺死進程組的所有成員。否則,請執行'$ SERVER ...&p1 = $ !; $ SERVER ...&p2 = $ !; ......殺死$ p1 $ p2;'(也就是跟蹤你的孩子,這樣你就可以乾淨地殺了他們。) –

+0

這個腳本是我們的教授給我們測試我們的服務器代碼的。 pkill似乎工作正常,但我的問題是爲什麼我可以運行服務器完全相同的方式(與&最後),但是當它在腳本中,它不會工作,並告訴我我失蹤參數呢? – theeggman85

+0

嘗試@桑普森的變化。我敢打賭它會起作用。祝你好運。 – shellter

回答

3

read預期變量後讀入:

read var1 

如果你只使用read,直到收到一些來自用戶的響應來阻止腳本的執行,只是使用上述建議。


而且,這可能不是你打算做什麼:

SERVER=server 
SERVER_NAME=`echo $SERVER | sed 's#.*/\(.*\)#\1#g'` 

因爲執行後,SERVER_NAME也只是串server

如果server是在命令你環境,你可能打算做的是:

SERVER_NAME=$(server | sed 's#.*/\(.*\)#\1#g'`) 
+0

這實際上是一個由教授給出的用於測試代碼的腳本,但我主要想知道爲什麼我可以用前面的「&」手動執行它,而不是在此腳本中執行它。 SERVER_NAME在那裏我假設我們是否在不同的目錄中運行腳本。 – theeggman85

+0

我嘗試使用SERVER_NAME進行更改,但它告訴我意外使用SERVER_NAME = $。 – theeggman85

+0

糟糕的三重評論,但'讀取var1'的事情做到了。謝謝! – theeggman85