2010-02-18 9 views
10

Le persone hanno notato che se si modifica l'origine di uno script di shell, le istanze attualmente in esecuzione potrebbero non riuscire?Come rendere robusti gli script della shell modificati durante l'esecuzione

Questo a mio avviso è pessimo; significa che devo assicurarmi che tutte le istanze di uno script vengano interrotte prima di apportare modifiche. Il mio comportamento preferito sarebbe che gli script esistenti continuassero a funzionare con il vecchio codice sorgente e che le nuove istanze usassero il nuovo codice (ad es. Cosa succede per i programmi perl e python).

La gente ha qualche buona soluzione per questo comportamento, a parte la copiatura preliminare dello script della shell in un file temp e la sua esecuzione?

Grazie, /YGA

+0

è anche possibile eliminare lo script durante l'esecuzione, al fine di evitare la modifica. Vedi [questo post] (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run) per il motivo e come automatizzarlo. –

risposta

16

molto leggero aggiunta alle altre risposte qui sotto:

#!/bin/sh 
{ 
    # Your stuff goes here 
    exit 
} 

Il exit alla fine è importante. Altrimenti, il file di script potrebbe essere ancora accessibile alla fine per vedere se ci sono altre righe da interpretare.

La domanda è stata successivamente ripubblicato qui: Can a shell script indicate that its lines be loaded into memory initially?

+1

La soluzione di Jonathan Leffler è buona, ma non funzionava per me senza l'uscita :-) – YGA

2

Assicurarsi il guscio deve analizzare l'intero file prima di eseguire qualsiasi di esso:

#!/bin/ksh 
{ 
all the original script here 
} 

Che fa il trucco.

Per inciso, con Perl (e presumo Python), il programma analizza l'intero file prima di eseguirne uno, esattamente come consigliato qui. È per questo che di solito non incontri il problema con Perl o Python.

+0

Questo codice ha un difetto. Vedi la [risposta dell'utente "anonima"] (http://stackoverflow.com/a/2358432/780703). –

2

Il comportamento desiderato potrebbe non essere possibile, a seconda della complessità degli script della shell coinvolti.

Se lo script di shell completo è contenuto in un singolo file di origine e tale file viene completamente analizzato prima dell'esecuzione, lo script di shell è generalmente al riparo dalle modifiche alla copia sul disco durante l'esecuzione. Il raggruppamento di tutte le istruzioni eseguibili in una funzione (o una serie di funzioni) generalmente raggiungerà l'obiettivo desiderato.

#!/bin/sh 

doit() 
{ 
# Stuff goes here 
} 
# Main 
doit 

La difficoltà viene quando lo script shell "comprende" altri script shell (ad esempio "", o "sorgente"). Se questi include sono inclusi in una funzione, non vengono analizzati fino a quando non viene raggiunta tale istruzione nel flusso di esecuzione. Questo rende lo script della shell vulnerabile alle modifiche a quel codice esterno.

Inoltre, se lo script della shell esegue qualsiasi programma esterno (ad esempio script di shell, programma compilato, ecc.), Tale risultato non viene acquisito fino a quando non si raggiunge quel punto dell'esecuzione (se mai).

#!/bin/sh 

doit() 
{ 
    if [[some_condition]] ; then 
     resultone=$(external_program) 
    fi 
} 
# Main 
doit 
+0

Il tuo codice dovrebbe essere considerato pseudo codice per 'sh'. –

Problemi correlati