shell 以任意路径执行脚本

前言

实际工作中的 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值