免费注册 查看新帖 |

Chinaunix

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

[文件目录] shell 获取当前所执行代码所在文件名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-13 16:53 |只看该作者 |倒序浏览
本帖最后由 totola147 于 2015-01-13 17:31 编辑

我在做一个简单的 shell debugger 工具

现在需要在运行时获取所执行代码所从属的脚本的文件名

我举个栗子

现在有两个脚本  test1.sh  主调程序   test2.sh  主要存储可复用的函数

test1.sh 文件内容如下
  1. . ./test2.sh

  2. echo "im test1"

  3. fun1 "im test2"
复制代码
test2.sh 文件内容如下
  1. fun1(){
  2. echo $1
  3. }
复制代码
现在如果test2.sh 中存在错误代码  shell报错信息会像这样
test2.sh: line 16: d: command not found

其中 test2.sh 是如何获取的

我的目的是,当调用test1.sh 时  当程序运行到 test2.sh的脚本,如果在运行时在test2.sh的脚本中获取到当前自己所在文件

$(readlink $0) 不行
$(dirname -f $0)  不行
$0 存储的是主调shell文件名    不行

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
2 [报告]
发表于 2015-01-13 16:58 |只看该作者
filename $0

论坛徽章:
0
3 [报告]
发表于 2015-01-13 17:12 |只看该作者
本帖最后由 totola147 于 2015-01-13 17:13 编辑
prcardin 发表于 2015-01-13 16:58
filename $0



[oracle@zhangzhe test]$ sh test1.sh
im function in test1.sh
im function in test2.sh
test2.sh: line 4: filename: command not found


没有 filename指令  

论坛徽章:
0
4 [报告]
发表于 2015-01-13 17:27 |只看该作者
#!/bin/bash

fun1()
{
        echo $0
        echo $1
}
$0代表当前bash执行脚本名

论坛徽章:
0
5 [报告]
发表于 2015-01-13 17:30 |只看该作者
W.Z.T 发表于 2015-01-13 17:27
#!/bin/bash

fun1()


你没有认真看需求,是在其他脚本里掉用这个方法

你把你的这个脚本  放到其他脚本里  运行看看

比如说你的脚本叫  func.sh

放到这个脚本里

. ./func.sh

echo ok
func1

论坛徽章:
0
6 [报告]
发表于 2015-01-13 17:33 |只看该作者
回复 2# prcardin

filename   指令不存在

你确定存在这个指令吗

   

论坛徽章:
0
7 [报告]
发表于 2015-01-13 17:33 |只看该作者
回复 5# totola147



你没有认真看需求,是在其他脚本里掉用这个方法

你把你的这个脚本  放到其他脚本里  运行看看

比如说你的脚本叫  func.sh

放到这个脚本里

. ./func.sh

echo ok
func1

   

论坛徽章:
0
8 [报告]
发表于 2015-01-13 20:52 |只看该作者
本帖最后由 W.Z.T 于 2015-01-13 21:01 编辑

回复 7# totola147

bash里有个caller builtin函数, 可以得到谁调用了它。 但是你这个需求正好相反, 只能hack下了:
  1. #!/bin/bash

  2. declare x

  3. function .()
  4. {
  5.         x=$1
  6.         unset -f .

  7.         . $1
  8. }

  9. . test2.sh

  10. echo "im test1"
  11. echo $x
  12. export x

  13. fun1 "im test2"

复制代码
  1. [root@localhost bash]# cat test2.sh
  2. #!/bin/bash

  3. fun1()
  4. {
  5.         caller

  6.         echo "haha"$x
  7.         echo $1

  8. }
复制代码

  1. [root@localhost bash]# ./test1.sh
  2. im test1
  3. test2.sh
  4. 20 ./test1.sh
  5. hahatest2.sh
  6. im test2
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-01-14 01:28 |只看该作者
本帖最后由 totola147 于 2015-01-14 01:30 编辑

回复 8# W.Z.T

感谢你的回复 ,很有启发性

不过这个解决方案还是稍微有些不尽如人意

我提这个问题是因为我在做一个shell debug 小程序

你这段代码是可以解决  通过 . include的脚本   达嘎

nohup sh xxxxxx

sh xxxxxxx

都是要处理的

这两种是可以直接通过$0获取的   需要将这三种整合起来

大家在一起思考思考

   

论坛徽章:
0
10 [报告]
发表于 2015-09-06 13:09 |只看该作者
echo $0 | awk -F'\' '{print $NF}'
这样得到的名字是你想要的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP