Почему возврат каретки плохо обрабатывается в перенаправлениях?

Давайте иметь следующий код (здесь, в 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 не обрабатывается и дает правильный вывод на консоли. Если вы использовали другой терминал, вы можете получить те же результаты, что и при его обработке во время передачи.

Другие вопросы по тегам