현재 실행 중인 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]). 실행 파일의 경로와 관련이 있지만 링크된다는 보장은 없습니다.

리눅스의 경우:

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

관련 정보