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?


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.