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

15

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

Puedo pensar en envolver cada comando individual 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 está mal y hay una manera mucho mejor de hacerlo?

Andrei Serdeliuc
fuente
Por lo tanto, desea imprimir lo que hará el comando (incluidos los valores de $ VARIABLES) sin ejecutar realmente el comando. Uso algo como su _run()función, a veces con 'set -xv', pero me encantaría una mejor manera.
Stefan Lasiewski
Sí, exactamente eso. Me pregunto si no hay una variable interna que pueda establecer en bash para que los comandos no se ejecuten realmente, en lugar de pasarlos a través de una función
Andrei Serdeliuc
2
No hay razón para que esta pregunta haya sido marcada como wiki de la comunidad.
Pausado hasta nuevo aviso.
Bash es una concha. No hay razón para que haga carreras en seco. No creo que haya una mejor manera de hacerlo de lo que ya lo has hecho.
d -_- b

Respuestas:

2

Ver BashFAQ / 050: Estoy tratando de poner un comando en una variable, ¡pero los casos complejos siempre fallan! para una discusión de este tema.

Aunque ahora se eliminó, la sección Cómo agregar capacidad de prueba a un programa aún puede ser útil.

Dennis Williamson
fuente
No es una alternativa, pero parece un excelente recurso para probar y trabajar con programas bash más largos.
Andrei Serdeliuc
Revertí la edición que agregaba un ancla a una parte particular de la página enlazada ya que el punto de mi respuesta, como se dijo, es leer la discusión en su conjunto en lugar de señalar una parte específica de procedimientos. El objetivo de la página vinculada generalmente es tratar de evitar poner comandos para que se ejecuten en variables, ya que hay muchas trampas.
Pausado hasta nuevo aviso.
Sería mucho más útil si esta respuesta resumiera los puntos más destacados de este artículo. Las respuestas de una línea siguen siendo respuestas pobres.
Mark Booth el
4

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

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

    eval "$@"
}

El eval "$@"que es importante aquí, y es mejor que simplemente haciendo $*. $@devuelve todos los parámetros y $*devuelve todos los parámetros sin espacios en blanco / 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
Stefan Lasiewski
fuente