前言
实际工作中的 shell 脚本,其所在的目录中可能包含该脚本执行所需要的文件和工具。
除非在 shell 脚本所在目录中运行脚本,否则 shell 脚本将找不到它所依赖的文件和工具。
解决方案
dirname 命令
dirname - strip last component from file name
从文件名中剔除最后一个组件,以此得到脚本所在的路径。
[root@localhost ~]# dirname /home/zzz/fwup_inband/upgrade/image.ub
/home/zzz/fwup_inband/upgrade
[root@localhost ~]#
readlink 命令
readlink - print resolved symbolic links or canonical file names
打印符号链接或规范文件名的值。实际上是为了能够通过链接文件名得到链接文件对应的真实文件名。
[root@localhost ~]# ln -s /home/zzz/fwup_inband/upgrade/image.ub image.ub.link # 建立一个链接文件名
[root@localhost ~]#
[root@localhost ~]# ll
lrwxrwxrwx. 1 root root 38 Apr 22 10:25 image.ub.link -> /home/zzz/fwup_inband/upgrade/image.ub
-rw-r--r--. 1 root root 1873 Jan 1 2019 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 Apr 12 10:48 Music
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# readlink image.ub.link # 通过链接文件找到真实文件
/home/zzz/fwup_inband/upgrade/image.ub
[root@localhost ~]#
[root@localhost ~]# readlink -f image.ub.link
/home/zzz/fwup_inband/upgrade/image.ub
[root@localhost ~]#
[root@localhost ~]# dirname `readlink -f image.ub.link` # 找到真实文件的路径
/home/zzz/fwup_inband/upgrade
[root@localhost ~]#
[root@localhost ~]#
因此,解决思路便是:
通过记录当前工作路径和脚本所在路径,我们可以进入脚本所在路径执行脚本,以便在脚本路径中找到脚本依赖的文件和工具。执行完脚本之后,再回退到当前工作路径。
[root@localhost ~]# ./xxx1/xxx2/xxx3/xxx4/test.sh
#!/bin/bash
tmp_path=`pwd` # 当前工作路径: path1
CUR_PATH=$(dirname $(readlink -f $0)) #得到 ./xxx1/xxx2/xxx3/xxx4/ 的绝对路径
cd $CUR_PATH # 进入脚本所在的路径,此时脚本所依赖的文件和工具都可以找到
# 脚本内容
....
# 脚本内容
cd $tmp_path # 回到当前工作路径: path1