Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988424
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-11-18 15:54:11

我们运行一个linux下的可执行程序,如果是c语言的,那么可以从argv[0]里面得到调用程序本身的路径及名称,当然如果有路径,既表明以当前程序的路径加上该路径就可以得到本可执行序的路径:例子:
    可执行程序a在/bin/下,我们现在在/home/shaoting下,我们执行../../bin/a后,会启动该可执行程序,在程序a内部, argv[0]就是../../bin/a,可见,该程序的默认执行路径是我们启动该命令的地方,即/home/shaoting,因此,如果a内部对当 前目录建立一个文件,那么文件会建立在/home/shaoting下面。所以,我们以启动该程序的路径/home/shaoting加上argv[0] 即../../bin/a就得到了/home/shaoting/../../bin/,这就得到了这个可执行程序本身所在的路径,这也就是我们获得可执 行程序本身所在路径的一个方法:
   程序当前路径+argv[0]中的路径部分=可执行程序本身所载路径
   其中,程序当前路径就作为相对路径的起点。
  
   需要注意的是,有时候,我们用上面的方法得到的路径并不是真正的可执行程序的路径,而只是得到了符号连接文件的路径。即argv[0]是符号连接的路径, 就算是在bash脚本里,也一样,$0也是符号连接的路径加名字,而不是本脚本的名字,(这样也有个好处,就是可以做成一个类似于toolchain中 busybox似的程序,别人都指向他,他能完成许多不同名字的可执行程序的工作,他依靠$0或者argv[0]来判断究竟你在使用哪个连接)
   此时,
   程序当前路径+argv[0]或者$0中的路径部分=符号连接的路径部分
  
   如果在脚本里,可以用readlink -f symbol_link_file_name 来获得这个符号连接所指向的文件的绝对路径,很方便,如果你的版本不支持readlink命令,别急:可以用ls -ld symbol_link_file_name命令来获取该连接文件的信息,这行信息中会出现一个symbol_link_file_name -> real_file_name 的字符串,将这个字符串解析,就可以得到真正的文件名,当然,如果real_file_name与符号连接不再一个文件夹下,那么 real_file_name中就会带有路径部分,这个路径是相对于符号连接文件的路径,可见上面我们已经知道了符号连接文件的路径,而这里又找到了真正 的文件相对于符号连接的路径以及真正的文件的名字,那么我们就知道了真正的文件的路径和名字了。
  
    符号连接的路径部分+真正的文件的路径部分(相对于符号连接的路径)=真正文件的路径

    在脚本中,取路径的操作可以用${parameter#word} 或者${parameter%word}操作来实现,readlink的输出还有一个特点,如果所处理的文件不是符号连接,而是个普通文件,那么他就返回 这个普通文件的路径。这样可以认为,只要我们的环境支持readlink,那么就能得到一个脚本的真正的可执行文件的路径。如果不支持readlink, 就要用 ls -ld 的方法了,注意之所以用ls -ld而不用-ls -l是因为,-d的意思是不对符号连接进行解析,及如果我们用ls -l sysbol_link_filename得到的结果是这个符号连接真正所连接到的文件的信息,而不是这个单独的符号连接文件本身的信息。
  
阅读(2475) | 评论(0) | 转发(0) |
0

上一篇:excercise 5.6

下一篇:次贷危机的起因

给主人留下些什么吧!~~