当前运行的 zsh 的绝对路径?

当前运行的 zsh 的绝对路径?

有时 的输出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

相关内容