Chinaunix

标题: 请教如何获得一个shell文件所在的目录 [打印本页]

作者: xaliyan    时间: 2006-08-29 10:17
标题: 请教如何获得一个shell文件所在的目录
比如我在/下执行/opt/test这个脚本,脚本中用pwd得到的是/,怎么样才能得到test这个脚本所在的位置/opt呢?
作者: wd    时间: 2006-08-29 10:21
basename?
作者: xaliyan    时间: 2006-08-29 14:45
原帖由 wd 于 2006-8-29 10:21 发表
basename?


basename 只能去掉目录的前缀,并不能得到脚本所在的真正目录。
作者: wd    时间: 2006-08-29 15:28
dirname?...
作者: xaliyan    时间: 2006-08-29 16:08
原帖由 wd 于 2006-8-29 15:28 发表
dirname?...


可能我没有把问题说清楚。举个例子

一个脚本名叫showpath.sh,位置在/opt/下

现在其它路径下(如在home下)执行该脚本,但是希望得到showpath.sh所在的路径的绝对位置即/opt,而不是当前目录/home

在脚本中使用pwd得到的是/home而不是/opt
作者: 寂寞烈火    时间: 2006-08-29 16:27

  1. #!/bin/bash
  2. echo filepath:$(dirname $(locate $0))
  3. #other cmd
  4. #
复制代码

前提条件
1,以root身分更新

  1. updatedb
复制代码

2,在profile里加入:

  1. export PATH=$PATH:/脚本所在路径
复制代码

[ 本帖最后由 寂寞烈火 于 2006-8-29 16:49 编辑 ]
作者: woodie    时间: 2006-08-29 16:45
这个问题好像以前讨论过。
我的做法是:
#!/bin/sh
cd `dirname $0`
echo `basename $0` is in `pwd`
cd -
#your code goes below
作者: FinalBSD    时间: 2006-08-29 16:46
原帖由 寂寞烈火 于 2006-8-29 16:27 发表
1,以root身分更新

  1. locatedb
复制代码
                --->updatedb

^_^

[ 本帖最后由 FinalBSD 于 2006-8-29 16:48 编辑 ]
作者: xaliyan    时间: 2006-08-29 17:00
原帖由 woodie 于 2006-8-29 16:45 发表
这个问题好像以前讨论过。
我的做法是:
#!/bin/sh
cd `dirname $0`
echo `basename $0` is in `pwd`
cd -
#your code goes below


这样就可以了, 其实不用cd, 直接
  1. shellpath=`dirname $0`
复制代码
就可以得到了。

[ 本帖最后由 xaliyan 于 2006-8-29 17:02 编辑 ]
作者: FinalBSD    时间: 2006-08-29 17:02
LZ没说明是要在CLI得到路径还是要在script中得到哦,两个的方法是不一样的
作者: 寂寞烈火    时间: 2006-08-29 17:05
原帖由 FinalBSD 于 2006-8-29 16:46 发表

^_^

多谢~,已修正~
我的测试

  1. /home/lee#cd test
  2. /home/lee/test#ls
  3. testfile
  4. /home/lee/test#testfile
  5. filepath:/home/lee/test
  6. /home/lee/test#cd ..
  7. /home/lee#testfile
  8. filepath:/home/lee/test
  9. /home/lee#cd ..
  10. /home#testfile
  11. filepath:/home/lee/test
  12. /home#cd /
  13. /#testfile
  14. filepath:/home/lee/test
  15. /#cd /var
  16. /var#testfile
  17. filepath:/home/lee/test
  18. /var#
复制代码

作者: woodie    时间: 2006-08-29 17:13
原帖由 xaliyan 于 2006-8-29 17:00 发表


这样就可以了, 其实不用cd, 直接
  1. shellpath=`dirname $0`
复制代码
就可以得到了。

如果你的要求不高的话,这样也未尝不可。^_^
不过考虑一下其它的调用方式,例如像下面这样的不规范的路径:
~/../../some/path/script
dir1/./dir2/script
...
尤其是相对路径,如果不和当前路径联系起来的话你很难知道它到底指向哪里。你说呢?^_^
作者: waker    时间: 2006-08-30 10:26
利用一下bash处理脚本的方法和linux的proc机制,没有实用价值


  1. #! /bin/bash
  2. a=$(ls -l /proc/$$/fd/255)
  3. a=${a##* }
  4. echo ${a%/*}
复制代码

[ 本帖最后由 waker 于 2006-8-30 10:28 编辑 ]
作者: skyworld    时间: 2006-08-30 15:10
直接which不行吗?
在aix上我都是直接用which command 查找的。
作者: woodie    时间: 2006-08-30 15:57
which只能查找环境变量PATH中的路径,其它路径中的命令就不灵了。^_^




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2