Если я сделаю
$ cat > file.txt
текст Ctrl- DCtrl-D
Вопрос 1: Если я не нажимаю ввод, почему я должен нажать Ctrl- Dдважды?
Если я сделаю
$ cat > file.txt
па бам пшхх Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
$ cat > file.txt
па бам пшхх
Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
pa bam pshhh
Почему второй раз файл с 1 строкой?
command-line
terminal
cat
туман
источник
источник
cat
остановке?Ответы:
В Unix большинство объектов, которые вы можете читать и записывать - обычные файлы, каналы, терминалы, жесткие диски - все они напоминают файлы.
Программа вроде
cat
читает из своего стандартного ввода вот так:который просит 512 байт.
n
количество фактически прочитанных байтов, или -1, если есть ошибка.Если вы делали это неоднократно с обычным файлом, вы получите кучу 512-байтовых чтений, затем несколько более короткое чтение в конце файла, затем 0, если вы попытались прочитать после конца файла. Итак,
cat
будет работать до тех пор, пока неn
станет <= 0.Чтение из терминала немного отличается. После ввода строки, оканчивающейся Enterклавишей,
read
возвращается только эта строка.Есть несколько специальных символов, которые вы можете напечатать. Один есть Ctrl-D. Когда вы набираете это, операционная система отправляет всю введенную вами текущую строку (но не Ctrl-Dсаму) в программу, выполняющую чтение. И вот случайная вещь: если Ctrl-Dэто первый символ в строке, программе отправляется строка длиной 0 - точно так же, как программа увидит, добралась ли она до конца обычного файла.
cat
не нужно ничего делать иначе , будь то чтение из обычного файла или из терминала.Еще один особый персонаж Ctrl-Z. Когда вы набираете его в любом месте строки, операционная система отбрасывает все, что вы набрали, до этой точки и отправляет сигнал SIGTSTP в программу, которая обычно останавливает (приостанавливает) его и возвращает управление оболочке.
Так в вашем примере
Вы набрали несколько символов, которые были отброшены, а затем
cat
остановлены, ничего не записав в его выходной файл.Вы набрали одну строку, которая
cat
прочитала и записала в свой выходной файл, а затем Ctrl-Zостановиласьcat
.источник
cat
, то программа, которая считывала данные с клавиатуры и не остановилась с первого раза, когда былread
получен ноль, могла бы продолжаться, и количество требуемых элементов управления D будет определяться количество последовательных нулей, необходимое программе, чтобы решить, было ли это сделано?ex
редакторе, если вы введете control-D в качестве первого символа строки, редактор покажет вам несколько строк программы вместо выхода. (Вex
иvi
, Control-D является мнемоникой для «вниз»). И во многих оболочках, если вы набираете Control-D, но у вас есть задания, работающие в фоновом режиме, оболочка проинформирует вас об этом, а не о выходе, но если вы введете Control-D снова, оболочка решит, что вы действительно хотите выйти в любом случае и будет делать так.Это потому, что Ctrl+ Dэто хак.
В глубине души Ctrl+ D(несмотря на то, что он называется
eof
символом ) на самом деле не означает конец файла: он означает «отправить ожидающий ввод приложению сейчас». Это на самом деле близко к значению Ctrl+ M(eol
), который отправляет ожидающий ввод плюс символ новой строки.Когда вы нажимаете Ctrl+ Dсразу после Ctrl+ M(то есть в начале строки) или после другого Ctrl+ D, ожидающий ввод будет пустым. Таким образом, приложение получает 0 байтов ввода. При
read
вызове чтение 0 байтов означает конец файла.Когда вы нажимаете Ctrl+ Z, ожидающий ввод сбрасывается. Таким образом обрабатывается только то, что уже было отправлено в приложение (то есть
cat
) путем ввода новой строки или Ctrl+ Dперед нажатием Ctrl+ Z.источник