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不是按顺序执行的。这里发生了什么?

4

1 回答 1

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"

相反,它将扩展命令替换

`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 建议的功能

库文件

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

使用功能:

#!/bin/bash
source "lib.sh"
basename_pwd
于 2017-01-26T16:00:16.877 回答