¿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