您是否通过输入此转义序列从字面上“结束文件”,即,交互shell会话是否像其他文件流一样被shell视为真实文件流?如果是这样,哪个文件?
或者,Ctrl+ D信号只是占位符,意味着“用户已完成输入,您可以终止输入”?
set -o ignoreeof
更改该行为。
您是否通过输入此转义序列从字面上“结束文件”,即,交互shell会话是否像其他文件流一样被shell视为真实文件流?如果是这样,哪个文件?
或者,Ctrl+ D信号只是占位符,意味着“用户已完成输入,您可以终止输入”?
set -o ignoreeof
更改该行为。
Answers:
的^D
字符(也称为\04
或为0x4,传输结束以Unicode)是默认值eof
在内核中终端或伪终端驱动器的专用控制字符参数(更精确地的tty
连接到串行或伪线路规程tty设备)。这就是传递给TCSETS / TCGETS c_cc[VEOF]
的termios
结构的ioctl
一个问题,该问题发给终端设备以影响驱动程序的行为。
发送这些命令的典型命令ioctls
是stty
命令。
要检索所有参数:
$ stty -a 速度38400波特; 第58行;列191;行= 0; intr = ^ C; 退出= ^ \; 擦除= ^ ?; 杀= ^ U; eof = ^ D ; eol = <undef>; eol2 = <未定义>; swtch = <未定义>; 开始= ^ Q; 停止= ^ S; susp = ^ Z; rprnt = ^ R; werase = ^ W; lnext = ^ V; 冲洗= ^ O; 最小值= 1; 时间= 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echo echo echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
该eof
参数仅在终端设备处于icanon
模式下时才相关。
在那种模式下,终端驱动程序(不是终端仿真器)实现了一个非常简单的行编辑器,您可以在其中键入Backspace以擦除字符,Ctrl-U擦除整行...当应用程序从终端设备读取时,直到看到任何内容,您按此键Return将read()
返回包括最后一个LF
字符的完整行(默认情况下,终端驱动程序还将终端CR
发送的内容转换Return为LF
)。
现在,如果您要发送到目前为止输入的内容而无需按Enter,那么您可以在其中输入eof
字符。从终端仿真器接收到该字符后,终端驱动程序将提交该行的当前内容,以便在其read
上进行操作的应用程序将按原样接收该LF
字符(并且不包括尾随字符)。
现在,如果当前行为空,并且假设应用程序将完全读取之前输入的行,则read
它将返回0个字符。
这表示应用程序已结束文件(当您从文件中读取时,您将进行读取直到没有更多内容可读取为止)。这就是为什么将其称为eof
字符的原因,因为发送它会使应用程序看到没有更多可用的输入。
现在,现代的shell不会在提示符下将终端设置为icanon
模式,因为它们实现了自己的行编辑器,该行编辑器比内置的终端驱动程序先进得多。但是,在他们自己的行编辑器中,为避免混淆用户,他们给^D
字符(或终端的任何eof
设置都赋予了相同的含义)(表示eof
)。
CTRL_D只是一个信号,表明这是文本流的结尾。您不以此结束文件,而是通过输入结束输入流。您也可以使用工具hexdump找到CTRL_D也不代表任何字符或字节:
# cat >test.txt
asdf# hexdump -C test.txt
00000000 61 73 64 66 |asdf|
00000004
# ll test.txt
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt