Предотвращение параллельной GNU от разделения аргументов

Я пытаюсь использовать GNU Parallel для запуска умножения числа за раз с комбинацией постоянных и разных аргументов. Но по какой-то причине постоянные аргументы разбиваются на пустое пространство, хотя я процитировал их при передаче их в parallel .

В этом примере константный аргумент 'a b' должен быть передан в debug-call как один аргумент вместо двух:

 $ parallel debug-call 'ab' {} ::: {1..2} [0] = '[...]/debug-call' [1] = 'a' [2] = 'b' [3] = '1' [0] = '[...]/debug-call' [1] = 'a' [2] = 'b' [3] = '2' 

debug-call – простой скрипт, который печатает каждый аргумент, который он передал в argv . Вместо этого я ожидаю увидеть этот результат:

 [0] = '[...]/debug-call' [1] = 'ab' [2] = '1' [0] = '[...]/debug-call' [1] = 'ab' [2] = '2' 

Является ли это ошибкой или существует опция предотвращения GNU Parallel от разделения аргументов командной строки перед передачей их команде?

  • GNU Parallel - grepping n строк для m регулярных выражений
  • GNU параллельна чрезмерно медленной
  • GNU Parallel: как я могу ссылаться на элементы массива?
  • Стоит ли использовать параллельные процессы вместо forking в цикле for?
  • BASH: параллельный запуск
  • Как использовать GNU Parallel для этого цикла while?
  • Rsync копирует все снова, а не дельта
  • Чтение двух списков, содержащих имена файлов
  • One Solution collect form web for “Предотвращение параллельной GNU от разделения аргументов”

    parallel запускает оболочку (которая точна в зависимости от контекста, в котором она вызывается, как правило, при вызове из оболочки, это та же оболочка) для синтаксического анализа конкатенации аргументов.

    Так:

     parallel debug-call 'ab' {} ::: 'ab' c 

    такой же как

     parallel 'debug-call ab {}' ::: 'ab' c 

    parallel вызовет:

     your-shell -c 'debug-call ab <something>' 

    Где <something> – аргументы (надеюсь) правильно процитированные для этой оболочки. Например, если эта оболочка bash , она будет запущена

     bash -c 'debug-call aba\ b' 

    Здесь вы хотите:

     parallel 'debug-call "ab" {}' ::: 'ab' c 

    Или

     parallel -q debug-call 'ab' {} ::: 'ab' c 

    Там, где parallel будет приводить аргументы (в правильном (надеюсь) синтаксисе для оболочки) перед конкатенацией.

    Чтобы избежать вызова оболочки в первую очередь, вместо этого вы можете использовать GNU xargs :

     xargs -n1 -r0 -P4 -a <(printf '%s\0' 'ab' c) debug-call 'ab' 

    Это не будет вызывать оболочку (или любую из многих команд, запускаемых parallel при инициализации), но вы не сможете использовать какие-либо дополнительные функции parallel , такие как переупорядочение вывода с -k .

    Вы можете найти другие подходы при параллельном выполнении фона

    Interesting Posts

    Почему логические тома используются с разделами LUKS?

    Shellscript для удаления определенных тегов в файле HTML

    В чем смысл правила «в спецификации POSIX не указано, является ли оно ASSIGNMENT_WORD или WORD»

    Доступ к последней выполненной команде и ее изменение перед выполнением в VIM

    Скопируйте определенный процент каждого файла в каталог в новый файл

    размер списка папок и дата их изменения

    Необходимо изменить точку монтирования LVM / u001 / app / oracle на / u001 /

    Выполнить скрипт после периода бездействия

    Как подключиться к моей утилите usb-to-serial на OpenBSD

    Невозможно установить Netflix-рабочий стол в Debian … Aptitude имеет неудовлетворенные / разрозненные зависимости

    Изменяется ли индекс при переименовании или перемещении файла?

    Безопасно ли задание cron для обновления apt-get?

    Всегда ли сценарий инициализации возвращает правильный код выхода при запуске состояния?

    Как определить, когда процесс или машина привязаны к IO?

    Понимание формата прошедшего времени ps для длительных процессов

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