Я думаю, что я могу упускать из виду относительно фундаментальный момент в отношении оболочки. Вывод команды ls по умолчанию отделяет вывод с символами новой строки, но оболочка отображает вывод в одной строке.
Кто-нибудь может мне это объяснить? Я всегда предполагал, что выходные данные были просто разделены пробелами, но теперь, когда я вижу выходные данные, разделенные новыми строками, я ожидал, что выходные данные будут отображаться в отдельных строках.
Пример:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
od показывает, что вывод разделен символами новой строки:
cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000 t e x t 1 \n t e x t 2 \n t e x t
0000020 3 \n
0000022
Если присутствуют новые строки, то почему вывод не отображается как:
text1
text2
text3
ls
. Это полезно, но явно противоречиво и удивительно. Но обратите внимание, что некоторые команды, которые производят цветной вывод, также удаляют цвета при передаче по конвейеру.ls
всегда печатает по одному на строку иlc
всегда печатает в столбцах.dpkg -l
будет использоваться вся ширина экрана, но если он печатает в канал, он предполагает, что терминал имеет ширину 80 столбцов. и сокращает вывод, чтобы он соответствовал при необходимости.Ваше открытие выдвигает на первый план основную причину, по которой анализ результатов
ls
всегда плохая идея. См. Вики Грега для полного объяснения .Подумайте о своей проблеме в обратном порядке. Вы заметили, что ls иногда делает, а иногда не печатает переводы строк между выходными данными. Для использования в сценариях или когда принудительно установлен
-1
флагом, он делает. Одна новая строка в конце каждого файла. Что нет гарантии, что каждая новая строка представляет новое имя файла . На самом деле, если имя файла содержит новую строку, вывод ls будет абсолютно не разбираться. Рассмотрим эти имена файлов:Когда вы
ls -1
каталог с этим в нем, вы получите что-то похожее на это:Разве вы не предполагаете, что там было четыре файла? Как и любые сценарии, которые анализируют вывод ls. На самом деле есть три файла, один из которых с непростым именем, но вы не сможете понять это по выводу ls. *
* Если вы не использовали
-l
флаг и не заметили, что вывод был прерван, но ваши сценарии все еще задыхались.источник
ls
,-b
опция может помочь. Превращает новую строку в\n
и т. Д.