スクリプトから最も近い対話型祖先シェルの名前をどのように取得できますか?

スクリプトから最も近い対話型祖先シェルの名前をどのように取得できますか?

$-インクルードを使用できることを知っています$PS1シェルがインタラクティブであるかどうかを判断するために、ヌルをチェックまたはチェックします。

しかし、これらのソリューションは現在シェルでのみ機能します。

インタラクティブな直接親シェルを見つけるためのbashスクリプトがあります。

たとえば、

  1. 対話型シェル:zsh
  2. bashスクリプト1 bashスクリプト2の実行
  3. bashスクリプト2には、リアルタイムの対話型シェルを見つけるメカニズムが含まれています。

したがって、対話型シェルでbashスクリプト1を実行すると、zsh出力はzsh

スクリプトがサブシェルで実行されたときにこれを行う方法がわかりません。

ノート

スクリプトを実行するのではなく、実行したいです。

言う

最初の対話型祖先シェルを見つけるためのbashスクリプトがあります。

最初の祖先とは、ボトムアッププロセスチェーンスキャン中に出会った最初の対話型シェルを意味します。

たとえば、次の場合:zsh(最初の対話型シェル) - > bash(2番目の対話型シェル) - > bash(スクリプト1のバッチシェル) - > bash(スクリプト2のバッチシェル)、私たちはbash (2番目の対話型シェル)を出力しようとしています。シェル)。

ベストアンサー1

これは非常に奇妙な要求です。どのインタラクティブシェルがスクリプトを呼び出すのか、またはインタラクティブシェル以外のプログラムを呼び出してスクリプトを呼び出すのかを気にする必要があるのはなぜですか?これは匂いがとても強いです。XYの問題

必ず知っておく必要がある場合は、調べようとすることができますが、完全に信頼できる方法はなく、一般的な状況で動作する方法は1つしかないようです。

最初から始めて、探しているプロセスが見つかるまで、または行き過ぎたことを示すプロセスが見つかるまで、スクリプト$PPIDの祖先プロセス()を追跡します。ps -o ppid= -p $ancestor_pid

簡単な戦略は、さまざまなプロセスグループ()でプロセスを見つけることですps -o pgid= -p $ancestor_pid。通常の状況でスクリプトが対話型シェル(呼び出し側スクリプト)によって呼び出される場合、到達するプロセスはスクリプト(スクリプトの親)を実行するジョブ制御機能を持つシェルです。

この戦略が間違っている可能性があるいくつかの例は次のとおりです。

  • チェーンのプロセスの1つが終了しました。
  • スクリプトはインタラクティブシェルでは呼び出されず、クローン操作、X11プログラムなどを介して呼び出されます。

lsofプロセスの標準入力、標準出力、および標準エラー(たとえば、Linuxの外部への移植性が必要ない場合は使用または経由)がスクリプトと同じ端末であることを確認したい場合や望ましくない場合があります。/proc次の状況をどのように処理するかによって異なります。

bash$ xterm -e your_script

おすすめ記事