bash不按顺序运行命令

时间:2017-01-26 15:40:13

标签: bash command-substitution

我有一个包含以下内容的bash脚本:

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

当我从终端获取脚本时,出现以下错误:

MY_COMMAND

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

1 个答案:

答案 0 :(得分: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