2014-04-01 29 views
5

Sto studiando gli script di avvio di System V trovati in /etc/init.d/ nella versione corrente di Debian 7.4.0 wheezy (ma è presente anche in altre versioni precedenti). Quasi tutti (dai servizi esistenti) trovati in quella cartella finiscono con, fondamentalmente una linea vuota contenente nient'altro che due punti (:) segno. Anche il file modello "scheletro" che può essere trovato lì con lo scopo di scrivere i propri script di init ha questo. Ecco una copia/incolla dal fine del codice:Lo script di shell termina con una riga contenente solo due punti?

esac 

: 

(che era la fine di un'istruzione caso e poi c'è la fine del file)

Ciò che è interessante è che non c'è uscita 0 o uscita $? chiamata, tranne solo in alcune condizioni nella dichiarazione del caso, che si chiamerebbe altrimenti, quindi sembra che il segno del colon sia una sorta di sostituto per esso? Codice file skeleton completo è qui: https://gist.github.com/ivankovacevic/9917139

Che cosa potrebbe essere quel colon e perché?

+4

':' è un integrato che valuta a 'true' in bash, così ho il sospetto questo è quello di ripristinare' $ 'a 0. –

risposta

4

Il colon è un elemento sintattico che, essenzialmente, non fa nulla, ma restituisce vero. Può essere utilizzato ovunque sia possibile utilizzare un comando.

Talvolta è necessario dove sh (1) richiede un'istruzione. Ad esempio, questo dà un errore:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    # echo yes 
else 
    echo no 
fi 

bash: errore di sintassi nei pressi di token imprevisto `altra cosa'

Sostituire il commento con un: lo fa funzionare:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    : echo yes 
else 
    echo no 
fi 

Raramente è necessaria per usare esplicitamente "exit 0" nella shell; in assenza di una dichiarazione di uscita, lo script di shell esce con lo status dell'ultimo comando, uno script di shell che esegue solo

/bin/false 

darà uno stato di uscita 1:

$ echo $? 
1 

il colon è in gran parte magia nera, e ho imparato quel poco che ne so dalla sperimentazione.

+1

perché no? chiama l'uscita 0 alla fine della sceneggiatura, invece di fottere la mente della gente con un: ...O c'è un vantaggio reale nell'usare i due punti all'uscita 0 –

+1

Sono d'accordo @Ivan Kovacevic: la leggibilità è migliorata dall'essere espliciti riguardo al valore di uscita, quindi scrivo sempre "exit 0" quando ho bisogno di uno script per restituire uno stato di successo. Detto questo, si dovrebbe usare 'exit 0' solo quando si vuole in realtà sovrascrivere uno stato di errore, perché i ritorni dello stato di errore sono lì per un motivo. – BertD

+1

Il colon ha un vantaggio discutibile: produce uno stato di uscita di 0 senza dover scegliere tra 'exit' e' return' (utile se uno script potrebbe essere eseguito * o * originato; 'exit'ing da un file di origine è improbabile essere desiderabile e 'return'ing da uno script è un errore). In questi giorni, il 'vero' più leggibile dovrebbe essere disponibile al posto dell'arcaico': 'a questo scopo. – chepner

1

Il : restituisce lo stato vero in BASH ed è solo una sostituzione per la parola true. Non vedo alcun vantaggio nell'usare : come indicato in exit 0 alla fine di uno script di inizializzazione del sistema diverso da quello di salvare caratteri o renderlo meno leggibile.

Come su chepner di punto, : garantirebbe uno stato vero senza uscire dal guscio se lo script è di provenienza.

È anche comunemente utilizzato per sostituire la negazione logica utilizzando ! nelle istruzioni.

if [[ $var ]]; then 
    : 
else 
    echo no 
fi 

è la stessa:

if ! [[ $var ]]; then 
    echo no 
fi 
+1

Se lo script può (o deve) essere originato, 'exit 0' uscirà dalla shell che ha originato lo script, non solo lo script. – chepner