我bash
启动了一个shell,它更新了.cshrc 中的t/csh
tty 输入 ( ),但是当-ing 并返回到 bash 时,该键不再起作用。这是因为 bash 使用,我需要重置擦除 ( )。stty erase ^H
exit
backspacereadline
stty erase ^?
如果我理解trap
正确的话,似乎我可以从 t/csh 进程中捕获 t/csh 退出,并在其退出后运行命令。但是,我更希望在 bash 中进行捕获,理想情况下,它会检测到 shell 被调用/退出,然后运行脚本来重置其配置。
这是首选,因为我可以调用任意数量的 shell(例如dash
,zsh
),这可能会无意中修改特定于 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'
)。