Bash 这个shell脚本行有什么问题?

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

我有一个名为$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-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…