2012-10-12 3 views
13

Que se passera-t-il quand je un fichier de script et enregistrez-le quand il est encore en cours d'exécution, et il imprimera mes résultats nécessaires.Que se passe-t-il lorsque je modifie un script pendant son exécution?

+0

Ne pas modifier. Si vous voulez modifier les scripts en cours d'exécution, consultez [ma réponse] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run/8926090#8926090). question [workflow Emacs pour éditer les scripts Bash pendant leur exécution] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run). (Même si Emacs n'est pas pertinent pour vous. =) –

Répondre

20

Testons-le.

Créer un script test.sh:

#!/usr/bin/env bash 

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

et l'exécuter:

$ 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 
$ 

Notez que bash continué à lire le fichier modifié. Il conserve sa position actuelle dans le fichier (en octets) lorsque le fichier change.

En guise de démonstration, le script

#!/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' 

donne la sortie

$ ./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' 

avis qu'il a tenté d'exécuter le charabia aléatoire.

(Ceci est Ubuntu 12.04. Le comportement peut varier avec d'autres coquilles.)

+4

Donc, votre réponse est en fait "oui, si vous changez le script pendant qu'il s'exécute, vous changez le script en cours"? Très cool – RandomSort

+0

@RandomSort: Mais ne comptez pas dessus. Un code auto-modifiable de ce type est totalement impossible à maintenir. (La même chose peut être faite avec les scripts batch DOS.) –

+2

Quand j'ai couru ceci, les premiers octets de/dev/urandom étaient 'rm -rf /;'. Est-ce typique? – ruief

Questions connexes