parallel
executa um shell (que é exatamente um dependendo do contexto em que é chamado, geralmente, quando chamado de um shell, é o mesmo shell) para analisar a concatenação dos argumentos.
Então:
parallel debug-call 'a b' {} ::: 'a b' c
é o mesmo que
parallel 'debug-call a b {}' ::: 'a b' c
parallel
irá ligar:
your-shell -c 'debug-call a b <something>'
Onde <something>
é os argumentos (esperançosamente) citados corretamente para esse shell. Por exemplo, se esse shell for bash
, ele será executado
bash -c 'debug-call a b a\ b'
Aqui, você quer:
parallel 'debug-call "a b" {}' ::: 'a b' c
Ou
parallel -q debug-call 'a b' {} ::: 'a b' c
Onde parallel
irá citar os argumentos (na sintaxe correta (esperançosamente) para o shell) antes de concatenar.
Para evitar chamar um shell, você poderia usar o GNU xargs
:
xargs -n1 -r0 -P4 -a <(printf '%sparallel debug-call 'a b' {} ::: 'a b' c
' 'a b' c) debug-call 'a b'
Isso não invocará um shell (nem qualquer um dos muitos comandos executados por parallel
na inicialização), mas você não se beneficiará de nenhum dos recursos extras de parallel
, como a reordenação de saída com -k
.
Você pode encontrar outras abordagens na execução em segundo plano paralelamente