Redirecionamento condicional Bash ao testar / depurar

2

Qual é a melhor maneira de fazer um redirecionamento condicional no Bash para fins de teste e depuração?

Nos meus scripts eu adiciono uma opção de depuração para mostrar o que teria acontecido efetivamente fazendo um teste sem nenhum processamento. Se a opção de depuração estiver ativada, quero que a opção DEBUG ecoe uma linha de script com o redirecionamento efetivamente , ecoando o redirecionamento e não redirecionando o eco . Um exemplo provavelmente explicaria isso melhor:

Em um script que faria um mysqldump usando args passados para ele, eu desejaria que a opção debug mostrasse o comando mysqldump como ele teria executado se não fosse pela opção -d.

[ "-d" = "$1" ] && DEBUG=echo
$DEBUG mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > $dbase.sql.dump

Então, se eu estou ecoando porque DEBUG é "echo" eu não quero eco para "$ dbase.sql.dump" Eu realmente quero ecoar o ">" e a variável "$ dbase" com o texto ".sql.dump". Se a opção de depuração não estiver ativa, quero executar o comando como está.

As opções set -x e set -v não são realmente a resposta aqui, pois a depuração é realmente apenas uma opção de saída / execução de teste que o usuário pode ver e não depurar realmente o script para corrigir problemas de codificação.

    
por johnnyB 23.09.2013 / 23:41

1 resposta

2

O problema vai estar escapando de tudo corretamente. Por que você não tenta uma abordagem um pouco diferente assim:

CMD='mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > "$dbase.sql.dump"';
[ "-d" = "$1" ] && echo $CMD
eval $CMD

O truque é salvar o comando como uma variável e, em seguida, imprimir a variável apenas se você estiver depurando. Isso elimina a necessidade de escrevê-lo duas vezes e você pode usar a variável eval para executar o comando que ele contém.

    
por 24.09.2013 / 00:10