Предотвращение параллельной 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 от разделения аргументов командной строки перед передачей их команде?

  • BASH: параллельный запуск
  • Выполнение команд consequtively по нескольким папкам
  • Параллелизируйте цикл Bash FOR Loop
  • GNU parallel vs & (я имею в виду фон) vs xargs -P
  • Параметры MaxStartups и MaxSessions для ssh-соединений?
  • gnu parallel: цитируемые аргументы и пробелы в именах файлов. Как решить?
  • Почему GNU не работает с «bash -c»?
  • GNU Параллельно обрабатывает несколько файлов параллельно в Unix с bash
  • 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 .

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

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