呼び出し元のcshシェルでいくつかのenv変数を設定するために使用されるスクリプトがあります。これらの変数の一部は、スクリプトの場所によって異なります。
ファイルが適切なcshスクリプトである場合、$ 0を使用してアクセスできます__FILE__
が、sourceを使用してスクリプトを実行すると、cshまたはtcshと表示されます。
これを使用して親シェルに変数を設定しているので、sourceを使用する必要があります。
何をすべきか?
ファイルの最初の行にアクセス$_
すると、ソースされている場合はファイルの名前が含まれます。直接実行する場合$0
は、名前が含まれます。
#!/bin/tcsh
set called=($_)
if ($called[2] != "") echo "Sourced: $called[2]"
if ($0 != "tcsh") echo "Called: $0"
これは読みにくいですが、実際には機能します。
スクリプトの名前がtest.cshの場合
/usr/sbin/lsof +p $$ | \grep -oE /.\*test.csh
この回答lsof
は、csh/tcshの下でネストされたソースファイルに対して機能する可能性があると思われる唯一の方法とgrepマジックについて説明しています。
スクリプトの名前が次の場合source_me.tcsh
:
/usr/sbin/lsof -p $$ | grep -oE '/.*source_me\.tcsh'
サブシェル$$
内でソースを呼び出すと、は機能しません。BASH_PID
bashでのみ機能します。
% (sleep 1; source source_me.csh)
私は次の作品が少し良くなることを発見しました:
% set pid=`cut -d' ' -f4 < /proc/self/stat`
% set file=`/usr/sbin/lsof +p $pid|grep -m1 -P '\s\d+r\s+REG\s' | xargs | cut -d' ' -f9`
最初の行は、ファイルを調達している現在のプロセスのpidを見つけます。これは、$$が親プロセスと同じIDを返すのはなぜですか?。2行目は、通常のファイルの読み取り用に開かれた最初の(できれば唯一の)FDを検索します。これは上記のengtechから来ました。