我们运行一个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得到的结果是这个符号连接真正所连接到的文件的信息,而不是这个单独的符号连接文件本身的信息。
阅读(2502) | 评论(0) | 转发(0) |