特定のディレクトリから終了する場合、ログアウト スクリプト内のコードを実行しますか?

特定のディレクトリから終了する場合、ログアウト スクリプト内のコードを実行しますか?

私は、自分が貢献しているいくつかのライブラリをテストするために、さまざまなマシンにアカウントを持っています。マシンの一部は他の人が所有しており (GCC コンパイル ファームなど)、それらを整理しておきたいと思っています。

.bash_logout実行するスクリプトmake cleanを設定したいexit もし特定のディレクトリにいます。ディレクトリ要件により、複数の SSH セッションが欠落します。1 つのセッションでビルド/テストを行っている場合、成果物を消去する別のセッション ログアウトは不要です。つまり、exitfrom は$HOME/libfooクリーンを実行しますが、exitfrom は$HOME実行しません。

基本は理解していますが、これがどれほど堅牢であるかはわかりません。

# $HOME/.bash_logout

if [ "$PWD" = "$HOME/libfoo" ]; then
    make clean 1>/dev/null 2>&1
fi

ログアウト中に使用すると何か問題がありますか$PWD? 他に見逃している問題はありますか?

答え1

ログアウト時にのみスクリプトを実行するつもりですか?
man bash から:

ログイン シェルが終了すると、bash は ~/.bash_logout ファイルが存在する場合はそこからコマンドを読み取って実行します。

bash ログイン シェルの終了時のみ。


シェルを閉じるたびにスクリプトを実行する場合は、trap を使用します (man bash を参照)。

trap /u1/myuser/on_exit_script.sh EXIT

これを .bashrc または他の適切なファイルに追加します。


また、スクリプトは終了時に実行されるため、終了時にアクティブになるのは $PWD になりますが、これはシェルの起動時と同じ場合もそうでない場合もあります。終了時に使用されていた $PWD に対して何かを行う必要がある場合は、次のテストを実行します。

if [ "$PWD" = "$HOME/libfoo" ]; then

動作するはずです。

答え2

私はシェル スクリプトの多くを移植可能でシェルに依存しないものにしたいので、bash 固有の .bash_logout メソッドを使用するよりも EXIT をトラップすることを好みます。また、真に自己完結的なソリューションの場合、.bash_logout を変更または作成する必要がなく、終了時に実行される別のスクリプトに依存しないことが最善です。もちろん、システム上で "exit" コマンド自体が実行する内容を変更または上書きすることはさらに悪いことです。ソリューションは他の誰にも影響を及ぼすべきではありません。

したがって、外部システムへの影響を最小限に抑えるために、私が好む方法は、システムで作業を開始するたびにカスタム ログイン プロファイルを配置し、その同じプロファイルで、プロファイル自体と、そのプロファイルで作成されるヘルパー スクリプトまたは構成ファイルをクリーンアップすることです。次に、そのプロファイルをソース (ksh でも機能する "." を使用) して、すべてのエイリアスなどを設定しますが、作業が終わったらプロファイルを残しておきたくありません。

そこで、スクリプト自体に、前述のクリーンアップを実行するシェル関数「bye」を作成し、意図的か単純な切断かに関係なく、ログアウト時に自動クリーンアップするように登録します。

trap bye EXIT

これにより、作業の醜い痕跡が残らないことが保証されます。どのクリーンアップを実行するかはあなた次第です。ディレクトリ固有の「make clean」は、多くの可能性の 1 つにすぎません。また、どのような手段でログアウトしても、クリーンアップ機能を含むプロファイルのすべての痕跡が消えます。

もう一歩先へ進むことができます。異なる種類のクリーンアップを実行させたいシステムの種類が複数ある場合や、この種のクリーンアップをまったく実行させたくないシステムがある場合などです。"bye" シェル関数にスイッチを組み込むか、"bye1"、"bye2" という異なるスイッチを作成し、何らかのテスト (たとえば、何らかのファイルの存在) に基づいて必要なスイッチを登録することができます。これは、同じプロファイルを保持したい長期使用システムでカスタム プロファイルが削除されるのを防ぐ方法です。

答え3

bash_logout でこれを行う方法はよくわかりませんが、質問に入力したようなコードを使用して、/usr/local/bin/ に配置する exit という小さなスクリプトを記述することはできます。これにより、コンソールで exit と入力すると、特定のディレクトリにいる場合に、必要な処理が実行されます。

関連情報