1. 简介
dirname 命令读取指定路径名删除最后一个“/”(斜杠)及其后面的字符,保留其他部分,并写结果到标准输出。如果最后一个“/”后无字符,dirname 命令使用倒数第二个“/”,并忽略其后的所有字符。
示例:
1) dirname /etc/init.d/acpid -> /etc/init.d
2) dirname /etc/init.d/ -> /etc
3) dirname /etc/init.d -> /etc
4) dirname stdio.h -> .
5) dirname dir1/str dir2/str -> "dir1" followed by "dir2"
2. 实例
在很多shell脚本中,经常可以看到下面的语句
rootDir=$(cd $(dirname $0); pwd)
这个语句的作用是获取shell脚本所在目录的绝对路径,这个语句怎么理解?为什么不直接用pwd来获取当前路径呢?
"."表示当前路径
$0,这是bash shell脚本中的位置参数,用来表明输入到命令行中的命令本身。
其余的还有$1,$2等等,分别表示输入到命令行中的命令后面带有的第一个参数和第二个参数
bash test.sh 10 9
其中的$0就是test.sh,10和9分别是$1和$2。
pwd,这个命令就是打印当前的绝对路径。
为什么不用pwd?
请注意基本事实
调用shell脚本,就是在调用脚本的当前目录下,逐行执行脚本中的每一个命令。
修改上面的脚本如下
#/bin/bash
rootDir=$(cd $(dirname $0); pwd)
echo "rootDir $rootDir"
echo "pwd $pwd"
并且在~/lyq下输入命令code/test.sh来运行这个脚本,输出结果如下
usr@opensuse:~/lyq$ code/test.sh
rootDir /home/usr/lyq/code
pwd /home/usr/lyq
第2个pwd不是脚本所在的目录,而是我们输入命令的目录。正如那个基本事实所示,在该目录下运行该脚本相当于逐行敲入脚本中每一句之后执行,所以在~/lyq调用脚本中的pwd,就相当于在该目录下敲入pwd,因此结果就是当前路径。
之所以不能直接使用pwd获取脚本所在目录,是因为如果在脚本目录之外调用该脚本,返回的是调用命令所在的目录而不是脚本所在目录。
3. 拓展
#/bin/bash
topDir = $(cd $(dirname $0); cd ../; pwd) #获取当前路径,切换路径,并打印
echo topDir
$(topDir)/Build/build_app.bat