2013-08-05 30 views
0

我已經寫了一個腳本After.sh推遲一個作業要啓動另一個正在運行的作業完成後:計劃作業一個在其他Linux後

echo "Waiting job $1 to be finished..." 
while ps -p $1 >/dev/null; do sleep 1; done ; 
echo "Job $1 finished." 
echo "Now running job ${*:2}..." 
${*:2} 
echo "Job ${*:2} finished." 

我與作業後運行它像After.sh 5327 shutdown 0關機的PC PID = 5327完成。即使我可以像After.sh "5327 5778 5935" shutdown 0那樣運行它,這樣它就會等待,直到所有的作業5327 5778和5935都先完成。

我的問題是,當我想作爲參數養活一個更復雜的工作給腳本,例如:

After.sh 5327 for f in *; do echo $f; done 

現在有一個錯誤運行:for: command not found。我試圖在腳本中替換命令${*:2}sh ${*:2}eval ${*:2},但他們失敗了(sh未能再次找到for命令,eval保持的$f整個循環的第一個值,所以打印的第一個文件的每一次名。 )

你有什麼想法如何解決它?

+0

保存複雜的命令到一個文件中,使它是可執行的,將它的路徑作爲After.sh的參數。 – choroba

+0

@choroba謝謝,我意識到這一點,但我喜歡我的腳本足夠靈活,因爲每一次我需要不同的命令 – Ali

+0

您將不得不深入引用和反斜槓。你不能用'wait'來代替嗎? – choroba

回答

2

的問題是,你是for f in *; do echo $f; done不是命令,而是它是慶典 -code,這需要一個bash解釋器來執行。

您可以通過使用eval啓動解釋:

#!/bin/sh 

PID="$1" 
shift 
JOB="[email protected]" 

echo "Waiting job ${PID} to be finished..." 
while ps -p ${PID} >/dev/null; do sleep 1; done ; 
echo "Job ${PID} finished." 
echo "Now running job '${JOB}'" 
eval ${JOB} 
echo "Job '${JOB}' finished." 

然後用單引號,應該由After評估命令,包括變量:

./After.sh 123 'for f in *; do echo $f; done'