時には、出力に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つの解決策とは反対)。