bash 是否有一个钩子来确定子 shell 何时退出?

bash 是否有一个钩子来确定子 shell 何时退出?

bash启动了一个shell,它更新了.cshrc 中的t/cshtty 输入 ( ),但是当-ing 并返回到 bash 时,该键不再起作用。这是因为 bash 使用,我需要重置擦除 ( )。stty erase ^Hexitbackspacereadlinestty erase ^?

如果我理解trap正确的话,似乎我可以从 t/csh 进程中捕获 t/csh 退出,并在其退出后运行命令。但是,我更希望在 bash 中进行捕获,理想情况下,它会检测到 shell 被调用/退出,然后运行脚本来重置其配置。

这是首选,因为我可以调用任意数量的 shell(例如dashzsh),这可能会无意中修改特定于 bash 的设置。与其trap为每个 shell 维护多个命令,不如为 bash 维护一个命令。


我的理解trap正确吗?如果正确,是否可以bash检测子 shell 退出然后运行脚本?

答案1

您的思路是对的trap。您想要的是以下内容:

trap "stty erase ^?" SIGCHLD

您可以将其添加到.bashrc。请注意,这将在以下情况下运行任何子进程结束。

这仅适用于交互式会话。对于非交互式会话,bash 不会启用作业控制默认情况下,所以您需要set -o monitor先运行。但我怀疑您在非交互式脚本中是否需要退格键。

SIGCHLD每当子进程退出时就会发送给父进程。


另一种方法是将其他 shell 包装在脚本中,例如:

#!/bin/sh
tcsh
stty erase ^?

然后,如果您通过脚本启动 shell,脚本将stty erase在 shell 退出后运行命令。与全局trap处理程序相比,这不太可能产生副作用,但当然,只有您每次都通过脚本启动时才会起作用(或创建别名来执行此操作,例如alias 'tcsh' '~/launch-tcsh.sh')。

相关内容