O problema
O problema é que o resultado de uma substituição de comando é submetido à expansão do nome do caminho e à divisão de palavras.
Para ver o que acontece com a saída da substituição do comando, vamos usar printf
para exibir as palavras que ele produz:
$ printf ">%s<\n" $( (( compress == 1 )) && echo -n '-e /^RMTHOST/ s/$/, compress/' )
>-e<
>/^RMTHOST/<
>s/$/,<
>compress/<
Você precisa que -e
seja uma palavra separada. Observe, no entanto, que a divisão de palavras também fez com que o comando substituto do sed fosse dividido em algo que o sed não entenderá :
$ sed -e '/^RMTHOST/' 's/$/,' 'compress/'
sed: -e expression #1, char 10: missing command
A solução
Tente usar matrizes do bash em vez disso:
#!/bin/bash
jobname=pssic
hostname=omsssi
hostport=7809
compress=1
rmttrailname=SomethingElse
args=()
(( compress == 1 )) && args+=('-e' '/^RMTHOST/ s/$/, compress/')
args+=(
-e "s|\*\*jobname\*\*|$jobname|g"
-e "s|\*\*hostname\*\*|$hostname|g"
-e "s|\*\*hostport\*\*|$hostport|g"
-e "s|\*\*rmttrailname\*\*|$rmttrailname|g"
)
declare -p args # Optional: Verify the args are what we want.
sed "${args[@]}" <"$GGPARAMSDIR/pump.template" >"$GGPARAMSDIR/$jobname.prm"
Boa leitura
Uma discussão interessante e mais geral sobre os problemas de criação de comandos a partir de variáveis shell é: "Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham! "