有时 的输出ps -p $$
显示当前正在运行的 的绝对路径zsh
,
% ps -p $$
PID TTY TIME CMD
1027 ttys005 0:00.11 /usr/local/bin/zsh
但不总是:
% ps -p $$
PID TTY TIME CMD
1507 ttys003 0:00.07 zsh -fl
获取当前正在运行的路径的一致方法是什么zsh
?
编辑(澄清):我对如何主要在 Darwin 和 Linux 以及 NetBSD 中执行此操作感兴趣。
答案1
CMD
的输出ps
是进程名称或传递给命令的参数(包括第一个参数argv[0]
)。尽管它与可执行文件的路径有一定关系,但不能保证它们是链接的。
在 Linux 上:
print -r -- /proc/self/exe(:A)
在 Darwin 和 Linux 以及其他可能的系统上:
lsof -ap"$$" -dtxt -Fn | sed '2!d;s/.//;q'
但我不知道它的可靠性如何。
另一个启发式:
print -r -- ${${0#-}:c:A}
$0
,就像您在 ps 输出中看到的那样,包含zsh
接收到的第一个参数 ( argv[0]
),或者当将脚本作为参数传递时,该参数。
在第一种情况下,通常(按照惯例,不能保证)argv[0]
要么是小路包括/
(相对或绝对),或zsh
(没有 的东西/
),在这种情况下,调用者将zsh
在他的 $PATH
或者他的命令哈希表...如果路径是相对的,则仅当当前目录自调用 zsh 以来未更改时,上述方法才有效。如果没有,则该方法仅在以与调用者相同的方式查找可执行文件/
时才有效。zsh
对于脚本,将返回脚本的路径,而不是解释器的路径(与前两个解决方案相反)。
答案2
您可以使用此命令获取任何程序的绝对路径: 哪个命令
例如:哪个zsh