@Asparagales

В чем отличия между командой xargs и конвейером?

Здравствуйте.

Вот пример из учебника по командной строке Linux:
Команда xargs принимает входные данные со стандартного ввода и преобразует их в список аргументов для указанной команды. В данном примере ее можно было бы использовать так:

find ~ -type f -name 'foo*' -print | xargs ls -l

и далее:
Здесь вывод команды find передается по конвейеру команде xargs, которая, в свою очередь, конструирует список аргументов для команды ls и выполняет ее.


Однако у меня вопрос - разве конвейер не занимается тем же - передает данные со стандартного вывода первой команды на стандартный ввод второй команды в качестве ее аргументов? Зачем конвейеру передавать данные на xargs, а не прямо в ls ? Например, в следующем примере из того же учебника используется только конвейер:

ls -l /usr/bin | less

В чем между ними разница?
  • Вопрос задан
  • 1094 просмотра
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Для тех команд, кому список значений из пайпа нужно превратить в аргументы, xargs превращает stdin pipe в последовательность аргументов.

Примеры для понимания
$ # команда echo не работает с stdin
$ echo 1 2 3 4 5 | echo

$# команда echo работает с аргументами
$ echo 1 2 3 4 5 | xargs echo
1 2 3 4 5

$# команда cat работает с stdin
$ echo 1 2 3 4 5 | cat
1 2 3 4 5

$# команда cat работает и с аргументами, но при этом ищет файлы
$ echo 1 2 3 4 5 | xargs cat
cat: 1: No such file or directory
cat: 2: No such file or directory
cat: 3: No such file or directory
cat: 4: No such file or directory
cat: 5: No such file or directory


Вдобавок xargs позволяет обрабатывать pipe по частям, еще и парралельно.
Ответ написан
Комментировать
take
@take
я люблю любить
это хороший вопрос. я вот тоже не утруждал себя в чем разница. как-то по практике, если пайп | не работает, то xargs

англоязычный сегмент поясняет: не все команды читают standard input, например

echo $PATH | echo

даст ничего

есть программы, которые читают не вход с пайпа, а лишь ввод от пользователя или только параметры своей командной строки. так, echo понимает параметры echo a b c d . для этих случаев и нужен xargs. Он преобразует свой вход в переменные для указанной программы:

echo $PATH | xargs echo

даст на выходе желаемый результат

echo $xargoutput

ну или типа того )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы