Почему ls дает разные выходные данные при передаче по трубопроводам

Прямая печать на терминал:

$ ls a.out avg.c avg.h 

Трубопровод к cat

 $ ls | cat a.out avg.c avg.h 

Почему ls дает другой результат по назначению?

ls может фактически определить, isatty ли он терминал или файл (с isatty библиотеки isatty ). Если он обнаружит консоль, она попытается сделать ее более компактной для удобства просмотра.

ls автоматически ведет себя как ls -1 при подаче на канал.

Обычно это то, что вы хотите, когда вы соединяете ls с awk или что-то в этом роде, поскольку он будет обрабатывать вывод ls .

Чтобы переопределить это поведение по умолчанию, вы можете использовать ls -C | cat ls -C | cat .

Таким образом, каждая строка является только одной записью, позволяющей команде выводить вывод на работу, как и следовало ожидать. Например (с учетом вашего вывода ls ), следующее, вероятно, не будет тем, что вы хотите:

 $ ls | sort -r a.out avg.c avg.h 

Но поскольку sort не знала, что в строке было не более одного элемента, это ничего не могло сделать. Сравните это с тем, что на самом деле происходит:

 $ ls | sort -r avg.h avg.c a.out 

Вы можете достичь (неожиданного) первого поведения, передав -C в ls .

  • Как применить команду оболочки к каждой строке вывода команды?
  • Ошибка скрипта Bash [:! =: Ожидаемый унарный оператор
  • Bash: вывести вывод команды в фоновом режиме
  • Получить путь к файловому каталогу из пути к файлу
  • Сохранение текущего каталога в историю bash
  • Операторы равенства Баша (==, -eq)
  • Как удалить весь текст после символа в bash?
  • эхо, который выводит на stderr
  • Каково ключевое слово 'function', используемое в некоторых сценариях bash?
  • Параллелизировать скрипт Bash с максимальным количеством процессов
  • Почему мой счетчик Bash сбрасывается после цикла while
  • Давайте будем гением компьютера.