2011-05-12 56 views
0

我有一個殼變種名爲$ JOB_COMMAND具有命令來啓動一個映射精簡工作,像這樣:不需要的問題點這個shell腳本行有什麼問題?

[email protected]:/scriptpath# echo $JOB_COMMAND 
/var/elastic-mapreduce/elastic-mapreduce --create 
    --name 'Extrabux-MapReduce' 
    --num-instances 16 --instance-type c1.medium --key-pair extrabux-keypair 
    --log-uri s3n://extrabux-log/ 
    --bootstrap-action "s3://extrabux-scripts/startup.sh" | 
    egrep -o 'j-[a-zA-Z0-9]+' 

顯然很多的選擇,但在一些關閉的機會內容影響答案,它包括在內。

現在,當我嘗試從變量運行的命令,我得到這個:

[email protected]:/scriptpath# $JOB_COMMAND 
Error: --output must follow one of --streaming 

但是,如果我複製和呼應命令的結果糊狀,所以我得到如下:

[email protected]:/scriptpath# /var/elastic-mapreduce/elastic-mapreduce --create 
    --name 'Extrabux-MapReduce' 
    --num-instances 16 --instance-type c1.medium --key-pair extrabux-keypair 
    --log-uri s3n://extrabux-log/ 
    --bootstrap-action "s3://extrabux-scripts/startup.sh" | 
    egrep -o 'j-[a-zA-Z0-9]+' 

j-3FV0MT3H7G21S 

正如你所看到的,命令運行併成功吐出作業ID

這是我想要做的落榜ID到另一個殼變種什麼:

[email protected]:/scriptpath# JOBID=`$JOB_COMMAND` 

任何想法爲什麼運行命令時,它是在一個變種是破的? 僅供參考,我也曾嘗試

[email protected]:/scriptpath# JOBID=$($JOB_COMMAND) 

而且也給我的錯誤

感謝您的幫助!

回答

3

的問題是變量$JOB_COMMAND展開前的管道(該|在您的示例)的解析情況。在Bash中,首先解析該行,然後展開變量,根據$IFS進行拆分,並將其替換爲命令。因此,在您的命令中,| egrep及其後的所有內容都將作爲文字參數傳遞給您的elastic-mapreduce命令;有關--output的錯誤可能是由於-o參數造成的。

由於Bash FAQ指出的那樣,你不應該存儲在變量的命令,你應該使用shell functions代替。

job_command() { 
    /var/elastic-mapreduce/elastic-mapreduce --create \ 
     --name 'Extrabux-MapReduce' \ 
     --num-instances 16 --instance-type c1.medium --key-pair extrabux-keypair \ 
     --log-uri s3n://extrabux-log/ \ 
     --bootstrap-action "s3://extrabux-scripts/startup.sh" | \ 
     egrep -o 'j-[a-zA-Z0-9]+' 
} 

現在你可以如下調用它:

JOBID=$(job_command) 

使用shell功能也允許你通過在你的指揮,你可能覺得這是有用的參數。

如果你真的想在出於某種原因變量存儲命令,你將需要使用eval,但不建議這樣做:

eval $JOB_COMMAND 
0

將更加可讀(和功能)如果

RESULT=`$JOB_COMMAND $JOB_ARGS | egrep ....` 
+0

如果在JOB_ARGS字符串參數包含嵌入可能破壞空間。最好將參數存儲在一個數組中,然後'result = $($ command「$ {args [@]}」| egrep ...)'' – 2011-05-12 20:21:31