Вопрос

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

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

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

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

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

  1. кот ничего не имеет против ксаргса
  2. 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, ...
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

В cat команда не действует ни на что;он работает со стандартным вводом до тех пор, пока ему не будет сообщено, что ввод завершен.Как отмечает Рэмпион, cat команда здесь не обязательна, но она работает на своем неявном вводе (стандартный ввод), а не на пустом месте.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top