Чтобы лучше понять xargs - PullRequest
3 голосов
/ 14 июля 2009

Я хочу понять использование xargs man в коде Рэмпиона :

screen -t man /bin/sh -c 'xargs man || read'

Благодаря Rampion: нам не нужен кот!

Зачем нам xargs в команде?

Я понимаю xargs -часть следующим образом

  1. кот ничего не xargs
  2. xargs составляет список команд человека

У меня была идея, что xargs составляет список команд. Например,

find . -type f -print0 | xargs -0 grep masi 

совпадает со списком команд:

find fileA AND grep masi in it 
find fileB AND grep masi in it 
           and so on for fileC, fileD, ...

Ответы [ 3 ]

4 голосов
/ 14 июля 2009

Нет, я не cat ничего. Я получаю любой ввод после запуска команды. cat на самом деле здесь посторонний, поэтому давайте проигнорируем это.

xargs man ожидает ввода пользователя. Что необходимо Поскольку в сценарии, из которого вы это получили, я не могу вставить аргумент для man до тех пор, пока не создам окно. Поэтому команда, которая запускается в окне, должна подождать, пока я что-то ей дам, прежде чем она попытается запустить man.

Если бы мы просто запустили screen /bin/sh -d 'man || read', он всегда жаловался бы: «Какую страницу руководства вы хотите?» так как мы никогда не говорили это.

3 голосов
/ 14 июля 2009

Команда cat не работает ни с чем; он работает на стандартном вводе, пока не будет сказано, что ввод окончен. Как отмечает Rampion, команда cat здесь не нужна, но она работает на своем неявном входе (стандартном вводе), а не на ничем.

Команда xargs считывает выходные данные из cat и группирует информацию в аргументы в команду man, указанную в качестве ее (единственного) аргумента. Когда он достигает предела (настраивается в командной строке), он выполняет команду man.

Идиома find ... -print0 | xargs -0 ... имеет дело с именами файлов, которые содержат неуклюжие символы, такие как пробелы, символы табуляции и новые строки. Команда find печатает каждое имя файла, за которым следует ASCII NUL ('\0'); это один из двух символов, которые не могут отображаться в простом имени файла, другой - «/» (конечно, в именах путей, но не в простых именах файлов). Это не прямо соответствует последовательности, которую вы предоставляете; xargs группирует наборы имен файлов в один список аргументов, вплоть до ограничения по размеру. Если имена достаточно короткие (обычно они есть), тогда число выполнений grep будет меньше, чем имен файлов.

Также обратите внимание, что grep печатает только имя файла, в котором найден материал, если у него есть несколько файлов для поиска - или если он поддерживает параметр, так что он всегда печатает имена файлов, и параметр имеет значение used: '-H' - это расширение GNU для grep, которое делает это. Переносимый способ гарантировать, что имена файлов всегда появляются, состоит в том, чтобы перечислить /dev/null в качестве первого файла (например, 'xargs grep something /dev/null'); поиск /dev/null.

не займет много времени
3 голосов
/ 14 июля 2009

xargs собирает аргументы из стандартного ввода и выполняет команду, заданную этими аргументами.

поэтому cat ждет, пока что-то наберется, а затем xargs запускает man с этим вводом.

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

find . -name '*.o' -print | xargs rm
...