.bash_logoutがコマンドを実行しない理由を説明してください。


11

ターミナルの開いているインスタンスを閉じるたびに、次の2行のコードを実行する方法を考えていました。

history -c
cat /dev/null > ~/.bash_history

export HISTFILE=5は起動時ですが、完了したらそれをフラッシュしたいのですが。

私が試した少し周りを見ている中での場所のカップル、そして多くの運を持っていませんでした

私はLinux Mintを実行してい.bash_profileます。また、で同様の問題が発生したことにも注意します。最終的に、すべての起動コードをに配置する必要.bashrcがあることがわかりました。これが私の.bash_logoutファイルです:

#!/bin/bash
# ~/.bash_logout: executed by bash(1) when login shell exits.

#this does nothing on exit...
echo 'logout'; sleep 2s

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    history -c
    cat /dev/null > ~/.bash_history
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

私はこのスクリプトをさまざまな方法で再配置しようとしましたが、bashがどのように機能するかを理解していないかどうか、また、これらのいずれかが最初から実行されているかどうかはわかりません。私が実行しているという事実は、Xserverbash を終了時のログアウトではないターミナルと見なしますか?

それは私がログインしていないと言ってます、それは意味があります:

$> shopt login_shell
login_shell     off

一般的なコメントとして、シェル構成スクリプトが実行されるかどうかをテストする場合は、実行をecho妨げる可能性のある他のことを行う前に、コマンドを最初に置くことをお勧めしますecho。エラーが発生すると、スクリプトが最後に到達する前に終了する可能性があります。
クリスページ

私はあなたがこれを言った方法から、そしてあなたがSHLVL = 1をチェックしているという事実から、それがログインシェルであることをすでに確認していると想定していました。それは...ですか?何てshopt login_shell言うの?
Chris Page

回答:


25

ログインシェル(shopt login_shell)であることを確認したと仮定します。

〜/ .bash_logoutは、またはでシェルを明示的に終了したexit場合logout、またはコマンドプロンプトでControl-Dを押してファイルの終わりを入力した場合にのみ実行されます。ターミナルエミュレーターを閉じると、プロセスはSIGHUPに送信され、その場合、bashは〜/ .bash_logoutを実行しません。

bashが終了するたびに(ログインシェルかどうかにかかわらず)作業を実行する場合は、を使用しますtrap foo EXIT。これを行う最も便利な方法は、シェル関数にコードを配置することです。たとえば、

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
私は私の悪い質問で完全に良い問題を無駄にしたような気がします。最初の文章を過ぎても問題が解決しない場合は、もう一度尋ねます。シーッシュ。
Droogans 2012

6

~/.bash_logoutログインシェル(ttyセッションで取得したシェル、またはを使用したシェルなど)によってのみ実行されますbash -l。ほとんどの端末で実行される非ログインシェルでは無視されます。

詳細については、「INVOCATION」の下にあるbash(1)のマニュアルページを参照してください。


永続的な履歴を保持したくない場合は、単にunset HISTFILEまたはsetしHISTFILE=/dev/nullます。これにより、終了時に履歴が自動的に破棄されますが、現在のシェル(HISTSIZE=100)で履歴を保持できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.