Bash 这个shell脚本行有什么问题?
我有一个名为$JOB_COMMAND的shell变量,它有启动map reduce作业的命令,如下所示:Bash 这个shell脚本行有什么问题?,bash,shell,Bash,Shell,我有一个名为$JOB_COMMAND的shell变量,它有启动map reduce作业的命令,如下所示: 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-k
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_命令
展开之前。在Bash中,首先解析行,然后展开变量,根据$IFS
拆分变量,并将其替换为命令。因此,在您的命令中,|egrep
及其后面的所有内容都作为文本参数传递给您的elastic mapreduce
命令;关于--output
的错误可能是由于-o
参数引起的
正如前面所指出的,您不应该将命令存储在变量中,而应该使用
现在你可以这样称呼它:
JOBID=$(job_command)
使用shell函数还可以将参数传递给命令,这可能会很有用
如果出于某种原因确实希望在变量中存储命令,则需要使用,但不建议这样做:
eval $JOB_COMMAND
问题是管道解析(示例中的
|
)发生在变量$JOB_命令
展开之前。在Bash中,首先解析行,然后展开变量,根据$IFS
拆分变量,并将其替换为命令。因此,在您的命令中,|egrep
及其后面的所有内容都作为文本参数传递给您的elastic mapreduce
命令;关于--output
的错误可能是由于-o
参数引起的
正如前面所指出的,您不应该将命令存储在变量中,而应该使用
现在你可以这样称呼它:
JOBID=$(job_command)
使用shell函数还可以将参数传递给命令,这可能会很有用
如果出于某种原因确实希望在变量中存储命令,则需要使用,但不建议这样做:
eval $JOB_COMMAND
如果JOB_ARGS字符串中的参数包含嵌入空格,则可能会中断。最好将参数存储在一个数组中,然后
result=$($command“${args[@]}”| egrep…)
如果JOB_args字符串中的参数包含嵌入的空格,则该参数可能会中断。最好将参数存储在数组中,然后result=$($command“${args[@]}”| egrep…