免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9988 | 回复: 18
打印 上一主题 下一主题

【分享】任意路径执行脚本获得所执行脚本的绝对路径 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-03 11:35 |只看该作者 |倒序浏览
有少数时候,不想添加PATH,如何在脚本里面获得所执行脚本的绝对路径?

例如:
/data/test/test1/upload.sh

情况1:root@TEST:/data/test# ./test1/upload.sh
情况2:root@TEST:/home#../data/test/test1/upload.sh
情况3:root@TEST:/home# /data/test/test1/upload.sh
我们要在upload.sh里面获得upload.sh所在的绝对路径
以上3种情况我们都要想获得输出:
/data/test/test1/upload.sh

实现此功能的shell脚本如下:
######################################################
#!/bin/sh

GetRealPath()
{
        CommandPath=$0
        CurrentPath=`pwd`
        RealPath=${CommandPath}

        One=`echo ${CommandPath} |awk -F'[/]+' '{if($1 == ""){print "r"}}'`
        if [ "${One}" != "r" ]
        then
                Info=`echo ${CommandPath} |awk -F'[/]+' 'BEGIN{n=0}{for(i=1;i<=NF;i++){if($i == ".."){n=n+1}else{if($i != "" && $i != "."){printf "/%s",$i}}}}END{printf " %s",n}'`
                n=`echo ${Info} |awk '{print $2}'`

                Path1=`echo ${CurrentPath} |awk -F'/' '{for(i=1;i<=NF-'"$n"';i++){if($i != ""){printf "/%s",$i}}}'`
                Path2=`echo ${Info} |awk '{print $1}'`

                RealPath=${Path1}${Path2}
        fi
}
GetRealPath
echo ${RealPath}

######################################################

然后通过获得所执行文件的绝对路径来获得其他文件的路径,这是非常适用的!

欢迎拍砖!

[ 本帖最后由 luo339 于 2009-10-3 11:56 编辑 ]

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
2 [报告]
发表于 2009-10-03 13:54 |只看该作者
如果系统中有/proc文件系统,可以使用/proc/$$/cwd获得shell的全路径。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2009-10-03 17:25 |只看该作者
不错,感谢分享。

论坛徽章:
0
4 [报告]
发表于 2009-10-03 21:14 |只看该作者
学习学习

论坛徽章:
0
5 [报告]
发表于 2009-10-04 09:36 |只看该作者

回复 #1 luo339 的帖子

新情况:root@TEST:/home#../data/test/../test/test1/upload.sh
运行结果就错了

论坛徽章:
0
6 [报告]
发表于 2009-10-04 12:05 |只看该作者
原帖由 marksman201 于 2009-10-4 09:36 发表
新情况:root@TEST:/home#../data/test/../test/test1/upload.sh
运行结果就错了



是的,这种特殊情况下是不行的,但实际上自己一般也不会这样写的

1.root@TEST:/home#../data/test/../test/test1/upload.sh

2.root@TEST:/home#../data/test/test1/upload.sh

1是故意绕了弯子,2和1是等价的

论坛徽章:
0
7 [报告]
发表于 2009-10-04 15:39 |只看该作者
这样太麻烦了吧。
这样就OK了

#!/bin/bash

cd `echo ${0%/*}`
abspath=`pwd`
abspath=$abspath/`basename $0`
echo $abspath

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2009-10-05 08:13 |只看该作者
研究研究!

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
9 [报告]
发表于 2009-10-05 10:34 |只看该作者
如果shell中没有改变当前路径,可以使用下面的命令获取shell全路径。
RealPath=`ls -l /proc/$$/cwd|sed 's/^.*> *//'`$0

[ 本帖最后由 syncpk99 于 2009-10-5 10:41 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-10-05 10:40 |只看该作者

回复 #9 syncpk99 的帖子

你这个得到的不是脚本所在的路径
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP