2011-12-21 4 views
8

Печати на терминал непосредственно:Почему Ls дают различные результаты при конвейере

$ ls 
a.out avg.c avg.h 

Труба для cat

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

Почему ls дает различный выход, основанный на месте назначения?

+0

FWIW, я считаю это поведение сломанным. Заслуживаемая временем традиция легко объединять огромные конвейеры команд намного сложнее, когда указанные команды меняют свой вывод, когда его отправляют в разные места. – paxdiablo

ответ

6

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

+0

найти веб-страницу: http://www.ginac.de/~kreckel/fileno – kev

6

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

Это, как правило, то, что вы хотите, когда вы обжигающе ls к awk или что-то подобное, так как он будет относиться к выходной ls на основе линии построчно.

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

+0

Кроме того, он не использует цвета при подаче питания. Поэтому, если вам нужны яркие коды эвакуации, вы можете использовать 'ls -C --color = yes | cat'. Это может быть полезно с помощью 'ls -C --color = yes | меньше -R' –

1

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

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

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

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

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

Смежные вопросы