У меня есть Ubuntu 16.04 LTS и когда я выполняю что-то в терминале как md5sum
это ожидает моего входа, и я ввожу что-то как Hello
но когда я нажимаю CTRL+D, он не завершается, и я должен потребовать у CTRL+D второго раза для завершения этого! почему?
В Unix большинство объектов можно читать и записать - обычные файлы, каналы, терминалы, диски неструктурированного диска - все сделаны напомнить файлы.
Программа как
cat
чтения от его стандартного входа как это:n = read(0, buffer, 512);
который просит 512 байтов.
n
число байтов на самом деле чтение, или-1, если существует ошибка.Если бы Вы неоднократно делали это с обычным файлом, то Вы получили бы набор 512 побайтовых чтений, то несколько более короткое чтение в заключительной части файла, то 0, если бы Вы пытались читать мимо конца файла. Так,
cat
будет работать доn
<= 0.Чтение из терминала немного отличается. После ввода в строке, завершенной клавишей Enter,
read
возвраты просто та строка.Существует несколько специальных символов, которые можно ввести. Каждый - Ctrl-D. При вводе этого операционная система отправляет всю текущую строку, которую Вы ввели (но не сам Ctrl-D) к программе, делающей чтение. И вот случайная вещь: если Ctrl-D является первым символом на строке, программа отправляется строку длины 0 - точно так же, как программа видела бы, добралось ли это просто в конец обычного файла.
cat
ничего не должен делать по-другому, читает ли это из обычного файла или терминала.Другой специальный символ является Ctrl-Z. При вводе его, где угодно в строке, операционная система отбрасывает то, что Вы ввели вплоть до той точки, и отправляет сигнал SIGTSTP в программу, которая обычно останавливает (паузы) его и возвращает управление оболочке.
Таким образом в Вашем примере
$ cat > file.txt pa bam pshhh<Ctrl+Z> [2]+ Stopped cat > file.txt
Вы ввели некоторые символы, которые были отброшены, затем
cat
был остановлен не записав что-либо в его выходной файл.$ cat > file.txt pa bam pshhh <Ctrl+Z> [2]+ Stopped cat > file.txt
Вы ввели в одной строке, который
cat
читайте и записал в его выходной файл и затем остановленный Ctrl-Zcat
.
Источник: Ctrl+D для конечного терминального входа строки отвечают Mark Plotnick