当我在命令行中输入某个可执行文件的名称并启动时,如何检测该可执行文件所在的路径?
答案1
您可以使用命令找出将启动哪个可执行文件
which <command>
如果您想以编程方式确定路径,那么您就走错了堆栈交换。
答案2
简单解决方案的问题
which
command
查找给定的可执行文件command
在你的 中$PATH
。不幸的是,这并非在所有情况下都能按预期工作。
什么时候command
是别名或函数,您将无法获得正确的结果,因为实际运行的可执行文件可能具有完全不同的名称。例如,许多 Linux 发行版ll
默认设置了别名。which ll
找不到任何内容。另一个有问题的情况是,当您的 shell 以非标准方式运行并且不运行第一个command
发现于$PATH
。
更可靠的解决方案
在 Linux 上,如果你想完全确定正在运行的进程的可执行文件的路径,那么你可以从其PID(进程 ID;在下面的示例中用数字代替$PID
):
readlink /proc/$PID/exe
如何獲得號碼?PIDshell 后台运行的最后一个进程是$!
。小演示:
sleep 20 &
readlink /proc/$!/exe
你可以得到PID例如从进程列表中使用其他进程ps -ef
。
解释:/proc/$PID/exe
是指向可执行文件的符号链接跑步进程。该命令readlink
显示符号链接指向的目标。
脚本是一种特殊情况
不幸的是,该readlink /proc/$PID/exe
方法对于 bash、Perl、Python 等脚本语言不起作用。在这种情况下,您将获得脚本解释器的路径(如/bin/bash
),而不是脚本的路径。要获取更接近的信息,您可以使用:
cat /proc/$PID/cmdline # the commandline with the interpreter and script
readlink /proc/$PID/cwd # the current working directory
不幸的是,当前工作目录可能会在程序启动后发生变化。一些解释器(如 bash)可以让脚本文件在描述符 255 上保持打开状态:
readlink /proc/$PID/fd/255
一切都可能改变
任何进程都可以调用exec()
来替换其/proc/$PID/exe
,/proc/$PID/cmdline
以及其他信息。