如何使用 Ctrl + D (EOF) 跟踪命令

如何使用 Ctrl + D (EOF) 跟踪命令

我想运行一些命令并给出明确的Ctrl+ D,就像说:

ls;pwd;^D

不幸的是,上面的方法不起作用。我也尝试过\040x4代替^D上面提到的这里。这些也行不通。我怎样才能实现这个目标?另外,这与以下内容有何不同:

ls;pwd;exit

答案1

部分解释了斯特凡·查泽拉斯的回答,所以我会尝试引用相关部分:

现在,如果当前行为空,并且应用程序已完全读取先前输入的行,则将read返回 0 个字符。

这意味着文件结尾到应用程序(当您从文件中读取时,您会一直读取,直到没有更多内容可读取为止)。这就是它被称为eof字符的原因,因为发送它会导致应用程序看到没有更多的输入可用。

现在,现代 shell 在提示时不会将终端设置为 icanon模式,因为它们实现了自己的行编辑器这比内置的终端驱动程序先进得多。然而,在他们自己的行编辑器,为了避免混淆用户,他们赋予 ^D字符(或终端的任何eof设置)相同的含义(表示eof)。

最后一行需要更多的澄清。从Bash 行编辑器 readline 的文档

end-of-file(通常是镉)
指示文件结束符的字符设置,例如,由stty。如果在该行中没有字符时读取该字符,并且 point 位于该行的开头,则 Readline 会将其解释为输入的结尾并返回 EOF。

因此,对于 readline(以及大多数其他 shell),Ctrl-D只是行开头的 EOF。因此,即使您确实设法在该行末尾添加Ctrl- ,它也不会被视为 EOF。D

而 EOF 是否会让你的交互式 shell 退出也是一个不同的问题。对于 bash,这是由IGNOREEOF变量和set -o ignoreeof选项控制的。这变量的文档说:

控制 shell 在收到 EOF 字符作为唯一输入时的操作。如果设置,该值表示在 shell 退出之前可以作为输入行上的第一个字符读取的连续 EOF 字符数。如果变量存在但没有数值,或者没有值,则默认值为 10。如果变量不存在,则 EOF 表示 shell 输入结束。这仅对交互式 shell 有效。

例子:

bash-5.0$ IGNOREEOF=
bash-5.0$ <Ctrl-D> Use "exit" to leave the shell.
bash-5.0$ <Ctrl-D> Use "exit" to leave the shell.
bash-5.0$ <Ctrl-D> Use "exit" to leave the shell.
bash-5.0$

再进行7次,终于退出了。


我真的不认为这个有任何用处。如果您想在这些命令结束时退出 shell,只需使用exit.

相关内容