我有一个包含以下内容的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"
相反,它将扩展命令替换
`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建议的功能
lib.sh
function basename_pwd() { basename "$(pwd)" }
使用功能:
#!/bin/bash source "lib.sh" basename_pwd