2011-05-12 112 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