Почему возврат каретки плохо обрабатывается в перенаправлениях?
Давайте иметь следующий код (здесь, в Python):
print("something\r any")
При запуске в консоли это правильно выдает:
anything
(после печати something
, каретка возвращается к началу той же строки, а затем перезаписывает первые четыре символа any
)
Однако та же команда в перенаправлении выдаст:
something
any
что неверно. Почему это так? Есть ли что сказать оболочке переписать текущую строку при перенаправлении?
По поводу определения ЧР и НЧ:
Перевод строки означает перемещение на одну строку вперед. Код \ n. Возврат каретки означает перемещение курсора в начало строки. Код является \ r.
2 ответа
Когда вы перенаправляете вывод, байты записываются в место назначения без обработки. Как вы себе представляете, например, последовательности ANSI для манипулирования цветом могут быть "обработаны" при перенаправлении? То же самое с ЧР. Это просто написано для вывода.
Приложения могут обнаружить, что они не подключены к реальному tty устройству, и выбрать другой режим, "обрабатывая" коды внутри. Возможно, приложения ncurses делают это, но я считаю, что это вежливость.
С другой стороны, когда вы cat
или же type
в этом захваченном файле необработанные коды будут обрабатываться устройством tty.
Возврат каретки должен вернуть курсор к левому полю. Это основная функциональность. Предполагается, что перевод строки перемещает курсор вниз на одну строку. Некоторые программные / аппаратные средства выполняют только основные функции. Однако другие программные / аппаратные средства обрабатывают возврат каретки и / или перевод строки без строки как пару возврат каретки / перевод строки. То, что вы видите, - это вариации этого поведения.
Различные операционные системы и другое программное обеспечение используют в качестве ограничителя строки либо возврат каретки, либо перевод строки. Обычно они визуализируют терминатор строки, продвигаясь к началу следующей строки. Поведение требует, чтобы консоль вставляла возврат каретки при отправке перевода строки. Попробуйте запустить вашу программу после отключения этого поведения с помощью команды stty -onlcr
, Это может быть отменено с помощью команды stty onlcr
или же stty sane
,
Вывод оператора print не обрабатывается и дает правильный вывод на консоли. Если вы использовали другой терминал, вы можете получить те же результаты, что и при его обработке во время передачи.