echo如何在Unix中实际工作

时间:2011-12-12 13:44:32

标签: shell unix echo

当我键入任何键时,通常会立即回显到std输出,即我的屏幕。

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

这是如何运作的。

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

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

3 个答案:

答案 0 :(得分:5)

内核中的终端驱动程序可以放在几种模式中(实际上有更多的标志,而这些天“cbreak”实际上与另一个标志相反,所以这简化了。)

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

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

有几种典型情况:

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

正在运行的程序告诉内核使用termios函数将其置于何种模式。您可以使用stty命令在shell环境中执行相同的操作,但请注意,这可能会干扰shell自己的输入处理或您运行的程序预期默认状态。

答案 1 :(得分:1)

您的键盘会生成电子信号,最终会被解释为与字母对应的键码 - “A”,“B”,功能键F1,F2等。这一切都发生在内核处理的键盘驱动程序中。该键盘驱动程序有一个缓冲区,用于从键盘接收所有按键并将其发送到内核,然后内核将其引导到当前具有焦点的进程。如何处理键序列完全取决于各个应用程序,例如是否显示键。

答案 2 :(得分:-1)

echo计划是coreutils的一部分。您可以下载其来源here。看src/echo.c它很小。您可以看到echo使用fputcputchar来电。这些调用处理名为stdout的标准流。标准流的体系结构非常复杂,超出了这篇文章的范围。您可以使用例如google找到它。