如果从特定目录退出,则在注销脚本中执行代码?

如果从特定目录退出,则在注销脚本中执行代码?

我在许多不同的机器上有帐户,用于测试我贡献的几个库。有些机器归其他人所有(例如 GCC 编译场),我想保持它们整洁。

我想设置一个.bash_logout执行make clean以下操作的脚本exit 如果我在一个特定的目录中。目录要求退出多个 SSH 会话。如果我在一个会话中构建/测试,我不希望单独的会话注销来清理工件。即,exit$HOME/libfoo执行干净;而exit$HOME没有。

我了解基础知识,但我不清楚它有多强大:

# $HOME/.bash_logout

if [ "$PWD" = "$HOME/libfoo" ]; then
    make clean 1>/dev/null 2>&1
fi

$PWD注销时使用有问题吗?还有其他我可能错过的问题吗?

答案1

您打算仅在注销时执行脚本吗?
来自 man bash:

当登录 shell 退出时,bash 会从文件 ~/.bash_logout(如果存在)中读取并执行命令。

仅在退出 bash 登录 shell 时。


如果您打算在每次 shell 关闭时运行脚本,请使用 trap (请参阅 man bash):

trap /u1/myuser/on_exit_script.sh EXIT

将其添加到 .bashrc 或其他适合您的文件中。


另外,由于脚本将在退出时执行,因此 $PWD 将是退出时处于活动状态的脚本,这可能与 shell 启动时相同,也可能不同。如果您需要对退出时使用的 $PWD 执行某些操作,那么是的,此测试:

if [ "$PWD" = "$HOME/libfoo" ]; then

应该管用。

答案2

我喜欢许多可移植且与 shell 无关的 shell 脚本,因此我更喜欢捕获 EXIT 而不是使用 bash 特定的 .bash_logout 方法。对于真正独立的解决方案,最好不必修改或创建 .bash_logout,也不必依赖在退出时运行的单独脚本。当然,更糟糕的是修改或覆盖“exit”命令本身在系统上执行的操作 - 该解决方案不应影响其他任何人!

因此,为了将对外部系统的影响降至最低,我的首选方法是每当我开始在系统上工作时就将自定义登录配置文件放置到位,并让相同的配置文件自行清理以及它创建的任何帮助程序脚本或配置文件。然后我获取该配置文件(使用“.”,它也在 ksh 下工作),它设置了我所有的别名等 - 但我不希望它在我完成后留下来。

因此,我在脚本本身中创建一个 shell 函数“bye”来执行上述清理,并通过以下方式注册它以在注销时进行自动清理,无论是有意的还是通过简单的断开连接:

trap bye EXIT

这确保了我不会留下丑陋的工作痕迹。它应该执行哪种具体清理取决于您,特定于目录的“make clean”只是众多可能性之一。一旦通过任何方式注销,配置文件的所有痕迹(甚至包括清理功能)都会消失。

您可以更进一步 - 也许您希望在不同类型的系统上进行不同类型的清理,或者在某些系统上您根本不希望进行此类清理。您可以将开关构建到“bye”shell 函数中,或者创建不同的“bye1”、“bye2”,并根据某些测试(例如某个文件的存在)注册所需的开关。这就是我如何防止在我长期使用的系统上删除我的自定义配置文件,我想在其中保留相同的配置文件。

答案3

我不知道如何通过 bash_logout 来做到这一点,尽管你可以编写一个名为 exit 的小脚本,将其放入 /usr/local/bin/ 中,并使用你在问题中放入的代码类型,这样当您在控制台中输入 exit 如果您位于特定目录中,它会执行您想要的操作

相关内容