Seu problema não tem nada a ver com o bash. Na verdade, como você está dizendo a parallel
para executar sh
, talvez você não esteja usando bash
.
A questão é que o paralelismo não é realmente um substituto substituto para xargs, como indica sua documentação. Em vez disso, ele acumula seus argumentos em uma única string (com espaços entre eles) e, em seguida, interpreta isso como uma série de comandos. Então, no seu caso, você tem:
sh -c 'name="{.}"; echo {.} ${name%.*}.tpr'
que é interpretado como
sh -c 'name="{.}";
echo {.} ${name.*}.tpr
Como esses são dois comandos separados e o primeiro é executado em um subshell ( sh -c
), $name
não é definido no segundo.
Agora, você pode adicionar qualquer coisa ao início da string, como true
:
sh -c 'true; name="{.}"; echo {.} ${name%.*}.tpr'
Isso será interpretado como:
sh -c 'true'
name="{.}"
echo {.} ${name%.*}.tpr'
Nesse caso, a chamada para sh
é essencialmente descartável; então name
é definido no ambiente mantido por parallel
e finalmente echo
é chamado com name
set.
Portanto, parece que a solução mais fácil é simplesmente livrar-se da chamada desnecessária para sh
:
find 1st 2nd 3rd -name '*.xtc' -print0 |
parallel -0 'name={.}; echo {.} "${name%.*}.tpr"'
Nota: Com base em uma dica dada por @StephaneChazelas, removi as aspas em torno de {.}
e as adicionei em torno de ${name%.*}.ptr
. A parallel faz suas próprias citações de suas próprias substituições, o que interfere de alguma forma estranha com aspas explícitas. No entanto, ele não adiciona citações às substituições de shell, que devem ser citadas se houver alguma possibilidade de a substituição ser dividida em palavras.
Outra opção, se você realmente quiser usar um subshell por algum motivo (ou um subshell em particular), seria usar a opção -q
:
find 1st 2nd 3rd -name '*.xtc' -print0 |
parallel -0 -q sh -c 'name="{.}"; echo "{.}" "${name%.*}.tpr"'
Observação: Como acima, ajustei as cotações. Nesse caso, o -q
explícito suprime a cotação das substituições, portanto, você deve citá-las explicitamente. No entanto, esta é uma citação textual, que é menos precisa do que a de shell; se a substituição incluir um caractere de aspas duplas, esse caractere não terá escape, por isso fechará as aspas explícitas, quebrando a linha de comando e introduzindo efetivamente uma vulnerabilidade de injeção de comando (você obterá outros problemas para nomes de arquivos contendo $
, '
ou \
caracteres). Por isso, entre outras razões, a opção -q
é desencorajada.