Resposta curta: veja BashFAQ # 50: Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham! .
Resposta longa: você está tendo problemas por causa da ordem em que o shell analisa vários elementos das linhas de comando; Especificamente, ele expande as referências de variáveis (como ${ERR}
) na metade do processo - depois de já ter lidado com coisas como cotações, escapes e redirecionamentos. No seu caso, é a parte de redirecionamentos que importa: no momento em que o shell expande ${ERR}
para 2>/dev/null
, ele já procurou redirecionamentos e não encontrou nenhum, então ele trata apenas 2>/dev/null
como um argumento para o comando e então gpg
rejeita isso como não fazendo sentido.
Basicamente, armazenar comandos (ou elementos de comando) em variáveis é a maneira errada de fazê-lo. Variáveis são para dados, não para código executável. Nesse caso, seria melhor usar as funções:
e() {
gpg -o - --symmetric --cipher-algo "$@"
}
d() {
gpg -o - --decrypt "$@" 2>/dev/null
}
if [ "$1" = "enc" ]; then
e AES "$2" | e TWOFISH -
elif [ "$1" = "dec" ]; then
d "$2" | d -
else
echo "Arguments: enc|dec filename"
exit
fi
Note que também coloquei $2
entre aspas duplas, para evitar que seu valor seja submetido à segunda metade do processo de análise do shell.