2

Давайте иметь следующий код (здесь, в Python):

print("something\r any")

При запуске в консоли это правильно выдает:

 anything

(после печати something каретка возвращается к началу той же строки, а затем перезаписывает первые четыре символа any)

Однако та же команда в перенаправлении выдаст:

something
 any

что неверно. Почему это так ? Есть ли что сказать оболочке переписать текущую строку при перенаправлении?

По поводу определения ЧР и НЧ:

Перевод строки означает перемещение на одну строку вперед. Код \n. Возврат каретки означает перемещение курсора в начало строки. Код является \r.

2 ответа2

3

Когда вы перенаправляете вывод, байты записываются в место назначения без обработки. Как вы себе представляете, например, последовательности ANSI для манипулирования цветом могут быть "обработаны" при перенаправлении? То же самое с ЧР. Это просто написано для вывода.

Приложения могут обнаружить, что они не подключены к реальному tty устройству, и выбрать другой режим, "обрабатывая" коды внутри. Возможно, приложения ncurses делают это, но я считаю, что это вежливость.

С другой стороны, когда вы cat или type этот захваченный файл, необработанные коды будут обрабатываться устройством tty.

-1

Возврат каретки должен вернуть курсор к левому полю. Это основная функциональность. Предполагается, что перевод строки перемещает курсор вниз на одну строку. Некоторые программные / аппаратные средства выполняют только основные функции. Однако другие программные / аппаратные средства обрабатывают возврат каретки и / или перевод строки без строки как пару возврат каретки / перевод строки. То, что вы видите, - это вариации этого поведения.

Различные операционные системы и другое программное обеспечение используют в качестве ограничителя строки либо возврат каретки, либо перевод строки. Они обычно отрисовывают терминатор строки, продвигаясь к началу следующей строки. Поведение требует, чтобы консоль вставляла возврат каретки при отправке перевода строки. Попробуйте запустить вашу программу после отключения этого поведения с помощью команды stty -onlcr . Это можно отменить с помощью команды stty onlcr или stty sane .

Вывод оператора print не обрабатывается и дает правильный вывод на консоли. Если вы использовали другой терминал, вы можете получить те же результаты, что и при его обработке во время передачи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .