[英]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.