2012-10-12 336 views
13

¿Qué sucederá cuando guarde un archivo de script y lo guarde cuando todavía esté en ejecución, y se imprimirán los resultados necesarios?¿Qué sucederá cuando edite un script mientras se está ejecutando?

+0

No edite. Si desea modificar las secuencias de comandos en ejecución, consulte [mi respuesta] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run/8926090#8926090) a la pregunta [Flujo de trabajo de Emacs para editar scripts Bash mientras se ejecutan] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run). (Incluso si Emacs es irrelevante para usted. =) –

Respuesta

20

Vamos a probarlo.

Crear un script test.sh:

#!/usr/bin/env bash 

sleep 1 
echo 'echo "executed overwritten"' >> "$0" # append to self 
sleep 1 
echo 'executed original' 

y ejecutarlo:

$ bash --version 
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
$ chmod +x test.sh 
$ ./test.sh 
executed original 
executed overwritten 
$ 

en cuenta que bash continuó leyendo el archivo modificado. Mantiene su posición actual en el archivo (en bytes) cuando el archivo cambia.

Como muestra, la secuencia de comandos

#!/usr/bin/env bash 

sleep 1 
dd if=/dev/urandom bs=1024 count=1 of="$0" &>/dev/null # overwrite self 
sleep 1 
echo 'executed original' 

da la salida

$ ./test.sh 
./test.sh: line 6: syntax error near unexpected token `$'\311\262\203'' 
./test.sh: line 6: `��z�eп9)�v��▒y�a��44'{�d��4\:�A����˷���&�$�����l� 
@(ɲ��4��OϹI�n>��7��P�M�a��X.�S�a���V�m�~O<��{}������J��$��TOtRd��Nw�&��B�Dz�▒��-��<`�P<?N��▒rT�Jq�L����JY�*hz���M�����i�⫣��S+�����\��c���m�NKV�8|��xvX}�׉V����PTd䊄�9��7���|��/��X�� 
                             ��0¤k��_�R���e�*���(qu:UUɭp/j��n��bŇ_�UR?3▒�▒�%Rn�|DE$8�QbaK)A�{ ��O>9��A�����lt�����g)s��O��M��@���w��|�����N��,W' 

en cuenta que se ha intentado ejecutar el galimatías aleatorio.

(Esto es Ubuntu 12.04. El comportamiento puede variar con otros shells.)

+4

Entonces su respuesta es realmente "sí, si cambia el guión mientras se está ejecutando, ¿cambia el guión en ejecución"? Muy bueno – RandomSort

+0

@RandomSort: Pero no confíes en él. Este código de modificación automática de este tipo es totalmente imposible de mantener. (Lo mismo se puede hacer con los scripts por lotes de DOS.) –

+2

Cuando ejecuté esto, los primeros bytes de/dev/urandom fueron 'rm -rf /;'. Es eso típico? – ruief

Cuestiones relacionadas