echo如何在Unix中实际工作

dam*_*ams 4 unix shell echo

当我键入任何键时,通常会立即回显到std输出iemy screen.

如果我必须输入密码,表示它不会回显,我看不到我键入的密钥.

这是如何运作的.

每个按键是否立即进入内核(没有按下ENTER),然后内核决定是否回显它们?就像,我按'A',它进入内核; 内核回应它; 我在屏幕上看到它.现在我再次点击'B'...同样的序列...; 现在我的屏幕上有'AB'(我的命令)然后点击ENTER; 我的命令进入内核并最终执行.

还有其他解释吗?按键期间后台会发生什么?

Ran*_*832 5

内核中的终端驱动程序可以放在几种模式中(实际上有比这更多的标志,而现在"cbreak"实际上是不同标志的反面,所以这简化了).

"cbreak"模式意味着尝试从终端读取的进程将在可用时立即接收键盘输入.当cbreak模式关闭时,内核将数据存储在缓冲区中,直到输入被按下,并且某些键如退格键由内核处理(当您按退格键时,它会从缓冲区中删除字符,并且 - 如果回显模式为on - 将"backspace-space-backspace"写入终端以用空格覆盖该字符.

回声模式意味着无论何时用户按下某个键,内核都会立即将其回显给屏幕.当它关闭时,屏幕上不会回显任何内容,如果希望您看到它,程序将需要将其写入终端.

有几种典型的情况:

  • 在进行高级输入处理的程序中(如大多数shell,或类似全屏程序),cbreak打开并且echo关闭; 如果它不是特殊键转义序列的一部分,程序将把字符写入终端本身.
  • 在大多数情况下[默认使用一个简单的程序读取标准输入并写入标准输出],回显打开,cbreak关闭.当你键入时,它的行为与我上面描述的一样,所有这些都由内核处理,直到你按Enter键并将它发送给应用程序.输入编辑仅限于退格[和ctrl-u,ctrl-w],尝试使用箭头键只会将转义序列^[[D放在输入行中.
  • 当读取密码时,回声关闭,cbreak关闭.输入的工作方式与默认情况类似,但内核不会将输入复制到屏幕上.

正在运行的程序告诉内核将哪些模式与termios函数一起使用.您可以使用该stty命令在shell环境中执行相同操作,但请注意,这可能会干扰shell自己的输入处理或您运行的程序期望默认状态.