Я читал "Система разделения времени UNIX Деннис М. Ритчи и Кен Томпсон" статья и в качестве примера перенаправления стандартного ввода/вывода приводится пример редактора ed:
Команда
ed <script
интерпретирует скрипт как файл команд редактора; таким образом, «<script
» означает «взять входные данные изscript
».
Однако если я попробую сделать то же самое с помощью vim, то получу сообщение об ошибке «Ошибка чтения входных данных»:
[m@localhost rough]$ vim t2 <t
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Почему это так?
решение1
ed
и ex
естьредакторы строк. Они имеют своего рода пользовательский интерфейс, которым можно управлять с помощью строк в текстовом файле.
vi
и все его клоны, такие как VIM,полноэкранные редакторы. Они имеют пользовательские интерфейсы, которые не обрабатывают ввод и вывод как строки текстового файла. Ввод — это отдельные символы и последовательности символов, не сгруппированные в строки. Вывод — это отдельные символы и управляющие последовательности для рисования на видеотерминале.
Модельпользовательский ввод/выводпоскольку текстовые файлы не отображаются в интерактивных полноэкранных программах TUI, не говоря уже о программах с графическим интерфейсом.
То, какое поведение вы получите, варьируется от программы к программе. Некоторые полноэкранные программы TUI распознают, когда их стандартный ввод не является терминалом, и прерывают работу, как это nvi
и происходит. Другие, такие как VIM, выдадут предупреждение, но будут рассматривать нетерминальный входной файл как терминальный ввод, что приведет к несколько странному поведению для людей, которые ожидают, что ввод будет рассматриваться как команды скрипта. Другие, например less
, явно открывают терминальное устройство для пользовательского интерфейса и не используют стандартный ввод-вывод для (его входной части). Другие же, как большинство оболочек (которые, заметьте, имеют интерактивные пользовательские интерфейсы, выходящие за рамки строчного режима), переходят в неинтерактивный режим.
Статья, написанная о Unix в 1974 году, не будет хорошим руководством по разнице между пользовательскими интерфейсами в строчном режиме и полноэкранными пользовательскими интерфейсами. Возможно, первый редактор Unix для видеотерминалов, Джордж Кулурис em
, был годом позже. Также в будущем были termcap, оболочки с (своим) редактированием командной строки и дисциплины строк по умолчанию, которые использовали неграфические специальные символы.