web-dev-qa-db-ja.com

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

そのため、ターミナルの開いているインスタンスを閉じるたびに、次の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がどのように機能するかがわからないかどうか、そもそもこれらのいずれかが実行されているかどうかはわかりません。私がXserverを実行するという事実は、bashにターミナルを考慮させる 終了時のログアウトではないもの

私はログインしていないと言っていますが、これは理にかなっています:

$> shopt login_Shell
login_Shell     off
11
Droogans

ログインシェル(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
25
Chris Page

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

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


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

6
user1686