Implementación de ejecución en seco en scripts bash

Implementación de ejecución en seco en scripts bash

¿Cómo se implementaría una opción de ejecución en seco en un script bash?

Puedo pensar en envolver cada comando en un if y repetir el comando en lugar de ejecutarlo si el script se ejecuta con ejecución en seco.

Otra forma sería definir una función y luego pasar cada llamada de comando a través de esa función.

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`

¿Esto simplemente está mal y hay una manera mucho mejor de hacerlo?

Respuesta1

VerBashFAQ/050: Estoy intentando poner un comando en una variable, ¡pero los casos complejos siempre fallan!para una discusión sobre este tema.

Aunque ahora eliminada, la secciónCómo agregar capacidad de prueba a un programatodavía puede ser útil.

Respuesta2

Quería jugar con la respuesta de @Dennis Williamson. Esto es lo que obtuve:

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

    eval "$@"
}

Esto eval "$@"es importante aquí y es mejor que simplemente hacerlo $*. $@devuelve todos los parámetros y $*devuelve todos los parámetros sin espacios en blanco ni comillas.

$ 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

información relacionada