LINUX.ORG.RU

Переносы строки в bash/shell

 , ,


0

2

Почему когда вводишь команду ls, в терминале выводится все одной строкой, а когда считываешь вывод из вима, добавляются переносы?

Вообще, в этих ваших шеллах очень все туманно в плане работы с управляющими символами. Там блин, под капотом мильены неявных преобразований каких-то, это все сильно усложняет. Как с этим всем говном разобраться? Где посмотреть простое объяснение всего для чотких пацанчиков, чтобы сильно не заморачиваться и во все это быстро въехать?

Кстати, да, идеально было бы как-то перехватывать аутпут любой программы, и смотреть на строку в ее «первозданном» виде, со всеми служебными символами. Я имею в виду как-то так ls | someprog --> foo\nbar\nbaz. Такое возможно вообще? Помогите пожалуйста.

Я вот пытаюсь, например, смотреть через ls | cat -A но выходит не совсем то что хотелось бы. Например, вместо символов перевода выводятся $. И при этом cat, по-ходу, еще добавляет свои переносы.

ls | cat -A | cat -A

bar$$
baz$$
foo$$
Но почему нельзя сразу \n????? Это возмутительно. Нахрен все это нужно? Почему нельзя увидеть просто «сырую» строку?

И я вообще, что-то не врубаюсь в логику вывода. Допустим, ls сгенерировала строку foo\nbar\nbaz, и отправила в stdin. bash читает ее из stdout, но выводит ее при этом, бес перееносов. WTF? В принципе, можно предположить, что ls к выводу добавляет что-то еще, а на выходе bash фильтрует это что-то, так чтоли получается?



Последнее исправление: ambiguousnick (всего исправлений: 8)

Но почему нельзя сразу \n????? Это возмутительно

Может, потому что это Вы указали программе cat так выводить.
man cat

...
       -A, --show-all
              equivalent to -vET
       -E, --show-ends
              display $ at end of each line
       -v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB
       -T, --show-tabs
              display TAB characters as ^I

...

смотреть на строку в ее «первозданном» виде, со всеми служебными символами

Почему нельзя увидеть просто «сырую» строку?

ls | hexdump -C
DiMoN ★★★
()
Последнее исправление: DiMoN (всего исправлений: 1)
Ответ на: комментарий от ambiguousnick

При выводе на экран - все символы обрабатываются.
Т.е. если есть в потоке перенос строки - на экране будет выполнен переход на новую строку.

Переносы строк в виде последовательности '\n':

ls | cat -E | sed -e s/\$$/\\\\n/
Всё одной строкой, со знаком «точка с запятой» в качестве разделителя:
ls | tr \\012 ';'
Ну и всё одной строкой, без переноса строк с последовательностью '\n' в качестве разделителя:
ls | cat -E | sed -e s/\$$/\\\\n/ | tr -d \\012
Вывод в файл:
ls > /tmp/ls-$$

DiMoN ★★★
()
Последнее исправление: DiMoN (всего исправлений: 2)

ты не привёл внятный юскейс, а привёл кучу нинужно
выйди и зайди нормально

zolden ★★★★★
()
Ответ на: комментарий от DiMoN

Понял. Только кавычить надо, ттначе не работает:)

Спасибо большое.

ambiguousnick
() автор топика

Почему когда вводишь команду ls, в терминале выводится все одной строкой

Потому что у тебя в алиасах bashrc не прописана опция -l.

h578b1bde ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.