человек 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| 

  • копировать файлы с целевым именем на основе md5, используя find и xargs
  • curl page source из текстового файла, содержащего URL-адреса
  • Перемещение подкаталога в новый родительский каталог, где новое имя каталога увеличивается на 1
  • Эффективная генерация stdin в сценарии оболочки
  • Команда xargs приводит к sed:;: Нет такого файла или каталога
  • Ни для чего ничего не нужно для xargs
  • Как заставить xargs играть хорошо с stdin?
  • Почему xargs -n 1 настолько медленный для длинных строк
  • 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 - лучшая ОС в мире.