我有一个C程序调用shell脚本的场合,它反过来将一些复制内容从CD挂载位置复制到安装目录。
现在我的问题是,是否有一种简单的方法可以在此shell脚本中获取此C程序的绝对路径?
我尝试了几种方法,包括使用" $(ps -o comm = $ PPID)"从脚本中,但到目前为止没有任何工作。我知道我可以从C程序创建一个包含自己名称(argv [0])的临时文件,然后让shell脚本读取该文件,但我不想在这里遵循这种方法。
当然,它可以作为参数传递给脚本,但我在想为什么bash内置宏或其他东西不能在这里使用
答案 0 :(得分:2)
在linux上有一个/proc/self/exe
路径指向当前执行文件的绝对路径。因此,您可以在生成shell之前推送包含路径的环境变量。类似的东西:
readlink("/proc/self/exe",...,buf);
putenv("MYEXE",buf);
system("thescript");
并访问脚本中的变量:
echo $MYEXE
答案 1 :(得分:0)
在运行foo
命令之前,您可以使用which之类的
fooprog=$(which foo)
获取程序的完整路径(扫描$PATH
)。例如,which ls
可以提供/bin/ls
....
在Linux上,您可以使用proc(5)。
在你的C程序启动的shell process(运行bash
或一些POSIX兼容的shell)中,$PPID
给出父进程ID,希望运行C的进程的pid程序
然后executable是/proc/$PPID/exe
,这是一个符号链接。例如,尝试在某个终端中使用ls -l /proc/$PPID/exe
命令。
(请注意,您没有运行C源文件或严格的敏感C程序,您经常运行一些ELF可执行文件,它是通过编译C代码构建的)
你可能有奇怪的情况(你经常会忽略它们,但你可能会决定处理它们)。有人可能在运行时移动或替换或删除您的可执行文件。或者父进程(您的可执行文件)过早死亡,因此shell进程变为orphan。或者可执行文件已自行删除。