繁体   English   中英

此shell脚本行有什么问题?

[英]What is wrong with this shell script line?

我有一个名为$ JOB_COMMAND的shell变量,它具有启动地图缩减作业的命令,如下所示:

user@server:/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]+'

显然,问题的重点不需要这些选项中的许多,但是包括在内的内容有时可能会影响答案。

现在,当我尝试从变量运行命令时,得到以下信息:

user@server:/scriptpath# $JOB_COMMAND
Error: --output must follow one of --streaming

但是,如果我像这样复制并粘贴回显命令的结果,则会得到以下结果:

user@server:/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放入另一个shell变量中:

user@server:/scriptpath# JOBID=`$JOB_COMMAND`

知道为什么在var中运行命令时会中断吗? 仅供参考,我也尝试过

user@server:/scriptpath# JOBID=$($JOB_COMMAND)

这也给我错误

谢谢你的帮助!

问题在于管道的解析(在您的示例中为| )在扩展变量$JOB_COMMAND之前进行。 在Bash中,首先进行行分析,然后将变量扩展,基于$IFS拆分并替换为命令。 因此,在您的命令中, | egrep | egrep及其后的所有内容均作为文字参数传递给您的elastic-mapreduce命令; 有关--output的错误可能是由于-o参数引起的。

正如Bash FAQ指出的那样,您不应该将命令存储在变量中,而应该使用Shell函数

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

管道不能那样工作。 将其分为两个命令。 哦,还有BASH FAQ条目#50

如果,它将更具可读性(和功能性)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM