実行中のスクリプトが引数としてスクリプトパスを使用してインタプリタを呼び出すのではなく直接呼び出される場合、インタプリタに関係なくスクリプトファイルのフルパスを確実に取得できますか?
以下はいくつかの方法です。いいえスクリプトの絶対パスを取得します。
readlink /proc/$PID/exe
復帰経路通訳PID ${PID} がスクリプトの場合。cat /proc/$PID/comm
返品基本名スクリプト済み。- 内容については信頼できるものはありません
/proc/$PID/cmdline
。これは実行中のプログラムによって変更される可能性があり、「0番目」パラメータは(echo $0
ターミナルセッションで実行されたときなど)スクリプトの実際のパスになることは保証されません。
ベストアンサー1
スクリプトはインタプリタが読み取るデータだけであるため、オペレーティングシステムはこれについて何もできません。インタプリタはスクリプト本文を使用してファイルを閉じることができ、スクリプトの場所を追跡しないようにグローバル引数ベクトルを操作することもできます。
スクリプト名やその他の機能へのアクセスは、スクリプトがインタプリタで独自のコマンドラインオプションとして処理されない独自のコマンドラインオプションを持つ機能など、スクリプト言語を介して提供されます。
スクリプト言語にない場合はそれを使用できます/proc
。インタプリタの実行時にスクリプトファイルを開き、それが常に特定のファイル記述子番号であることがわかっている場合はそれを見ることができます。/proc/self/fd
たとえば、これは特定のGNU / Linuxシステムで効果的でした。
$ ./shellarg a b c
my name is /home/kaz/junk/shellarg
どこshellarg
:
#!/bin/sh
mypath=$(readlink /proc/$$/fd/10)
echo "my name is $mypath"
ファイル記述子 10 で開くスクリプトによって異なりますので、この方法はお勧めできません。さらに、この特定のスクリプト言語の場合、シェルはうまく機能し、スクリプト名を$0
。
スクリプト名を取得しにくくするいくつかの敵対的なスクリプト言語を使用している場合は、次のように挿入してシェルラッパーを介してスクリプトを呼び出すことができます$0
。
#!/bin/sh
mydir=$(dirname "$0")
fbzfile="$mydir"/script.fbz
frobozz-interpreter -f $fbzfile -- $fbzfile ... other args
ここで、frobozz-interpreter
スクリプト名はパラメータとして受け取り、-f
秘密のままです。ファイル全体を解析してスクリプトを実行する前に閉じるため、/proc
スクリプト内で検索するのは役に立ちません。しかし、私たちのシェルラッパーは単にスクリプト名を最初の引数として渡します。台本はこれを期待し、すべてが良かった。