2012-11-12 17 views
5

Non ho usato lo scripting di shell da secoli. Ho cercato on-line per chiedere aiuto, ma non ho trovato guide adeguate ..Problemi di comprensione di uno script di shell semplice

Qui è il codice che sto cercando di capire:

#!/bin/sh 
# -*-sh-*- 
if gcc $1 &> cmp_out; then 
    if ! ./a.out &> run_out; then 
     exit 0;     # Success. 
    fi 
fi 
exit 1;       # Failure. 

ciò che è cmp_out, e run_out? Sono questi std_out?

So che &> è un'istruzione di reindirizzamento. Ma non capisco cosa significhi in questa sintassi degli script nel minimo dettaglio.

Sto cercando una panoramica di alto livello su ciò che questo script sta facendo. Se hai bisogno di ulteriori informazioni sul perché sto usando questo script fammi sapere. Includerò di più sul perché.

In breve si tratta di un esempio incluso di debugging delta (//www.st.cs.uni-saarland.de/dd/)

+0

'cmp_out' è l'output della compilazione,' run_out' è l'output dell'esecuzione dell'eseguibile risultante. –

+0

in cui vengono reindirizzati i file in uscita. – John3136

+1

La logica è un po 'divertente: se a.out ha uno stato di uscita diverso da zero, allora questo è successo? –

risposta

1

Questo script accetta un argomento, il nome di un file di origine. Compila il file sorgente con gcc e, se la compilazione riesce, esegue il risultato. (Per impostazione predefinita, gcc scrive l'eseguibile come un file denominato a.out.)

Se la compilazione fallisce, siete fortunati, perché lo script salva l'output (sia lo standard output e lo standard error) in un file chiamato cmp_out. E se il risultato eseguito produce un output, lo salva in run_out. Lo script stesso non scrive nulla su stderr o stdout. Anche se gcc non viene trovato, quell'errore finirà nel cmp_out.

La cosa più strana dello script è che inverte lo stato di uscita dell'esecuzione, utilizzando il punto esclamativo dopo lo if. Se l'esecuzione di a.out non riesce, lo script termina con 0, esito positivo. Se a.out ha esito positivo, lo script termina con 1, errore, che è anche ciò che fa se la compilazione fallisce. Forse il punto esclamativo è un errore? Il punto e virgola dopo gli interi non è necessario.

+0

Si tratta di un pacchetto "Delta Debugging" utilizzato nelle classi CS. Se un input causa un errore, allora è considerato un caso di test "riuscito". http://delta.stage.tigris.org/using_delta.html – dana

2

> reindirizza lo standard output del comando precedente in un file denominato. &> reindirizza sia l'output standard che l'errore standard.

Quindi cmp_out è un nome file che riceverà l'output standard e l'output di errore standard dal compilatore. run_out riceve l'output standard e l'errore standard da a.out (probabilmente il file binario creato dal comando gcc).

1

C'è anche un bug nel programma, in quanto la sintassi abbreviata di "&>" è una cosa bash e non funziona nella normale shell sh. Dovrebbe essere "#!/Bin/bash" per la prima riga.

Problemi correlati