典型错误

流传dirname $0可以获得当前脚本所在目录,实际上是错误的。

在用户的bin目录下新建测试脚本mytest.sh

snippet.bash
[yz@bogon ~]$ pwd
/home/yz
[yz@bogon ~]$ cd bin/
[yz@bogon bin]$ pwd
/home/yz/bin
[yz@bogon bin]$ vim mytest.sh

注意:/home/yz/bin已经加入了$PATH环境变量。

mytest.sh内容如下:

snippet.bash
mydir=$(cd "$(dirname "$0")"; pwd)
echo "dir: $mydir"

我们执行以下命令:

snippet.bash
[yz@bogon ~]$ cd /
[yz@bogon /]$ bash mytest.sh
dir: /

显然,输出结果不符合预期。

正确方法

修改mytext.sh

snippet.bash
mydir=$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd)
#mydir=$(cd "$(dirname "$0")"; pwd)
echo "dir: $mydir"

执行结果符合预期:

snippet.bash
[yz@bogon ~]$ cd /
[yz@bogon /]$ bash mytest.sh
dir: /home/yz/bin