免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6387 | 回复: 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 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2009-05-22 20:40 |只看该作者
linux:
readlink /proc/$$/fd/255

论坛徽章:
0
3 [报告]
发表于 2009-05-22 20:42 |只看该作者
看不懂啊。
最开始时候
static_path=`PWD`

以后每次都调用这个$static_path变量不就结了?

论坛徽章:
0
4 [报告]
发表于 2009-05-22 21:04 |只看该作者
原帖由 laohuanggua 于 2009-5-22 20:42 发表
看不懂啊。
最开始时候
static_path=`PWD`

以后每次都调用这个$static_path变量不就结了?

二楼大神从/proc/$$/下面获取path是最安全可靠的办法,哪怕是在脚本开头就pwd也是不可靠的。

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

二楼大神从/proc/$$/下面获取path是最安全可靠的办法,哪怕是在脚本开头就pwd也是不可靠的。



对,如果我从不同位置执行脚本的话,开头读取的pwd也是不一样的,比如我的当前目录是/,我以绝对路径去执行/home/user1/test.sh,这个时候第一个pwd值就是/,而不是/home/user1

二楼的兄弟,谢谢你,但我是在Solaris下,没有readlink,玩不起来

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



对,如果我从不同位置执行脚本的话,开头读取的pwd也是不一样的,比如我的当前目录是/,我以绝对路径去执行/home/user1/test.sh,这个时候第一个pwd值就是/,而不是/home/user1

二楼的兄弟,谢谢你,但 ...

那你这样试一下呢?

  1. path=$(ls -al /proc/$$/fd/ | awk '/255/{print $NF}')
  2. echo $path
复制代码

[ 本帖最后由 kwokcn 于 2009-5-22 22:21 编辑 ]
wxiluo 该用户已被删除
7 [报告]
发表于 2009-05-22 22:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2009-05-22 22:48 |只看该作者
原帖由 wxiluo 于 2009-5-22 22:21 发表
dirname 和 basename 这两个工具就可以满足你的要求。

具体查看man吧

不知道你是不是这个意思?



脚本的位置和我执行脚本时当前的目录不是固定的,举个例子

#!/usr/bin/sh

cd /var/tmp
cd /tmp
cat ./read

脚本如上,和read文件一起放到tmp目录下,执没有问题,如果我将脚本和read文件移到/var/tmp目录下,就会读不到read文件了
我希望脚本和read文件不轮放到那个目录下,也不管我从哪个位置去执行脚本,只要这两个文件在同一目录下,就能够cat ./read

[ 本帖最后由 geriwolf 于 2009-5-22 22:50 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-05-22 23:03 |只看该作者
谢谢绵羊兄指正


测试文件
[root@ns1 opt]# cat /opt/testbash
#!/bin/bash


#Fri May 22 22:47:32 CST 2009


echo "current path: "`pwd`
echo "dir is: "`dirname $0`

在/home下用绝对路径测试:
[root@ns1 home]# /opt/testbash
current path: /home
dir is: /opt

在/opt目录下用直接测试:
[root@ns1 home]# cd /opt
[root@ns1 opt]# ./testbash
current path: /opt
dir is: .


而使用readlink是可以返回准确路径的

修正后的脚本文件:
cat /opt/testbash
#!/bin/bash

#Fri May 22 22:47:32 CST 2009

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

echo `readlink /proc/$$/fd/255`

分别到/和/home进行运行测试:

[root@ns1 opt]# cd /
[root@ns1 /]# /opt/testbash
pwd return current path: /
dirname return dir is: /opt
/opt/testbash

[root@ns1 /]# cd /home
[root@ns1 home]# /opt/testbash
pwd return current path: /home
dirname return dir is: /opt
/opt/testbash

论坛徽章:
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