Почему в выводе скрипта (1) новая строка CR + LF (dos-style)?

В машинописном тексте команды script (т. Е. В сохраненном файле) новая строка – CR + LF (\ r \ n), хотя исходная (поданная на script ) является LF. Зачем? Кажется, это вопрос, который я вообще не знаю. Может ли кто-нибудь объяснить это без особых подробностей?

У меня нет никаких проблем; Мне просто интересно. 🙂 (Но я думаю, что лучше исправить это, или в leasd должны быть задокументированы.)

Мой script от util-linux, но, вероятно, это не имеет большого значения.

3 Solutions collect form web for “Почему в выводе скрипта (1) новая строка CR + LF (dos-style)?”

Глубокой причиной несоответствия между выходом программы и захваченным потоком tty (например, typescript ) является то, что tty использовались для печати .

Перед unix в тексте всегда был CRLF в конце строки, а не потому, что он считался логическим представлением о завершении строки, а потому, что персонажи имели индивидуальный физический смысл: переместите печатающую головку полностью влево , и продвигайте бумагу.

Unix применяет радикально новый подход: он обрабатывает текстовые файлы на диске как полезный объект (а не только инструкции для принтера) и строки как логические объекты. Двухсимвольный терминатор линии излишне усложняется в мировом представлении unix.

Но им приходилось работать с существующими аппаратными принтерами и терминальными терминалами CRT, которые не признавали ни одного символа «конец строки», а только CR, чтобы выполнить половину задания, а LF – другую половину. Таким образом, перевод должен был быть выполнен, и это было сделано в максимально возможном месте для этого оборудования – в драйвере tty.

С тех пор все это было обратной совместимостью. Таким образом, у вас есть эмулятор терминала, который настаивает на CRLF, и драйвер tty, который поставляет его, когда программа выводит новую строку.

Выход typescript захватывает все символы, отправленные в pty. Если вы используете, например, stty -opost чтобы остановить драйвер терминала от нормального изменения символа новой строки до CR + LF, вы увидите, что на выходе есть только символы LF.

Надеюсь, полезный совет, используйте

 col -b < typescript 

сделать первый проход при очистке файла.

Мой собственный ответ, после изучения ответа и комментария icarus :
Вы должны различать «новую строку в файле» и «новую строку в консоли». В консоли истинная строка новой строки является контр-интуитивно, CRLF, как мы увидим ниже.

В UNIX-конфереции в текстовых файлах LF означает новую строку, и наоборот, вы подразумеваете новую строку LF. (Под «вы имеете в виду», я имею в виду текст в естественном языке.) В DOS CR + LF и так далее. ОК. Все это знают.

(Unix) сложнее. Сначала вы должны помнить, что LF и CR являются управляющими кодами, то есть могут использоваться для управления консолью, например, полужирным шрифтом, цветом и т. Д.

Если вы подаете LF (\ n, linefeed) на консоль, вы получите новую строку. Уловка, ну, два улова: (1) Консоли двухслойные, так сказать; они состоят из фильтра и части рендеринга. (Специальная номенклатура.) Скрытый фильтр (для обычных пользователей) переводит LF в CRLF. (2) Средство рендеринга нуждается в CRLF (\ r \ n) для новой строки в обычном смысле. См. Ниже.

Файл машинописных файлов, созданный командой script (1) записывает символы после того, как вход в консоль будет отфильтрован. Вот почему строки в машинописном тексте являются CRLF.

Детали и разное. факты:

  • Консольный рендерер печатает LF как «перемещать вниз курсор на одну строку» и CR как «переместить курсор в начало строки».
  • Вы можете отключить преобразование LF-> CRLF на $ stty -opost и стереть его по $ stty opost . «opost» – это аббревиатура «Output POSTprocessing».
    • Точнее, opost делает LF-> LFCR, когда установлен onlcr . Когда onocr установлен, CR будет удаляться при начале строки и т. Д. Ref: POSIX chap 11 « Общий интерфейс терминала ».
  • К ключу «Ввод» привязан к LF в Unix, называемый «Return» в терминологии клавиатуры. (См. Этот вопрос для деталей.)
  • Существуют также варианты кода выхода; man 4 console_codes объясняет, что «ESC D» (\ eD) является переводом строки, а «ESC E» (\ eE) является новой строкой. Если вы печатаете их, «ESC D» – это «курсор перемещения вниз», а «ESC E» – CR + LF, независимо от ± opost-ness.

Чтобы сделать некоторые эксперименты, я рекомендую писать с отдельной консоли. Например, $ echo -ne '1st\n2nd\r\n3rd\n" > /dev/tty1 записывает на первую консоль, отличную от X, и /dev/pts/0 является первым X-терминалом. Это не самый удобный но наименее двусмысленным.

  • Есть ли способ добавить некоторую информацию о времени / дате в приглашение TTY?
  • Какова связь между UART и tty?
  • Как найти, какой последовательный порт используется?
  • tty мигающий курсор не в точке вставки
  • Как использовать экран, когда / dev / tty отключен?
  • tty и grub загружаются нечитабельно с nvidia K1100M на zbook 15 g2 с Intel
  • Связь между уровнями запуска и виртуальными терминалами (TTY)
  • Оптимальный способ отслеживания сеанса TTY, который блокирует ресурс?
  • Не удалось войти в tty1
  • Почему терминал отправляет CR, даже если установлен ICRNL?
  • Использовать / захватить единственную клавиатуру без локального входа в систему
  • Interesting Posts

    Создание общедоступного каталога документов для обычного пользователя

    Сценарий оболочки для создания дублированного вывода с шагом

    Чтение переменных без bash из файла в скрипт bash

    Можно ли получить доступ к фреймбуферу, чтобы поместить пиксель на экран из командной строки?

    Получить список qdiscs и фильтров, поддерживаемых инструментом tc

    Есть ли более быстрый способ поиска определенных файлов, чем поиск?

    vim: используйте другую цветовую схему при подключении через SSH

    значок google chrome в слоте gnome 3.6

    Редактирование isolinux приводит к ошибке паники ядра в Centos Live CD

    Как узнать, безопасно ли использовать torghost?

    Состояние PF сохраняется в UDP-пакетах = проблема безопасности?

    Python `read -n1 var`?

    Какова цель командной строки grub

    Инвертировать цвета в целом PDF (конвертирование)

    Как правильно установить драйвер USB-дисплея для Fresco Logic FL2000DX на Ubuntu?

    Linux и Unix - лучшая ОС в мире.