Estou tentando usar o GNU Parallel para executar um comando para cada argumento de entrada, usando esse argumento como o diretório de trabalho do comando (sem anexá-lo à linha de comando).
Basicamente, o que preciso fazer é:
/foo -> "cd /foo; mycmd"
/bar -> "cd /bar; mycmd"
/baz -> "cd /baz; mycmd"
Parallel tem --workdir
o que parece fazer o que eu quero em virtude do suporte {}
a strings de substituição:
--workdir meudir
--wd meudirOs trabalhos serão executados no diretório mydir. O padrão é o diretório atual da máquina local e o diretório de login para computadores remotos.
<...>
mydir pode conter strings de substituição do GNU paralelo.
Para evitar que o argumento seja anexado à linha de comando, tentei usar -n0
or -N0
:
--max-args max-args
-n max-argsUse no máximo argumentos max-args por linha de comando.
<...>
-n 0 significa ler um argumento, mas inserir 0 argumentos na linha de comando.
No entanto, isso não parece funcionar:
$ mkdir -p $HOME/{foo,bar,baz}
$ printf '%s\n' $HOME/{foo,bar,baz} | parallel --workdir '{}' -n0 'pwd'
parallel: Error: Cannot change into non-executable dir : No such file or directory
Observe o espaço antes do :
, que não é um erro de digitação no paralelo GNU, mas uma indicação de que o workdir foi avaliado como uma string vazia. Isso se torna evidente se eu acrescentar uma string fixa a {}
, caso em que todos os pwds imprimem essa string fixa:
$ printf '%s\n' $HOME/{foo,bar,baz} | parallel --workdir '/{}' -N0 'pwd'
/
/
/
O que estou fazendo de errado?
AFAICT
--workdir
não pretende ter todas as{...}
diretivas em seus argumentos expandidas. O GNUparallel
executa um shell de qualquer maneira para interpretar o código fornecido, então você sempre pode fazer:(aqui forçando o shell a ser
sh
em vez de confiar naparallel
heurística do para determinar qual shell executar e solucionar alguns dos problemas comcd
)Se você não precisa de nenhum dos recursos do GNU
parallel
, você pode usar o GNUxargs
em combinação com o GNUenv
e evitarparallel
a sobrecarga do GNU e do shell e ocd
shell não confiável integrado:Acredito que o mais fácil seria:
Você pode usar
--workdir
, mas claramente não se destina a esta situação. GNU Parallel normalmente deseja uma string de substituição no modelo de comando e você deseja{}
conter o argumento para--workdir
.Usar
-n0
não vai ajudar, porque então{}
ficará vazio e--workdir
falhará:{}
avalia a mesma string, não importa onde seja usada.Portanto, a solução alternativa é usar
{}
, mas usá-lo onde não causar danos:Ou use
{==}
para gerar uma parte estática do comando:Pessoalmente prefiro a
cd {}
versão: acho mais fácil ver o que você está tentando fazer.