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

437
Synxis

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

print("something\r any") 

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

 anything 

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

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

something any 

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

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

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

2

2 ответа на вопрос

3
Maximus

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

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

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

Ну, я думаю, что было бы вполне приемлемо, чтобы обработка выполнялась в перенаправлении, например, просто отбрасывая цветовые коды (и правильно обрабатывая CR) Synxis 8 лет назад 0
Ну, как вы себе это представляете, когда перенаправляете вывод на устройство, обеспечивающее только последовательный доступ (напишите в нашем случае)? Тип пишущие или CD-R, DVD-R пишущие являются примером. Приложение не знает, что будет дальше, оно не может предсказать, когда появится CR без LF. Итак, вы ожидаете увидеть в каждом приложении, которое вы когда-либо запускаете, возможность кешировать вывод? А как насчет строк, содержащих килобайты и мегабайты, которые идеально подходят для скриптов xml / json /? Это будет любезно предоставлено некоторыми приложениями без какой-либо гарантии ... p Maximus 8 лет назад 0
Оболочка может независимо буферизовать последнюю неопределенную строку для такого случая, но у вас есть точка с огромными строками xml / json. Может быть, должен быть вариант для этого ... Synxis 8 лет назад 0
-1
BillThor

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

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

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

Похожие вопросы