человек xargs говорит, что стандартный ввод ограничивается пробелами; но так ли?

Я озадачен тем, что на самом деле определяет arg в xargs .
На странице руководства предполагается, что аргументы ограничены пробелами (я предполагаю, что это означает пробел). Однако следующий сценарий не ведет себя так, как я ожидал. Вот выдержка из раздела ОПИСАНИЕ человека:

xargs считывает элементы со стандартного ввода, разделенные пробелами (которые могут быть защищены двойными или одинарными кавычками или обратной косой чертой) или новыми строками, и выполняет команду …

Кажется, что, возможно, xargs работает в блоках того, что man-страница вызывает элементы . Означает ли это элемент с null-delimited или элемент с разделителем newline ?

В принципе, я не понимаю, почему в следующем скрипте xargs рассматривает ввод как один аргумент, хотя пробелы (в stdin) не защищены . Я ожидал, что xargs рассмотрит stdin как 3 аргумента или, по крайней мере, уменьшит количество пробелов до одного пробела, но ни один из них …

 #!/bin/bash if [[ $1 == "." ]] ;then # act on a recursive call to self shift # scrap the 'recursive' arg printf '|%s|\n' "$@" # print all 'xargs' args printf '|%s|\n' "$1" # print only the first 'xargs' arg exit fi printf 'abc\n' |xargs -I {} "$0" "." {} 

Вот результат; показывая только один аргумент был передан сценарию.

 |abc| |abc| 

Но я бы ожидал 3 отдельных аргумента, например:

 |a| |b| |c| 

3 Solutions collect form web for “человек xargs говорит, что стандартный ввод ограничивается пробелами; но так ли?”

Прочитайте, что говорится на странице руководства о опции -I , которую вы используете:

-I replace-str

Замените появление replace-str в начальных аргументах именами, считанными со стандартного ввода. Кроме того, некотируемые пробелы не прерывают входные элементы; вместо этого разделитель является символом новой строки.

Нет, речь идет не о «блоках» и «предметах», это просто изменение терминологии. xargs принимает входные данные, xargs ' или " и разделенные пробелами, за исключением случаев, когда передаются некоторые параметры.

Некоторые параметры изменяются для линейной обработки без цитирования: -I , -L , -i (GNU), -l (GNU). Опция -0 (если доступна) изменяется на ввод с нулевым ограничением без цитирования. Опция -d (GNU) изменяется на пользовательский разделитель без кавычек.

Одной из причин создания GNU Parallel было сделать его более предсказуемым, чем xargs. https://www.gnu.org/software/parallel/history.html

Если вы попадаете так, как xargs интерпретирует аргументы, подумайте об использовании GNU Parallel.

Вы можете установить GNU Parallel, просто:

 wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel cp parallel sem 

Смотрите видеоролики для GNU. Параллельно узнайте больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

  • Предложение xargs grep
  • Zgrep останавливается после первого совпадения, когда аргументы передаются из xargs
  • команда solaris + xargs для солярия
  • Печать состояния файлов, обрабатываемых при использовании find
  • Копирование папки с помощью xargs
  • ssh-add добавить все закрытые ключи в .ssh каталог
  • xargs внутри цикла for
  • Предоставлять строки, хранящиеся в файле, в виде списка аргументов для команды?
  • Как использовать определенную функцию с xargs
  • Как распределить вычисления «tar czf» в течение длительного времени?
  • Получите дополнение к результату команды ls
  • копирование подкаталогов, не содержащих определенный файл, в другой каталог
  • Linux и Unix - лучшая ОС в мире.