Implementando dry-run em scripts bash

14

Como alguém poderia implementar uma opção de execução a seco em um script bash?

Eu posso pensar em envolver cada comando em um if e ecoar o comando em vez de executá-lo se o script estiver sendo executado com execução seca.

Outra forma seria definir uma função e, em seguida, passar cada chamada de comando através dessa função.

Algo como:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

'_run mv /tmp/file /tmp/file2'

'DRY_RUN=true _run mv /tmp/file /tmp/file2'

Isso é errado e há uma maneira muito melhor de fazer isso?

    
por Andrei Serdeliuc 03.06.2010 / 02:14

2 respostas

2

Veja BashFAQ / 050: Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham! para uma discussão sobre este assunto.

Embora agora removida, a seção Como adicionar recursos de teste para um programa ainda pode ser útil.

    
por 03.11.2015 / 12:11
4

Eu queria brincar com a resposta do @Dennis Williamson. Aqui está o que eu tenho:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

O eval "$@" é importante aqui e é melhor do que simplesmente fazer $* . $@ retorna todos os parâmetros e $* retorna todos os parâmetros sem espaços / citações.

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
    
por 07.04.2012 / 23:26

Tags