某些命令行界面工具在被 取消时会返回损坏的控制台CTRL+C
。有时,在运行命令之前,文本是不可见的,或者存在图形问题reset
。
(我使用 bash,但希望它独立于 shell。)
这个效果有名字吗?是什么原因导致这种情况,程序员如何在工具中防止这种情况发生?主要编程语言是否有解决这个问题的策略?
答案1
控制台有时需要一个reset(1)
(或一些stty(1)
命令),因为当某个进程(例如由 shell 启动的程序)终止时,伪终端的状态不会改变。
阅读tty 揭秘。
(我发现处理伪终端和pseudottys是Linux中最困难的部分)
主要编程语言是否有解决这个问题的策略?
处理终端并更改其模式或线路规则的行为良好的程序应尽力避免崩溃并发出适当的调用(请参阅术语(3)) 将终端置于正确的状态。顺便说一句,图书馆喜欢恩诅咒或者阅读线很有帮助(但您需要适当地调用它们的清理例程)。
看信号(7)和信号安全(7)。避免代码崩溃是很困难的。阅读未定义的行为。
一个不完美的解决方法可能是定义一个 shell 函数来运行您的程序,然后执行 a reset
(有时可能不合适)。
答案2
解决这个问题并不完全独立于 shell。在 zsh 中,有一个ttyctl
内置函数,可以“冻结”或“解冻”tty 模式。我认为 bash 中没有类似的东西。 tcsh 中的命令setty
执行相同的操作,但粒度更细:您可以冻结各个设置。
冻结 tty 模式只是意味着 zsh 将记住当前模式,如果将来的某个子进程更改了它,则当子进程挂起或终止时,该模式将恢复。
这将保护您免受崩溃或无法清理终端的程序的一些不良影响。如果您想使用 进行更改stty
,则必须记住解冻,否则 shell 会立即撤消您stty
所做的任何操作。
reset
不仅仅是恢复stty
模式,所以有时您可能仍然需要它,但不是经常需要。