Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

<Precedenti | Contenuti | Succ.>

Programmazione difensiva

È importante verificare le ipotesi durante la programmazione. Ciò significa un'attenta valutazione dello stato di uscita di programmi e comandi utilizzati da uno script. Ecco un esempio, basato su una storia vera. Uno sfortunato amministratore di sistema ha scritto uno script per eseguire un'attività di manutenzione su un server importante. Lo script conteneva le seguenti due righe di codice:


cd $nome_dir rm *

cd $nome_dir rm *


Non c'è nulla di intrinsecamente sbagliato in queste due righe, purché la directory denominata nella variabile, nome_dir, esiste. Ma cosa succede se non lo fa? In tal caso, il cd il comando non riesce e lo script continua alla riga successiva ed elimina i file nella directory di lavoro corrente. Non è affatto il risultato desiderato! Lo sfortunato amministratore ha distrutto una parte importante del server a causa di questa decisione di progettazione.

Diamo un'occhiata ad alcuni modi in cui questo design potrebbe essere migliorato. In primo luogo, potrebbe essere saggio eseguire l'esecuzione di rm condizionato dal successo di cd:


cd $nome_dir && rm *

cd $nome_dir && rm *


In questo modo, se il cd il comando fallisce, il rm comando non viene eseguito. Questo è meglio, ma lascia ancora aperta la possibilità che la variabile, nome_dir, non è impostato o è vuoto, il che comporterebbe l'eliminazione dei file nella directory home dell'utente. Questo potrebbe anche essere evitato controllando per vedere che nome_dir contiene effettivamente il nome di una directory esistente:



[[ -d $nome_dir ]] && cd $nome_dir && rm *

[[ -d $nome_dir ]] && cd $nome_dir && rm *


Spesso è meglio includere la logica per terminare lo script e segnalare un errore quando si verifica una situazione come quella sopra:



# Elimina i file nella directory $dir_name if [[ ! -d "$nome_dir" ]]; poi

echo "Nessuna directory: '$dir_name'" >&2 exit 1

fi

Se ! cd $nome_dir; poi

echo "Impossibile eseguire il cd su '$dir_name'" >&2 exit 1

fi

Se ! rm *; poi

echo "Eliminazione file non riuscita. Verifica risultati" >&2 exit 1

fi

# Elimina i file nella directory $dir_name if [[ ! -d "$nome_dir" ]]; poi

echo "Nessuna directory: '$dir_name'" >&2 exit 1

fi

Se ! cd $nome_dir; poi

echo "Impossibile eseguire il cd su '$dir_name'" >&2 exit 1

fi

Se ! rm *; poi

echo "Eliminazione file non riuscita. Verifica risultati" >&2 exit 1

fi


Qui controlliamo sia il nome, per vedere che è quello di una directory esistente, sia il suc-

Errori logici


cessazione del cd comando. Se uno dei due fallisce, viene inviato un messaggio di errore descrittivo all'errore standard e lo script termina con uno stato di uscita pari a uno per indicare un errore.


Il miglior sistema operativo cloud computing su OnWorks: