Чтобы лучше понять 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
не займет много времени.