Are you literally "ending a file" by inputting this escape sequence, i.e. is the interactive shell session is seen as a real file stream by the shell, like any other file stream? If so, which file?
Or, is the Ctrl+D signal just a placeholder which means "the user has finished providing input and you may terminate"?
Best Answer
The
^D
character (also known as\04
or 0x4, END OF TRANSMISSION in Unicode) is the default value for theeof
special control character parameter of the terminal or pseudo-terminal driver in the kernel (more precisely of thetty
line discipline attached to the serial or pseudo-tty device). That's thec_cc[VEOF]
of thetermios
structure passed to the TCSETS/TCGETSioctl
one issues to the terminal device to affect the driver behaviour.The typical command that sends those
ioctls
is thestty
command.To retrieve all the parameters:
That
eof
parameter is only relevant when the terminal device is inicanon
mode.In that mode, the terminal driver (not the terminal emulator) implements a very simple line editor, where you can type Backspace to erase a character, Ctrl-U to erase the whole line... When an application reads from the terminal device, it sees nothing until you press Return at which point the
read()
returns the full line including the lastLF
character (by default, the terminal driver also translates theCR
sent by your terminal upon Return toLF
).Now, if you want to send what you typed so far without pressing Enter, that's where you can enter the
eof
character. Upon receiving that character from the terminal emulator, the terminal driver submits the current content of the line, so that the application doing theread
on it will receive it as is (and it won't include a trailingLF
character).Now, if the current line was empty, and provided the application will have fully read the previously entered lines, the
read
will return 0 character.That signifies end of file to the application (when you read from a file, you read until there's nothing more to be read). That's why it's called the
eof
character, because sending it causes the application to see that no more input is available.Now, modern shells, at their prompt do not set the terminal in
icanon
mode because they implement their own line editor which is much more advanced than the terminal driver built-in one. However, in their own line editor, to avoid confusing the users, they give the^D
character (or whatever the terminal'seof
setting is with some) the same meaning (to signifyeof
).