Чтобы лучше понять xargs

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

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

Спасибо Rampion: нам не нужна кошка!

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

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

  • cat ничего для xargs
  • xargs создает список man-команд

У меня возникла идея, что 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, ...

Ответ 1

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

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

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

Ответ 2

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

поэтому кошка ждет ввода чего-то, а затем xargs запускает человека с этим входом.

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

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

Ответ 3

Команда 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 не займет много времени.