Intereting Posts
Как выполнить операцию «&» последовательно Как отредактировать только один столбец вывода из команды ls? Как запустить скрипт для получения определенного содержимого файла Как удалить строку на основе Delimeter в perl / Shell? Как предотвратить, чтобы мой CD-Ripper переписывал Неизвестный альбом, когда метаданные не могут быть найдены Как grep для нескольких шаблонов на нескольких строках? Макрос изменения языка в LibreOffice Writer Создавать самозаверяющий сертификат с датой окончания в прошлом как сделать доступную только для чтения файловую систему на busybox? как извлечь инструкции, предоставленные файлом спецификации rpm Какой поток использует перцепция? Показывать запущенные процессы с именами файлов? Unix STREAMS против стандартных streamов Что это диапазон min / max для SSH? Разница между максимальным размером резидентного набора, указанным / usr / bin / time vs. getrusage?

ls выводит несколько столбцов, даже если отправлен в grep с помощью zml-конфигурации grml

Я просто решил отдать Zsh против Bash и наткнулся на какое-то неудобное поведение, о котором я не мог найти ничего в сети:

Если вы выполните ls | grep foo ls | grep foo в Bash, ls содержит только один файл на строку, так что grep выводит только соответствующие файлы. Кажется, что-то (и поскольку я не мог найти что-либо в конфиге, я думаю, что это должен быть сам код Bash), опция -1 передается в ls .
zsh, однако, не делает эту магию: если вы передадите ls без дополнительных параметров grep , он сделает именно это, и вы также получите результат, который случайно появился в той же строке, что и совпадение.

Моя идея достичь поведения Bash в zsh заключалась бы в определении того, будет ли вывод ls передаваться в grep и определить что-то вроде псевдонима для таких случаев. Но я не уверен, как и если это вообще возможно.

Обновление. Как показано ниже, Bars не делает ничего особенного, и это действительно ls который должен работать таким образом, если выход не переходит к терминалу.

Тем не менее, вот что со мной происходит:

 > ls abcdefgh bash$ ls | grep b b zsh> ls | grep b abcdefgh 

Я смог воспроизвести это на Ubuntu 11.10 с zsh 4.3.11 и GNU coreutils 8.5, а также на машине Debian Squeeze с zsh 4.3.10.

Обновление 2: при исследовании немного больше, я обнаружил, что эта ошибка появляется только при активном grml .zshrc . Там должно быть что-то, что открывает терминал для вывода, если он подключен. Кто-нибудь знает, что искать?

Согласно документации ls , это поведение является неотъемлемой ls команды ls :

 `-1' `--format=single-column' List one file per line. This is the default for `ls' when standard output is not a terminal. 

Когда трубопровод переходит в другой процесс с | , stdout не должно быть tty. bash не делает ничего особенного.

Во всех моих тестах, используя zsh версии 4.3.15 на Linux и zsh 4.3.11 на OS X, ls ведет себя так же, как и при zsh как в bash . Если вы действительно считаете, что видите другое поведение, обновите свой вопрос с помощью (a) версии zsh которую вы используете, и (b) полного примера проблемы, показывая как фактическое содержимое каталога, так и конкретную командную строку, которую вы использование.

.zshrc к ответственной линии в .zshrc , я мог понять это сам:

На самом деле это намного проще, чем какой-то виртуальный терминал для трубопроводов. Ошибка возникает из строки 1477 конфигурации grml, которая выглядит так:

 alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "} 

Поэтому команда ls явно не вызывается напрямую, а через псевдоним. И этот явно активирует вывод столбца через опцию -C .