解释为什么 .bash_logout 无法运行命令?

解释为什么 .bash_logout 无法运行命令?

所以我一直想知道每次关闭打开的终端实例时如何运行这两行代码:

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

答案1

假设您已验证它是一个登录 shell ( shopt login_shell):

exit仅当您使用或明确退出 shell 时logout,或者在命令提示符下键入 Control-D 以输入文件结尾时,才会运行 ~/.bash_logout。如果您关闭终端仿真器,进程将收到 SIGHUP,并且 bash 在这种情况下不会运行 ~/.bash_logout。

如果您想在 bash 退出时执行工作(无论它是否是登录 shell),请使用trap foo EXIT。最方便的方法是将代码放在 shell 函数中,例如:

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

答案2

~/.bash_logout仅由登录shell(例如您在 tty 会话中获得的 shell,或者使用bash -l)。它会被大多数终端运行的非登录 shell 忽略。

有关更多详细信息,请参阅 bash(1) 手册页的“INVOCATION”部分。


如果你不想保留持久历史记录,只需取消设置HISTFILE或设置HISTFILE=/dev/null。这将在退出时自动丢弃历史记录,同时仍允许将其保留在当前 shell 中(HISTSIZE=100)。

答案3

我认为您应该能够使用以下命令实现相同的结果(仅保留当前会话的历史记录而不将其保存到磁盘)命令

>$HISTFILE;export HISTFILE=;echo "export HISTFILE=" >> ~/.bashrc

为每个需要执行以下操作的用户运行该命令:清空 bash 历史文件;取消设置 bash 历史文件

结果:它显然只记住活动会话中的历史记录(在特定用户可访问的内存中),使用“history”命令查看当前会话历史记录,而不是将其保存到 bash_history 或磁盘上的任何其他文件中。

在我终止具有活动会话的终端应用程序并再次登录后,历史记录从文件和历史命令输出中消失了。

相关内容