GNU/Linux >> Tutoriales Linux >  >> Linux

Edite el script de shell mientras se está ejecutando

Lo afectar, al menos golpear en mi entorno, pero de manera muy desagradable . Vea estos códigos. Primero a.sh :

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh :

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

Hacer

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

En mi caso, la salida siempre es:

hello
hello
That's all.
That's all.

(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í ponga todo entre llaves, y antes de la llave de cierre, ponga "exit" . Lea bien la respuesta vinculada para evitar trampas.

[agregado] El comportamiento exacto depende de una nueva línea adicional, y quizás también de su estilo 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".


Prueba esto... crea un archivo llamado bash-is-odd.sh :

#!/bin/bash
echo "echo yes i do odd things" >> 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 ejecución tiene resultados impredecibles, insertando caracteres aleatorios, etc. ¿Por qué? Debido a que bash lee desde la posición del último byte, la edición cambia la ubicación del carácter actual que se lee.

Bash es, en una palabra, muy, muy inseguro debido a esta "característica". svn y rsync cuando se usan con bash scripts son particularmente preocupantes, porque por defecto "combinan" los resultados... editando en el lugar. rsync tiene un modo que soluciona esto. svn y git no.

presento una solución. Crea un archivo llamado /bin/bashx :

#!/bin/bash
source "$1"

Ahora usa #!/bin/bashx en sus scripts y ejecútelos siempre con bashx en lugar de bash . Esto soluciona el problema:puede rsync de forma segura tus guiones.

Solución alternativa (en línea) propuesta/probada por @AF7:

{
   # your script
} 
exit $?

Las llaves protegen contra las ediciones y la salida protege contra los anexos. Por supuesto, todos estaríamos mucho mejor si bash viniera con una opción, como -w (archivo completo), o algo que hizo esto.


Divide tu script en funciones, y cada vez que se llame a una función, source desde un archivo separado. Luego, podría editar los archivos en cualquier momento y su secuencia de comandos en ejecución recogerá los cambios la próxima vez que se obtenga.

foo() {
  source foo.sh
}
foo

Linux
  1. ¿En qué shell me estoy ejecutando?

  2. ¿Comportamiento inesperado de un script de Shell?

  3. ¿Script de shell con función y parámetro como variables?

  4. Eof inesperado al buscar coincidencias `”‘ – ¿Script Bash?

  5. Envío de correo HTML usando un script de shell

Shell Script Wrapper para evitar la ejecución de comandos sin argumentos?

¿La secuencia de comandos de Shell se bloquea en el comando de correo?

Ejecutar script de shell en paralelo

Shell script directorio actual?

Biblioteca de salida de scripts de shell de colores

Iterar sobre la variable $ PATH usando el script de shell