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

vol*_*ron 7 linux bash shell tcsh

bash我启动一个t/cshshell,它更新stty erase ^H.cshrc 中的 tty 输入 ( ),但是当exit-ing 并返回到 bash 时,backspace密钥不再起作用。这是因为 bash 使用readline,我需要重置擦除 ( stty erase ^?)。

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

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


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

Flo*_*Fox 7

你在正确的轨道上trap。你想要的是以下内容:

trap "stty erase ^?" SIGCHLD
Run Code Online (Sandbox Code Playgroud)

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

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

SIGCHLD 每当子进程退出时发送到父进程。


另一种方法是将您的另一个 shell 包装在脚本中,例如:

#!/bin/sh
tcsh
stty erase ^?
Run Code Online (Sandbox Code Playgroud)

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