¿Hay alguna manera de ejecutar un script de shell haciendo eco de los comandos pero sin ejecutarlos realmente?
Digamos que tengo un script que elimina un archivo cuyo nombre se almacena en una variable:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
Agregar set -v
hará eco de los siguientes comandos antes de la ejecución:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Ahora, quiero ver el flujo de este script sin eliminar realmente el archivo. IOW, quiero evitar cualquier efecto en el entorno externo y el sistema de archivos. es posible?
Podría envolver todos los comandos con un echo
comando, pero es agotador para un script largo.
linux
bash
shell-script
ysap
fuente
fuente
Respuestas:
No hay forma de recorrer un script para ver cómo se ejecutaría sin hacerlo realmente. En su ejemplo, no hay
if
declaraciones ni bucles. Pero en los guiones reales, a menudo hay muchas declaraciones condicionales. La rama que se tomará a menudo dependerá de lo que sucedió cuando el shell ejecutó el comando anterior. Si no ejecuta el comando, no hay forma de que el shell sepa qué salida habría generado o cuál habría sido el código de retorno, de lo que podría depender la próxima rama condicional o declaración de asignación.Si el punto es que desea examinar un script y saber qué hace antes de ejecutarlo, no es una mala idea. Pero, siendo realistas, sobre la mejor manera de hacerlo es simplemente navegar el archivo con
less
ovi
o algo similar.Adicional
Si está desarrollando una secuencia de comandos y quiere pasar por ella la primera vez, probando la lógica pero sin hacer ningún daño si tiene un error, la solución que a menudo puedo usar es modificar solo las declaraciones que podrían causar algún daño pegando una
echo
en el frente.Esto a menudo funciona en scripts típicos de la vida real porque (a) generar las listas de elementos sobre los que iterará o el valor al que establecerá una variable a menudo se puede generar sin cambiar el sistema de archivos y (b) generalmente es suficiente para suponga que si ejecutó el comando, tendría éxito.
fuente
trap read debug
que hará una lectura después de cada línea ejecutada, y luego puede recorrerlo lentamente con enter (esto es útil si tiene un guión realmente largo y desea probar por primera vez)Creo que va a tener que hacer eco; sin embargo, si coloca el comando en una variable, puede activarlo y desactivarlo. Además, el comando puede ser una función y tan sofisticado como desee.
fuente
D=eval
en la parte en vivo. Pero buena respuesta!Puede rastrear el flujo utilizando la opción -x para bash, pero esto aún ejecutaría los comandos.
Lo mejor que puede hacer es poner eco o comentar los comandos que tienen efectos externos como el rm. Al menos no tendrías que cambiar cada línea.
fuente
No conozco ningún método en particular para la ejecución en seco, pero podemos tomar algunas precauciones para comprender un script desconocido.
bash -n <script>
para la verificación de sintaxis . Del manual de gnu bash https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Para editores de flujo como sedsed -i
(-i modifica el archivo en su lugar sin -i hace una ejecución en seco para sed, consulte la página de manual para obtener más detalles) puede copiar el comando completo y ejecutarlo. Justo antes del comando real, mostrará el resultado en la pantalla y luego use el comando para esperar a que continúe la entrada del usuario. Ejemplosed -i <pattern>
Reemplácelo consed <pattern> read -p "Press any key..." sed -i <pattern>
También siempre se sugiere mantener puntos de respaldo en su sistema para que en caso de emergencia se puedan restaurar los datos.
fuente
Haz
set –n
o agregan
a tuset –v
comando existente . Pero dado que esto hace que el shell no evalúe ningún comando, ni siquieraif
owhile
, es posible que no obtenga una vista demasiado buena del flujo operativo.fuente
Aquí hay una pequeña construcción que me gusta usar:
fuente
Si desea evitar que ocurran modificaciones, puede ejecutar el script como usuario sin privilegios:
En su ejemplo, esto se ejecutará
FN="filename"
como de costumbre. Si bien técnicamente también ejecuta el comandorm -f ${FN}
, no pasará nada si nadie no tiene los permisos necesarios para eliminar el archivo.Por supuesto, esto causará problemas con el flujo de trabajo condicional. El hecho de que el
rm
comando haya fallado podría afectar a otras partes del script.fuente