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


11

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

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 的事实是否将Terminal视为不是退出时退出的东西?

它确实说我没有登录,这很有意义:

$> shopt login_shell
login_shell     off

作为一般性评论,如果要测试是否正在运行shell配置脚本,建议您echo在执行任何可能干扰echo运行的其他操作之前,将该命令放在开始位置。错误可能导致脚本在结束之前退出。
克里斯·佩奇

我假设从您所说的方式以及您正在检查SHLVL = 1的事实出发,您已经确认它是一个登录shell。是吗?什么shopt login_shell发言权?
克里斯·佩奇

Answers:


25

假设您已验证它是登录外壳程序(shopt login_shell):

〜/ .bash_logout仅在您使用exit或显式退出外壳程序logout或通过在命令提示符下键入Control-D并输入文件末尾的情况下运行。如果关闭终端仿真器,则会向SIGHUP发送进程,在这种情况下,bash不会运行〜/ .bash_logout。

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

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
在我的坏问题上,我觉得自己像是个浪费了的好问题。我会再问我是否超过了你的第一句话,仍然遇到麻烦。嘘。
Droogans'4

6

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

有关更多详细信息,请参见bash(1)的手册页,位于“ INVOCATION”下。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.