¿Puede editar un script de shell mientras se está ejecutando y que los cambios afecten al script en ejecución?
Tengo curiosidad sobre el caso específico de un script csh que tengo, ese lote ejecuta un montón de versiones de compilación diferentes y se ejecuta toda la noche. Si se me ocurre algo en mitad de la operación, me gustaría ingresar y agregar comandos adicionales, o comentar los que no se han ejecutado.
Si no es posible, ¿existe algún mecanismo de shell o por lotes que me permita hacer esto?
Por supuesto que lo he probado, pero pasarán horas antes de que vea si funcionó o no, y tengo curiosidad por saber qué está pasando o no detrás de escena.
Respuestas:
Los scripts no funcionan de esa manera; la copia en ejecución es independiente del archivo fuente que está editando. La próxima vez que se ejecute el script, se basará en la versión guardada más recientemente del archivo fuente.
Puede ser conveniente dividir este script en varios archivos y ejecutarlos individualmente. Esto reducirá el tiempo de ejecución hasta el fallo. (es decir, divida el lote en scripts de tipo de compilación, ejecutando cada uno individualmente para ver cuál está causando el problema).
fuente
Que no afecta, al menos fiesta en mi entorno, pero en forma muy desagradable . Vea estos códigos. Primero
a.sh
:b.sh
:Hacer
En mi caso, la salida es siempre:
(Por supuesto, es mucho mejor automatizarlo, pero el ejemplo anterior es legible).
[editar] Esto es impredecible, por lo tanto peligroso. La mejor solución es , como se describe aquí, poner todo en una llave, y antes de la llave de cierre, poner "salida" . Lea bien la respuesta vinculada para evitar errores.
[agregado] El comportamiento exacto depende de una nueva línea adicional, y quizás también de su versión Unix, sistema de archivos, etc. Si simplemente desea ver algunas influencias, simplemente agregue "echo foo / bar" a b.sh antes y / o después la línea "leer".
fuente
b.sh
agregando 10 líneas de eco foo / bar / baz. La esencia de las respuestas de dave4220 y yo es que el efecto no es fácil de predecir. (Por cierto, el sustantivo "afecto" significa "amor" =)Prueba esto ... crea un archivo llamado
bash-is-odd.sh
:Eso demuestra que bash está, de hecho, interpretando el guión "sobre la marcha". De hecho, editar un script de larga duración tiene resultados impredecibles, inserta caracteres aleatorios, etc. ¿Por qué? Debido a que bash lee desde la última posición del byte, la edición cambia la ubicación del carácter actual que se está leyendo.
Bash es, en una palabra, muy, muy inseguro debido a esta "característica". svn y
rsync
cuando se usan con scripts bash son particularmente preocupantes, porque por defecto "fusionan" los resultados ... editando en su lugar.rsync
tiene un modo que corrige esto. svn y git no.Presento una solución. Crea un archivo llamado
/bin/bashx
:Ahora úselo
#!/bin/bashx
en sus scripts y ejecútelos siempre con enbashx
lugar debash
. Esto soluciona el problema: puede utilizarrsync
sus scripts de forma segura .Solución alternativa (en línea) propuesta / probada por @ AF7:
Los tirantes rizados protegen contra ediciones y la salida protege contra anexos. Por supuesto, todos estaríamos mucho mejor si bash viniera con una opción, como
-w
(archivo completo), o algo que hiciera esto.fuente
Divida su secuencia de comandos en funciones, y cada vez que se llame a una función, lo haga
source
desde un archivo separado. Luego, puede editar los archivos en cualquier momento y su secuencia de comandos en ejecución recogerá los cambios la próxima vez que se obtenga.fuente
¡Buena pregunta! Espero que este sencillo script ayude
En Linux, parece que los cambios realizados en un .sh en ejecución son ejecutados por el script en ejecución, ¡si puede escribir lo suficientemente rápido!
fuente
Una nota al margen interesante: si está ejecutando un script de Python, no cambia. (Esto probablemente sea descaradamente obvio para cualquiera que entienda cómo el shell ejecuta los scripts de Python, pero pensó que podría ser un recordatorio útil para alguien que busque esta funcionalidad).
Yo creé:
Luego, en otro shell, mientras está inactivo, edite la última línea. Cuando esto se completa, muestra la línea inalterada, presumiblemente porque está ejecutando un
.pyc
? Lo mismo sucede en Ubuntu y macOS.fuente
No tengo csh instalado, pero
Ejecuta eso, edita rápidamente la última línea para leer
La salida es
Hrmph.
Supongo que las ediciones de los scripts de shell no tienen efecto hasta que se vuelven a ejecutar.
fuente
Change didn'ned
.Si todo esto está en un solo script, entonces no, no funcionará. Sin embargo, si lo configura como un script de controlador que llama a subguiones, es posible que pueda cambiar un subguión antes de que se llame, o antes de que se vuelva a llamar si está en bucle, y en ese caso creo que esos cambios se reflejaría en la ejecución.
fuente
Escucho que no ... pero ¿qué pasa con algunas indirectas?
BatchRunner.sh
Command1.sh
Command2.sh
Entonces, debería poder editar el contenido de cada archivo de comando antes de que BatchRunner llegue a él, ¿verdad?
O
Una versión más limpia haría que BatchRunner buscara un solo archivo donde se ejecutaría consecutivamente una línea a la vez. Entonces, debería poder editar este segundo archivo mientras el primero se está ejecutando, ¿verdad?
fuente
Use Zsh en su lugar para sus scripts.
AFAICT, Zsh no exhibe este comportamiento frustrante.
fuente
por lo general, es poco común editar su script mientras se está ejecutando. Todo lo que tiene que hacer es poner bajo control sus operaciones. Use declaraciones if / else para verificar las condiciones. Si algo falla, haz esto, de lo contrario haz aquello. Ese es el camino a seguir.
fuente