LINUX.ORG.RU

Различие между конвейером и exec

 


0

1

Доброго времени суток.

Помогите, пожалуйста новичку, разобраться, в чем основная разница между передачей результатов одной команды на другую через | и через exec. Мне казалось, что вроде бы понял, но попробовал запустить банальный поиск файлов определенного размера в системе:

find / -type f -size +1G

всё отработалось без вопросов, 4 файла было найдено. Дальше решил передать их на ls

find / -type f -size +1G | ls -lah

и получил целую простыню результатов из файлов по 70, 100 и т.д. кБ (!), и среди них ни одного, которые нашла первая часть поиска. Ведь конвейер должен был передать на ls свои, 4 файла, и дальнейшая работ ls должна была быть с ними?

А вот если сделать:

find / -type f -size +1G -exec ls -lah {} \;

то здесь все без вопросов, ls отработала как положено.

Кстати, если конвейер запускать через xargs, то тоже все отрабатывается нормально:

find / -type f -size +1G | xargs ls -lah

почему же

find / -type f -size +1G | ls -lah

выводит какую-то ересь, но не сообщает об ошибках, если на то пошло?

Помогите разобраться, пожалуйста



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

-exec все последующие аргументы интерпретирует как команду и ее аргументы, которую применяет к каждому найденному результату или ко всем результатам

ls -ahl не умеет читать из stdin. у каждой команды свои заморочки. она думает что ты ей не передал аргументы, поэтому выводит содержимое текущего каталога

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

Спасибо.

Никак не могу привыкнуть, что в Linux вместо понятия единых системных и универсальных параметров, а есть индивидуальные особенности конкретных команд, которые могут вообще не так работать, как в других командах, и их надо просто зубрить.

kimalex
() автор топика
Ответ на: комментарий от kimalex

Никак не могу привыкнуть, что в Linux вместо понятия единых системных и универсальных параметров, а есть индивидуальные особенности конкретных команд

А где есть такие «системные и универсальные параметры»?

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

В данном случае всё абсолютно стандартно. Большинство команд включая ls ждут список аргументов через argv. Особенно, если речь о списке (имён) файлов. Какие-то команды принимают данные через stdin и очень небольшое число команд ждёт на stdin имена файлов (а не, например, содержимое).

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

В линуксе (а точней в юниксе) все просто и понятно и ничего зубрить не надо. Ты что-то недопонял видимо. Зачем бы ls читала что-то из stdin? Ты сам себе это представляешь? Пишешь ls а она останавливается и ждет ввода. Странно? Странно. Поэтому такого и нет.

vbr ★★★★
()

Передать вывод (stdout) одной команды на вход (stdin) другой не то же самое, что подставить вывод одной команды в качестве аргументов другой.

ls просто ожидает пути к файлам или каталогам как свои аргументы.

В ... -exec ls -lah {} результат работы find подставляется на место {}, то есть в качестве аргументов ls (в данном случае).

В ... | xargs ls -lah результат работы find принимает себе на вход xargs и подставляет эти свои входные данные в качестве аргументов ls (в данном случае).

То же самое, но проще и нагляднее, можно сделать так:

ls -lah `find / -type f -size +1G`

А зубрить ничего не надо — со временем как-то привыкаешь софту, а вернее к выражениям как к идиомам, если ты, конечно, не программист, который, наверное, должен это все глубоко понимать.

papin-aziat ★★★★★
()
Ответ на: комментарий от kimalex

Никак не могу привыкнуть

А скоро вы ещё узнаете про пробелы и прочие «неправильные символы» в именах файлов. Это касательно запуска через ″find | xargs″.

А потом вы узнаете про ″-printf″ у find, что без ls в вашем случае можно обойтисть.

А потом вы узнаете про опцию ″-or″ (ИЛИ) у find, и про то, что без скобочек она работает не так, как ожидается...

но не сообщает об ошибках, если на то пошло?

Этот тупой компьютер всегда делает то, что вы ему прикажете, а не то, что вы от него хотите :)

mky ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.