实际工作中的 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



