2010-11-07 21 views
7

voglio creare un file bash (Sh), che esegue le seguenti operazioni:wget con uscita errorlevel bash

io chiamo lo script come www.blabla.com/bla.jpg ./download.sh

lo script deve echo se il file è stato scaricato o meno ...

Come posso fare questo? So che posso usare errorlevel ma sono nuovo di linux quindi ...

Grazie in anticipo!

risposta

6

In genere le applicazioni in Linux imposteranno il valore della variabile di ambiente $? in caso di fallimento. È possibile esaminare questo codice di ritorno e verificare se vi sono errori per wget.

#!/bin/bash 
wget $1 2>/dev/null 
export RC=$? 
if [ "$RC" = "0" ]; then 
    echo $1 OK 
else 
    echo $1 FAILED 
fi 

È possibile denominare questo script download.sh. Cambia le autorizzazioni in 755 con chmod 755. Chiamalo con il nome del file che desideri scaricare. ./download.sh www.google.com

+0

Ok .. puoi fornirmi un esempio, quindi quando il file viene scaricato, lo script echo "OK" altro come "FAILED" ... – CyberK

+1

Modificato lo script per avere OK e FAILED in esso. Ne ha fatto un esempio migliore. – ojblass

+0

@CyberK: Si preferisce anche sopprimere l'output di wgets: 'wget $ 1 2>/dev/null' – thejh

3

Si potrebbe provare qualcosa di simile:

#!/bin/sh 

[ -n $1 ] || { 
    echo "Usage: $0 [url to file to get]" >&2 
    exit 1 
} 

wget $1 

[ $? ] && { 
    echo "Could not download $1" | mail -s "Uh Oh" [email protected] 
    echo "Aww snap ..." >&2 
    exit 1 
} 

# If we're here, it downloaded successfully, and will exit with a normal status 

Quando si effettua uno script che (probabilmente) essere chiamato da altri script, è importante effettuare le seguenti operazioni:

  • Garantire argomento sanità mentale
  • Invia e-mail, scrivere su un registro, o fare qualcos'altro in modo che qualcuno sa che cosa è andato storto

Il >&2 reindirizza semplicemente l'output di messaggi di errore a stderror, che permette uno script chiamata a fare qualcosa di simile:

foo-downloader >/dev/null 2>/some/log/file.txt 

Poiché si tratta di una breve involucro, nessuna ragione ad abbandonare un po 'di sanità mentale :)

Questo permette anche di dirigere selettivamente l'uscita del wget a /dev/null, si potrebbe effettivamente vuole vedere durante il test, soprattutto se si ottiene una e-mail dicendo che non è riuscito :)

0

wget esegue in non-interattivo modo. Ciò significa che wget funziona in background e non puoi prendere il codice di ritorno con $ ?.

Una soluzione è di gestire la proprietà "--server-risposta", la ricerca http 200 codice di stato Esempio:

wget --server-response -q -o wgetOut http://www.someurl.com 
sleep 5 
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'` 
if [ "$_wgetHttpCode" != "200" ]; then 
    echo "[Error] `cat wgetOut`" 
fi 

Nota: wget bisogno di tempo per finire il suo lavoro, per questo motivo ho messo "dormire 5". Questo non è il modo migliore per farlo, ma ha funzionato bene per testare la soluzione.