Impedir que o GNU paralelo divida argumentos citados

4

Estou tentando usar o Paralelo GNU para executar um tempo múltiplo comman com uma combinação de argumentos constantes e variáveis . Mas, por algum motivo, os argumentos constantes são divididos em espaço em branco, embora eu os tenha citado ao passá-los para parallel .

Neste exemplo, o argumento constante 'a b' deve ser passado para debug-call como um único argumento em vez de dois:

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

debug-call é um script simples que imprime cada argumento em que foi passado em argv . Em vez disso, esperaria ver essa saída:

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

Este é um bug ou existe uma opção para impedir que o GNU Parallel divida os argumentos da linha de comando antes de passá-los para o comando?

    
por Feuermurmel 10.05.2017 / 12:59

1 resposta

4

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 '%s
parallel 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

    
por 10.05.2017 / 13:10