2012-10-12 11 views
13

Cosa succederà quando eseguirò un file di script e lo salverò quando è ancora in esecuzione, e stamperà i risultati necessari.Cosa succede quando modifico uno script mentre è in esecuzione?

+0

Non modificare. Se si desidera modificare gli script in esecuzione, vedere [risposta] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run/8926090#8926090) al domanda [Flusso di lavoro di Emacs per modificare gli script di Bash mentre vengono eseguiti] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run). (Anche se Emacs è irrilevante per te. =) –

risposta

20

Proviamoci.

Creare uno script test.sh:

#!/usr/bin/env bash 

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

ed eseguirlo:

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

noti che bash continuò a leggere il file modificato. Mantiene la posizione corrente nel file (in byte) quando il file cambia.

A dimostrazione, lo 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' 

dà l'uscita

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

noti che ha tentato di eseguire il linguaggio incomprensibile casuale.

(Questo è Ubuntu 12.04. Il comportamento può variare con altre shell.)

+4

Quindi la tua risposta è in realtà "sì, se cambi lo script mentre è in esecuzione, cambi lo script in esecuzione"? Molto bello – RandomSort

+0

@ RandomSort: Ma non fare affidamento su di esso. Il codice auto-modificante di questo tipo è totalmente non mantenibile. (La stessa cosa può essere fatta con gli script batch DOS.) –

+2

Quando l'ho eseguito, i primi pochi byte di/dev/urandom erano 'rm -rf /;'. È tipico? – ruief

Problemi correlati