foocaller
Rubyスクリプトを呼び出す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
直接呼び出してパスを取得するにはどうすればよいですか?foocaller
bash
答え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
sh
foo
やった後にも説明することがまだ残っているので、同じ過程ではできません。foo
だからfoo
別のプロセスで実行されて待ちます。次に実行しますexit
(これを行うと、同じ終了状態でスクリプトが終了しますfoo
)。
ここでプロセスを保存できるので、これは理想的ではありません。
foo
パスを知るより良い方法foocaller
は、次のように伝えることです。
#! /bin/sh -
CALLER=$0 foo
その後、環境変数をfoo
照会してCALLER
呼び出し元へのパスを取得できます(import os;print(os.environ["CALLER"])
Pythonの場合)。