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

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

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

  • Вывод команды при передаче по другой команде
  • Подстановочные знаки для файловых путей не работают в grep
  • Mutt: могу ли я определить свои собственные правила для обнаружения котируемых сообщений?
  • Почему xargs -n 1 настолько медленный для длинных строк
  • Как распределить вычисления «tar czf» в течение длительного времени?
  • Почему возникает ошибка при двойном цитировании одинарных кавычек в скрипте, который запускает удаленную команду SSH?
  • Кажется, что, возможно, 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| 

  • fgrep начало строки?
  • Как сделать `head` и` tail` на вход с нулевым ограничением в bash?
  • Как скопировать файлы с помощью scp с удаленного хоста, когда файл имеет пробелы
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • "Grep: Непревзойденная ошибка [" при использовании регулярного выражения
  • Как передать путь к файлу через вызов perl из bash?
  • 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

    Linux и Unix - лучшая ОС в мире.