Попробуйте echo "$res" | hexdump -C
илиhexdump -C /tmp/res.txt
-Бьюсь об заклад, вы увидите много шестнадцатеричных 0d
байтов (возвратов каретки ), по одному до или после каждого \
, |
, /
, и -
.
Почему? Возврат каретки -без перевода строки -возвращает курсор в начало строки, и все, что напечатано после него, перезаписывает то, что уже было там.
Это распространенный способ реализации счетчика текста в начале строки. (Если это делается в конце строки, хитрость заключается в том, чтобы НЕ печатать LF или CR, а использовать символ Backspace (^H
, также известный как Ctrl-H , символ ASCII 0x08 )после каждого из символов счетчика, часто с небольшой задержкой в начале.
Примечание :Нередко также можно увидеть последовательности управления терминалом, такие как «Стереть строку»(<ESC>[2K
или шестнадцатеричный 1b 5b 32 4b
на терминале, совместимом с vt -100 )или «Стереть до конца строки»(ESC[K
или шестнадцатеричный1b 5b 4b
)возле каждого возврата каретки. В данном случае это маловероятно, потому что они, вероятно, появятся в каком-то искаженном виде в редакторе Windows.
Другими словами, символы являются в выводе, просто они перезаписываются слишком быстро, чтобы вы могли заметить. Ваш редактор Windows, вероятно, "услужливо" конвертирует CR в CR -LF.
Кстати, в Unix LF используется только для окончания строки текста. Windows использует CR -LF. Старые, до -unix, Mac использовали только CR.
Это не странно. Терминальное устройство просто имеет эхо с установленным флагом echoctl
в линейной дисциплине. Обычно линейная дисциплина терминального устройства сбрасывается в «нормальное» состояние любой программой, открывающей терминал и связывающейся с login
, которая сильно различается в общем случае, но, вероятно, является одной из многих программ getty
в вашем случае. (Другие возможности: systemd или vc-reset-tty
, например; или ttymon, если вы выходите за рамки операционных систем Linux. )Узнайте, какую программу вы используете и почему она не сбрасывается echoctl
.
vc-reset-tty
. Направляющая ноша . Программное обеспечение.