Как вы отправляете команды с аргументами, уже находящимися внутри них, параллельно GNU? - PullRequest
2 голосов
/ 23 января 2020

У меня есть массив bash:

nodes=(
    "command"
    "command arg"
    ...
    )

, и я хочу выполнить все команды со всеми аргументами, которые уже присоединены к ним, с использованием параллельной GNU.

I ' мы пробовали

printf '%s\n' "${nodes[@]}" | parallel python

и

parallel python ::: "${nodes[@]}"

Выходная команда:

python path_to_file\ arg

и выдаваемая ошибка: «не удается открыть файл» path_to_file arg ' "

Я думаю, что проблема заключается в том, что backsla sh - я получаю ту же ошибку, когда запускаю команду без параллельного подключения.

Как мне предотвратить установку backsla sh в?

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Try:

printf '%s\n' "${nodes[@]}" | parallel eval python 

eval - это команда оболочки, которая игнорирует строку как выражение оболочки. Обычно я использовал его для «де-кавычки» строки.

или:

printf '%s\n' "${nodes[@]}" | parallel python {=uq=}

Более новые версии GNU Parallel имеют uq(), что оставляет значение без кавычек. Обычно GNU Parallel заключает в кавычки значения.

или:

printf '%s\n' "${nodes[@]}" | parallel 

Исключением из приведенного выше правила является отсутствие команды. Тогда значение без кавычек.

1 голос
/ 23 января 2020

Вам нужно разделить ввод по пробелам на аргументы. Вы можете, например, (ab-) использовать расширение разбиения слов оболочкой. parallel передал ваши аргументы такими, какие они есть, поэтому вы запускаете python "command arg" - с одним аргументом с сохранением буквального пространства. Тем не менее, я думаю, вы хотите python command arg - передать два аргумента, и пробел действует как разделитель.

parallel 'python $*' ::: "${nodes[@]}"

Использование xargs, которое будет выглядеть так:

printf "%s\n" "${nodes[@]}" | xargs -l sh -c 'python $*' --
...