bash 没有按顺序 运行 命令

bash doesn't run commands in sequential order

我有一个 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中的命令不是按顺序执行的。 这里发生了什么?

下一行:

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"

但是,这只是语法修复。通常我建议使用像

这样的函数

lib.sh

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

使用函数:

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