現在実行中の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の出力からわかるように、最初に受け取った引数zshargv[0])を含めるか、スクリプトを引数として渡すときの引数を含みます。

最初のケースでは、通常(慣例に従って保証されていませんargv[0]/(相対または絶対)またはzsh(何も含む)が含まれます/。この場合、発信者zsh彼の $PATHまたは、彼のコマンドハッシュテーブル...パスが相対パスの場合、上記はzshが呼び出されてから現在のディレクトリが変更されていない場合にのみ機能します。それ以外の場合は、実行可能ファイルが呼び出し元と同じ方法で見つかった場合にのみメソッドが機能します/zsh

スクリプトの場合、インタプリタパスではなくスクリプトパスが返されます(前の2つの解決策とは反対)。

おすすめ記事