Lo sí 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