@ZEAL Blog·厉
We stand alone,
TOGETHER.

获得Shell脚本所在目录的绝对路径

Posted by zeal on 2007-04-27 19:34 , 580 characters , Via |  + 0 - 0   English
转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/497 MaDe1nZEAL
标签 ( 开发/理论 ):  , 

要得到正在执行的程序/脚本自身所存放的绝对路径,在 PHP 里面可以用 dirname(realpath(__FILE__)) ; C# 则有 System.Windows.Forms.Application.StartupPath ; java 似乎没有什么比较直接的方法,只能利用 CodeSource 来间接获取 。而在 linux shell 脚本里面如果想得到当前脚本文件存放的绝对路径,也没有太现成的命令可以调用,不过可以通过下面的语句来获取:

baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
echo "full path to currently executed script is : ${baseDirForScriptSelf}"

虽说大部分情况下我们并不需要这样的绝对路径来完成工作;但如果要把多个脚本、数据文件等内容打包作为一个整体来交付别人使用,又希望不论用户拷贝到哪个目录下执行脚本都能够正确的找到这个包里面的其他内容的话,用这样的脚本来自动定位包的根目录应该是个比较鲁棒的做法。

Last Modified on 2007-05-28 14:45
4 条评论:
- burogu () (link) 于 2007-05-03 08:43
不错
- http://zhoushuqun.com/ (link) verified2007-09-01 16:37
好东西,我用了,呵呵。刚刚正愁来着。
- baoli2008-09-19 17:22
谢谢搂主!
这个方法确实比用pwd高明太多了。

但是把他用在嵌套脚本时就会发生问题。例如我在脚本a里面调用脚本b。
脚本b:
baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
echo $baseDirForScriptSelf
脚本a:
. b.sh

最后输出的结果是脚本a的绝对路径,而不是脚本b的绝对路径。我发现问题出在$0这个地方。这个时候的$0是脚本a的路径名称。
- 线程 () (link) 于 2011-05-13 10:29
. b.sh 是将b.sh 中的内容加载到a.sh 中,当然$0就是a.sh了。
改为 ./b.sh
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | Back To Home | @ZEAL | 沪ICP备05024379号