gnu paralela remove escape antes dos caracteres de espaço no comando

1

Atualmente, estou testando o gnu paralelamente para distribuir um comando de comparação entre vários servidores usando o bash. Em sua função mais básica, esse comando de comparação usa duas entradas para comparar (acessos ao banco de dados oracle) e requer um nome de arquivo de saída por meio de -o. Pelo menos um carregamento de ação, salvamento ou upload direto é exigido pelo programa.

compare -o cmp.input1.input2.dat Input1 Input2

Eu tenho alguns milhares desses pares de entrada e criei um arquivo com todas as combinações para que cada linha contenha o nome do arquivo de saída e os identificadores do banco de dados requeridos pelo programa

#test_parallel
-o cmp.input1.input2.dat Input1 Input2
-o cmp.input1.input3.dat Input1 Input3
-o cmp.input2.input3.dat Input2 Input3
[...]

e execute o comando usando paralela, no entanto, o comando compare falha

parallel -a test_parallel "compare {}"
ERROR: No action specified for results (load, save or direct upload)
usage: compare [-u][-o <file>] query target

usando o modo --dryrun , isso é o que executa paralelamente:

compare -o\ cmp.input1.input2.dat\ Input1\ Input2

Por alguma razão eu não entendo, o espaço em branco escapado não é tratado corretamente pelo programa de comparação. Executar este comando no bash resulta na mesma mensagem de erro. Removendo o escape após o sinalizador -o (eu poderia mover o -o para o comando paralelo) resulta em um erro "muitos argumentos". A remoção de todas as fugas executa o comando conforme esperado.

É possível dizer paralelamente para não imprimir o escape na chamada de comando? Eu não pareço encontrar nada na documentação, exceto que este é o comportamento padrão esperado, como indicado por parallel --shellquote

    
por Carambakaracho 17.10.2016 / 10:55

1 resposta

2

O GNU Parallel trata a entrada como um único argumento e a cita para que você possa usar com segurança nomes de arquivos como:

My brother's 12" records costs 30$ each.txt

No seu caso, você quer que o argumento seja analisado pelo shell, para que os espaços fiquem sem aspas:

parallel -a test_parallel eval compare {}

Ou você pode dividir no espaço:

parallel --colsep ' ' -a test_parallel compare {1} {2} {3} {4}

Mas, como você quer comparar todos os outros, tudo pode ser feito de maneira muito mais elegante:

parallel cmp -o ../out/cmp.{1}.{2} {1} {2} ::: Input* ::: Input*

Isto irá comparar todas as entradas * a todas as entradas *. Com --results você pode obter as saídas bem estruturadas em um diretório:

parallel --results out/ cmp {1} {2} ::: Input* ::: Input*

Mas se você quiser pular cmp InputY InputX depois de executar cmd InputX InputY , poderá fazer isso:

parallel --results out/ cmp {=1' $arg[1] ge $arg[2] and $job->skip();' =} {2} ::: Input* ::: Input*
    
por 17.10.2016 / 17:42