2017-01-26 58 views
2

不运行命令我有一个包含以下bash脚本:庆典按顺序

MY_COMMAND="MY_PWD=`pwd`; export MY_PWD; MY_PWD_BASENAME=`basename $MY_PWD`; echo $MY_PWD_BASENAME"; export MY_COMMAND 

当我从终端源脚本,我得到以下错误:

basename: missing operand 
Try `basename --help' for more information. 

这表示MY_COMMAND中的命令不按顺序执行。 这里发生了什么?

+0

是'FOO = “CMD1,CMD2”'会执行任何命令? – hek2mgl

+5

使用功能。不要将命令放入变量中。使用功能。 – chepner

+0

@hek2mgl尝试一下,你会发现它确实执行了这些命令。问题是为什么它不能顺序执行它们? – Morad

回答

5

以下行:

MY_COMMAND="MY_PWD=`pwd`; export MY_PWD; MY_PWD_BASENAME=`basename $MY_PWD`; echo $MY_PWD_BASENAME" 

执行以下命令(因为你可能会认为):

MY_PWD=`pwd` 
export MY_PWD 
MY_PWD_BASENAME=`basename $MY_PWD` 
echo $MY_PWD_BASENAME" 

相反,它会扩大command substitutions

`pwd` 
`basename $MY_PWD` 

并用它们的输出替换它们。由于$MY_PWD没有设置,basename将得到不必需的参数执行,如:

basename 

这导致错误。


修复:我建议使用$()而不是反引号的命令替换。一个好处是,你可以嵌套他们:

MY_COMMAND="MY_PWD=$(pwd); export MY_PWD; MY_PWD_BASENAME=$(basename "$(pwd)"); echo $MY_PWD_BASENAME" 

然而,这只是语法修复。一般来说,我推荐使用的功能像@chepner suggested

lib.sh

function basename_pwd() { 
    basename "$(pwd)" 
} 

使用功能:你为什么想到

#!/bin/bash 
source "lib.sh" 
basename_pwd 
+0

明白了。谢谢! – Morad