スクリプトから親パスを取得する

スクリプトから親パスを取得する

foocallerRubyスクリプトを呼び出すbashスクリプトがありますfoo

フコラー

/path/to/foo

その中でfooパスを取得したいですfoocaller。次のようなこの提案、これを行うには、次のコードを入力します。

金持ち

#!/usr/bin/env ruby
puts File.read("/proc/#{Process.ppid}/cmdline")

私が実行したとき:

$ bash foocaller

それから私は欲しいものを手に入れます。

bash^@/path/to/foocaller

しかし、直接電話するとfoocaller

$ foocaller

それから私はこれを得ます:

/bin/bash^@--noediting^@-i

パスを表示しませんfoocaller。を使用せずにfoocaller直接呼び出してパスを取得するにはどうすればよいですか?foocallerbash

答え1

多くのシェルは同じプロセスでコマンドを実行し、スクリプトの最後のコマンドを最適化します。

$ sh -c 'ps
ps'
  PID TTY          TIME CMD
32673 pts/3    00:00:00 zsh
32696 pts/3    00:00:00 sh
32697 pts/3    00:00:00 ps
  PID TTY          TIME CMD
32673 pts/3    00:00:00 zsh
32696 pts/3    00:00:00 ps

2番目のプロセスがps最初に実行されたプロセスsh(32696)でどのように実行されるかを確認し、その親プロセスは(私の場合は対話型シェル)shの親プロセスです。zsh

次の行を追加すると、これを防ぐことができますexit

#! /bin/sh -
foo
exit

shfooやった後にも説明することがまだ残っているので、同じ過程ではできません。fooだからfoo別のプロセスで実行されて待ちます。次に実行しますexit(これを行うと、同じ終了状態でスクリプトが終了しますfoo)。

ここでプロセスを保存できるので、これは理想的ではありません。

fooパスを知るより良い方法foocallerは、次のように伝えることです。

#! /bin/sh -
CALLER=$0 foo

その後、環境変数をfoo照会してCALLER呼び出し元へのパスを取得できます(import os;print(os.environ["CALLER"])Pythonの場合)。

関連情報