解释为什么bash_logout不会运行命令?

分享于 

3分钟阅读

电脑

  繁體 雙語

问题:

所以我一直在想如何在关闭终端的开放实例时运行这两行代码:


history -c


cat/dev/null> ~/.bash_history



我启动时 export HISTFILE=5,但我完成后仍想刷新。

我试着在一个的地方寻找,而且还没有多少运气。

我运行 Linux Mint,并且注意到我在 .bash_profile 上运行了一个类似的问题;最后,我发现我需要把代码放在 .bashrc 上。 这是我的.bash_logout file:


#!/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 或者 logout 显式退出 shell 或者键入控制d 以在命令提示符下输入end-of-file时,~/.bash_logout 才运行。 如果关闭终端 模拟器,进程将发送 SIGHUP,而bash在这种情况下不会运行 ~/.bash_logout。

如果你想在bash退出( 以及它是否是登录 shell ) 时执行工作,请使用 trap foo EXIT。 实现这里目的的最方便方法是将代码放在 shell 函数 e.g. 中:


print_goodbye () { echo Goodbye; }


trap print_goodbye EXIT




回答 2:

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

请参阅"调用"下 bash(1),的手册页,了解详细信息。

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



COM  COMM  EXP  Comma  BASH  commands