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
我有一个 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