当被取消时,某些命令行界面工具会返回损坏的控制台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/test1
bash 开始,然后取消了一条命令。终端颜色现在是红色。stty -a > /tmp/test2
但是test1
和test2
完全一样。
响应此问题并不完全独立于shell。在zsh中,有一个ttyctl
内置函数,可以“冻结”或“取消冻结” tty模式。我认为bash中没有类似的东西。将setty
在tcsh的命令做同样的事情,但更细粒度:您可以冻结单独的设置。
冻结tty模式只是意味着zsh会记住当前模式,并且如果将来的某个子级更改它,则在该子级挂起或终止时将恢复该模式。
这样可以保护您免受程序崩溃或无法清理终端的某些不良影响。如果要使用进行更改stty
,则必须记住要解冻,否则外壳将立即撤消stty
所做的任何操作。
reset
除了还原stty
模式外,它还可以做一些事情,因此您有时可能会需要它,但并不经常需要。