当被取消时,某些命令行界面工具会返回损坏的控制台CTRL+C。有时文本是不可见的,或者是图形问题,直到我运行命令为止reset。
(我使用bash,但希望它独立于shell。)
这个效果有名字吗?是什么原因造成的,程序员如何在工具中防止这种情况发生?是否有一种策略可以在主要的编程语言中解决该问题?
stty sane为灰胡子
当被取消时,某些命令行界面工具会返回损坏的控制台CTRL+C。有时文本是不可见的,或者是图形问题,直到我运行命令为止reset。
(我使用bash,但希望它独立于shell。)
这个效果有名字吗?是什么原因造成的,程序员如何在工具中防止这种情况发生?是否有一种策略可以在主要的编程语言中解决该问题?
stty sane为灰胡子
Answers:
控制台有时需要一个reset(1) (或某些stty(1)命令),因为当某些进程(例如,由Shell启动的程序)终止时,伪终端的状态不会改变。
(我发现伪终端和伪 tty 的处理是Linux中最困难的部分)
是否有一种策略可以在主要的编程语言中解决该问题?
行为规范的程序可以处理终端并更改其模式或线路规则,应尽力避免崩溃并发出适当的调用(请参阅termios(3))以将终端置于正确的状态。顺便说一句,ncurses或readline之类的库很有用(但是您需要适当地调用它们的清理例程)。
参见signal(7)和signal-safety(7)。避免代码崩溃很困难。阅读有关未定义行为的信息。
一个不完善的解决方法可能是定义一个外壳程序功能,该程序运行您的程序然后执行一个reset(有时可能不合适)。
reset可能会导致stty与原始设置不同的设置。
stty -a > /tmp/test1bash 开始,然后取消了一条命令。终端颜色现在是红色。stty -a > /tmp/test2但是test1和test2完全一样。
响应此问题并不完全独立于shell。在zsh中,有一个ttyctl内置函数,可以“冻结”或“取消冻结” tty模式。我认为bash中没有类似的东西。将setty在tcsh的命令做同样的事情,但更细粒度:您可以冻结单独的设置。
冻结tty模式只是意味着zsh会记住当前模式,并且如果将来的某个子级更改它,则在该子级挂起或终止时将恢复该模式。
这样可以保护您免受程序崩溃或无法清理终端的某些不良影响。如果要使用进行更改stty,则必须记住要解冻,否则外壳将立即撤消stty所做的任何操作。
reset除了还原stty模式外,它还可以做一些事情,因此您有时可能会需要它,但并不经常需要。