需要在shell脚本中获取C程序名称

时间:2017-02-10 08:56:48

标签: c linux bash shell

我有一个C程序调用shell脚本的场合,它反过来将一些复制内容从CD挂载位置复制到安装目录。

现在我的问题是,是否有一种简单的方法可以在此shell脚本中获取此C程序的绝对路径?

我尝试了几种方法,包括使用" $(ps -o comm = $ PPID)"从脚本中,但到目前为止没有任何工作。我知道我可以从C程序创建一个包含自己名称(argv [0])的临时文件,然后让shell脚本读取该文件,但我不想在这里遵循这种方法。

当然,它可以作为参数传递给脚本,但我在想为什么bash内置宏或其他东西不能在这里使用

2 个答案:

答案 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。或者可执行文件已自行删除。