Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell echo在Unix中是如何工作的_Shell_Unix_Echo - Fatal编程技术网

Shell echo在Unix中是如何工作的

Shell echo在Unix中是如何工作的,shell,unix,echo,Shell,Unix,Echo,当我键入任何键时,通常会立即回显到std输出,即我的屏幕 如果我必须输入密码,也就是说它不会回显,我就看不到我键入的密钥 这是如何工作的 是否每个按键都会立即进入内核(我没有按ENTER键),然后内核决定是否回显它们? 比如,我按下“A”,它进入内核;内核与之相呼应;我在屏幕上看到了。现在我又按了“B”…同样的顺序。。。;现在我的屏幕上有了“AB”(我的命令)并点击回车键;我的命令进入内核并最终执行 还有其他解释吗?按键过程中后台会发生什么?您的键盘会生成电信号,这些电信号最终被解释为与字母“A

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

如果我必须输入密码,也就是说它不会回显,我就看不到我键入的密钥

这是如何工作的

是否每个按键都会立即进入内核(我没有按ENTER键),然后内核决定是否回显它们? 比如,我按下“A”,它进入内核;内核与之相呼应;我在屏幕上看到了。现在我又按了“B”…同样的顺序。。。;现在我的屏幕上有了“AB”(我的命令)并点击回车键;我的命令进入内核并最终执行


还有其他解释吗?按键过程中后台会发生什么?

您的键盘会生成电信号,这些电信号最终被解释为与字母“A”、“B”、功能键F1、F2等相对应的按键代码。这一切都发生在由内核处理的键盘驱动程序中。该键盘驱动程序有一个缓冲区,用于接收来自键盘的所有按键,并将其发送到内核,内核反过来将它们定向到当前具有焦点的进程。如何处理按键顺序完全由单个应用程序决定,例如是否显示按键。

echo
程序是
coreutils
的一部分。你可以下载它的来源。看看
src/echo.c
它非常小。您可以看到
echo
使用
fputc
putchar
调用。这些调用处理名为
stdout
的标准流。标准流的体系结构非常复杂,超出了本文的范围。例如,您可以使用
google

找到它。内核中的终端驱动程序可以放在几种模式下(实际上有更多的标志,而现在的“cbreak”实际上是不同标志的反面,因此这是简化的)

“cbreak”模式意味着试图从终端读取的进程将在键盘输入可用时立即接收键盘输入。当cbreak模式关闭时,内核将数据存储在缓冲区中,直到按下enter键,并且内核将处理诸如backspace之类的某些键(当您按下backspace时,它将从缓冲区中删除字符,如果echo模式打开,则将“backspace backspace”写入终端,以用空格覆盖字符)

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

有几种典型情况:

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

正在运行的程序会告诉内核使用
termios
函数将其置于何种模式。您可以在shell环境中使用
stty
命令执行相同的操作,但请注意,这可能会干扰shell自身的输入处理或您运行的程序预期的默认状态由shell而不是内核解释。将stdout和屏幕混为一谈是一个错误。stdout不是你的屏幕。stdin不是你的键盘。有时,进程的stdout流与屏幕相关联。有时,stdin与键盘相关联。但它们不一样。别以为它们是。@Reddy。是的。我知道命令是这样的由shell解释。我说的是击键。@Pursel。这就是为什么我写了“I.e.my screen.”,因为stdout也可能是一个文件。啊,我错过了smthng。原谅我,如果echo模式打开,写“backspace space backspace”:你能解释一下吗?为什么不写一个简单的“backspace”回显到终端。额外的“space backspace backspace”不是吗无效?@dams打印退格只会将光标向左移动,不会擦除字符。