免费注册 查看新帖 |

Chinaunix

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

脚本运行时如何得到自身所在的目录位置?不是work目录 [已解决] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-22 20:02 |只看该作者 |正序浏览
脚本运行时如何得到自身所在的目录位置?不知道有没有现成的变量,我不是指脚本work的目录。可能这样很难说明白,我举个例子

有个脚本,名为test.sh,绝对路径是/home/user1/test.sh
内容如下

#!/usr/bin/sh

echo $PWD
cd /
echo $PWD
cd /tmp
echo $PWD

我想在每个echo $PWD的地方能显示出来的目录为/home/user1,也就是test.sh所在的目录,不随着脚本中cd命令更换目录而改变,
并且要能够不需要修改脚本内容,将脚本移至/home/user2目录中执行时,显示出来的就是/home/user2

当然,实现的方法越简单越好

[ 本帖最后由 geriwolf 于 2009-5-23 03:38 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2012-02-24 11:32 |只看该作者
本帖最后由 liuqinglq 于 2012-02-24 11:36 编辑

看到16L。。。。
原来这是shell的基础吗?
还是需要动脑筋想想的吧
基础应该是一个命令就能打出来的东西~并且是较常用的命令

好吧,我较真了

再较真一下16L的脚本
如果以这种方式来执行脚本。。。
脚本在 /usr/shell/test/test.sh
当前目录是 /usr/shell/
我这样执行../shell/test/test.sh
那么会是怎样呢,有兴趣的同学不妨试试

我想到最简单的方法就是用cd
脚本如下

#!/bin/sh

start_path=`pwd`
exec_path=`echo "$0" | sed 's/\/[^\/]\+$//'`
cd $exec_path
shell_path=`pwd`
cd $start_path
echo $shell_path


论坛徽章:
0
17 [报告]
发表于 2009-05-23 03:37 |只看该作者
原帖由 r2r4 于 2009-5-23 00:15 发表
买膏的。。。
这个是shell的基础阿。。任何介绍shell的都会讲到这个吧,就算没有自己也可以想一想阿

#! /bin/sh
if test ${0:0:1} = '/'
then
        echo "abs path: `dirname $0`"
else
        ec ...


还是不及LS的聪明啊,呵呵,这段放到脚本开头,先得到路径放到后面调用,解决了
谢谢各位!

论坛徽章:
0
16 [报告]
发表于 2009-05-23 00:15 |只看该作者
买膏的。。。
这个是shell的基础阿。。任何介绍shell的都会讲到这个吧,就算没有自己也可以想一想阿

#! /bin/sh
if test ${0:0:1} = '/'
then
        echo "abs path: `dirname $0`"
else
        echo "abs path:`pwd`/`dirname $0`"
fi

因为你是用shell调用你的脚本,所以不必担心exec函数调用的时候传递的$0和实际情况不一致的情况

如果$0是‘/'开头,那就是绝对路径了,如果不是,就用$0和pwd拼接起来

即使你的脚本s在$PATH里面,被直接‘s’ 执行了,也没有关系,因为shell会自己把$PATH扩展成绝对路径的

虽然可能出现'/tmp//s'的情况,但是这也是合法的路径写法,如果觉得丑,你可以处理掉多余的'/'

对以上讨论感到很迷惑

论坛徽章:
0
15 [报告]
发表于 2009-05-22 23:26 |只看该作者
原帖由 laohuanggua 于 2009-5-22 23:18 发表
我在我的/opt/testbash最后加入了

ls -al /proc/$$/fd/255

再次执行/opt/testbash后显示

lr-x------ 1 root root 64 May 22 23:16 /proc/3679/fd/255 -> /opt/testbash

楼主加上这句试试呢?



  1. bash-2.05# cat d
  2. #!/bin/bash

  3. #Fri May 22 22:47:32 CST 2009

  4. echo "pwd return current path: "`pwd`
  5. echo "dirname return dir is: "`dirname $0`

  6. cd /var/tmp
  7. echo "pwd return current path: "`pwd`
  8. echo "dirname return dir is: "`dirname $0`

  9. #echo `readlink /proc/$$/fd/255

  10. ls -al /proc/$$/fd/255
  11. bash-2.05# ./d
  12. pwd return current path: /tmp
  13. dirname return dir is: .
  14. pwd return current path: /var/tmp
  15. dirname return dir is: .
  16. -r-xr--r--   1 root     other        276 May 22 23:25 /proc/965/fd/255
  17. bash-2.05#
复制代码


可能在linux下可以,在solaris下255不是link

论坛徽章:
0
14 [报告]
发表于 2009-05-22 23:18 |只看该作者
我在我的/opt/testbash最后加入了

ls -al /proc/$$/fd/255

再次执行/opt/testbash后显示

lr-x------ 1 root root 64 May 22 23:16 /proc/3679/fd/255 -> /opt/testbash

楼主加上这句试试呢?

论坛徽章:
0
13 [报告]
发表于 2009-05-22 23:14 |只看该作者
对带有255的行执行输出最后一个字段的动作。

论坛徽章:
0
12 [报告]
发表于 2009-05-22 23:07 |只看该作者
我ls -al /proc/$$/fd/看了下结果如下

bash-2.05# ls -al /proc/$$/fd/
total 19
dr-x------   2 root     other       8208 May 22 21:52 .
dr-x--x--x   5 root     other        768 May 22 21:52 ..
c---------   1 root     tty       24,  1 May 22 23:06 0
c---------   1 root     tty       24,  1 May 22 23:06 1
c---------   1 root     tty       24,  1 May 22 23:06 2
c---------   1 root     tty       24,  1 May 22 23:06 255
D---------   1 root     root           0 May 20 20:50 3

后面awk '/255/{print $NF}'是作何处理?

论坛徽章:
0
11 [报告]
发表于 2009-05-22 23:05 |只看该作者
先给个中间结果。
PATH=`ls -al /proc/$$/fd/`
echo $PATH

论坛徽章:
0
10 [报告]
发表于 2009-05-22 23:03 |只看该作者
原帖由 kwokcn 于 2009-5-22 22:16 发表

那你这样试一下呢?

path=$(ls -al /proc/$$/fd/ | awk '/255/{print $NF}')
echo $path


  1. bash-2.05# cat a
  2. #!/usr/bin/sh
  3. path=$(ls -al /proc/$$/fd/ | awk '/255/{print $NF}')
  4. echo $path
  5. bash-2.05# ./a
  6. ./a: syntax error at line 3: `path=$' unexpected
  7. bash-2.05# bash a
  8. 255
复制代码



  1. bash-2.05# cat a
  2. #!/usr/bin/sh
  3. path=`ls -al /proc/$$/fd/ | awk '/255/{print $NF}'`
  4. echo $path
  5. bash-2.05# ./a

  6. bash-2.05# bash a
  7. 255
  8. bash-2.05#
复制代码
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP