Guide: passo per passo

Condividi:        

La shell e la riga di comando

Generale
PREMESSA: se non conoscete il significato di qualche parola consultate il nostro Glossario.
1. Introduzione

La shell è un interprete di comandi che si interpone tra computer ed utente. L'utente impartisce un comando (o una serie di comandi raggruppati in uno script simile ai file .bat del dos) e la shell lo interpreta ed invia al sistema operativo.
Si tende spesso a sottovalutare la shell preferendo l'uso di tool grafici; ma può accadere di trovarsi in situazioni critiche dove il tool grafico non è disponibile o insufficiente. Conoscere i principali comandi, sapersi muovere senza l'aiuto del mouse o di qualcosa di grafico, diventa indispensabile. In questa guida tratteremo i comandi fondamentali per saperci muovere nelle directory (cartelle), sapere manipolare file, tratteremo la redirezione e le pipe, le variabili, gestiremo i jobs.
Sotto Linux esistono vari tipi di shell ma la più usata e trattata in questa guida è BASH (Bourne Again Shell).


LA RIGA DI COMANDO E I CARATTERI SPECIALI
La riga di comando è solitamente composta da due parti: la prima contiene informazioni circa l'utente connesso, mentre la seconda è composta da una stringa che definisce i comandi impartiti alla shell. La stessa si presenta come segue:


[zendune@localhost zendune]$

La presenza del carattere ''$'' non è casuale: infatti indica all'utente che la shell invierà i comandi impartiti in modalità non amministrativa. Quando root (amministratore del sistema) avvierà una shell, la stessa presenterà al posto di un ''$'' il carattere ''#''. Dopo il predetto carattere, è presente il cursore in attesa dei comandi che l'utente vorrà eseguire.
Il comando fondamentale che si impara sotto ogni sistema operativo è la visualizzazione della directory (cartella per chi viene da Windows) di partenza. Il comando l (la lettera elle in minuscolo) fa al caso nostro mostrandoci l'output come in figura.
Come è possibile vedere, per la Mandrake, l'output viene colorato in base alla tipologia del file: blu scuro per le directory, azzurro per i collegamenti, verde per i file eseguibili (con l'attributo +x), rosso quelli archiviati (.zip, .tar, ecc...) e bianchi per tutti gli altri. Per fare una prova, si provi a dare il comando l -a che visualizza tutti i file, pure quelli nascosti identificati da un ''.'' che precede il nome del file.
Per potersi muovere all'interno della struttura del disco è necessario utilizzare il comando cd seguito dal nome della directory, come mostrato in figura. Per tornare alla directory precedente (intesi come directory figlia di quella attuale) basta dare il comando cd .. (fate attenzione allo spazio tra ''cd'' e ''..'').
Rimuovere un file è altrettanto semplice con il comando rm nome_file. Lo stesso comando può essere utilizzato per rimuove directory.
Spesso però non ci si ricorda il nome completo del file oppure si rammenta solo la sua estensione. La shell permette l'utilizzo di caratteri speciali ovvero ''*'' (asterisco), ''?'' (punto di domanda) e ''['' '']'' (parentesi quadra aperta e parentesi quadra chiusa). L'asterisco sta ad indicare tutti i caratteri, il punto di domanda un solo carattere e le parentesi quadre un insieme di caratteri specificati all'interno delle parentesi. Ecco alcuni esempi in figura.
Come si è potuto notare, l'utilizzo dei caratteri speciali è molto utile non solo in fase di visualizzazione ma anche di copia, cancellazione o rimozione (si veda il comando mv.


STANDARD INPUT, STANDARD OUTPUT E STANDARD ERROR
Quando fu creato UNIX si impose il concetto della separazione tra implementazione logica e organizzazione fisica dei file. Infatti un file scritto sull'hard disk si presenza suddiviso a blocchi casualmente disposti sulla memoria di massa (organizzazione fisica), mentre l'utente vede il file come un sequenza continua di byte (organizzazione logica). Questo modo di vedere il file è la base per ogni cosa esista in Linux: tutti i dispositivi sono file, una sequenza di byte con dei dati in ingresso (input) e dei dati in uscita (output). E' quindi possibile muovere i dati in modo tale che entrino in un dispositivo e ne escano rientrando in un altro dispositivo. Si pensi ad esempio alla tastiera ed al monitor. I tasti che pigiamo sono l'input della tastiera e l'output viene inviato all'input dello schermo che come output ce li mostra.
In Linux esistono tre canali: standard input (che normalmente è la tastiera), lo standard output (che normalmente è lo schermo) e lo standard error (una variante dello standard output).


LA RIDIREZIONE E LE PIPE
Il flusso di dati che si muove sul computer è riconducibile pertanto ad un file cioè ad una sequenza continua di byte. Questo flusso può essere ridiretto mediante degli operatori specifici: "<" (simbolo minore) è l'operatore di redirezione dello standard input; ">" (simbolo maggiore) è l'operatore di redirezione dello standard output; "2>" oppure ">&" sono gli operatori di redirezione dello standard error.
Lo standard input viene utilizzato principalmente per dare ad un comando come input un file (in tutti gli altri casi si usa la tastiera). Supponiamo di vole vedere il contenuto del file prova.txt mediante il comando cat. Ecco l'esempio in figura.
Più usato è lo standard output quando si vuole, ad esempio, reindirizzare l'output dallo schermo ad un file. Si osservi quest'altra figura. L'esito del primo blocco dell'operazione ps aux | grep kmix estrapola dall'elenco dei processi quelli aventi stringa "kmix" e, l'output, viene reindirizzato verso il file prova.txt. In effetti il file viene creato (sovrascrivendo l'esistente) con l'esito delle operazioni sopra descritte. E' possibile comunque aggiungere in coda al file prova.txt l'esito senza sovrascrivere quanto in esso contenuto mediante l'operatore ">>". Dal prompt dei comandi digitare la stringa ps aux | grep kmix >> prova.txt.
E se durante l'esecuzione del comando si verificano errori ? Il comando cat visualizza sul monitor il contenuto di file; supponiamo di visualizzare il file inesistente prova_non_esiste.txt e di ridirigere l'output nel file prova2.txt. Il comando sarà cat prova_non_esiste.txt > prova2.txt.L'esito è scontato: il file prova2.txt sarà vuoto ed apparirà sullo schermo che il file prova_non_esiste.txt non esiste. Se si volesse creare una serie di comandi o fare debug su una serie di istruzioni, è possibile ridirigere gli errori in un file anziché sullo schermo. Si modifichi l'esempio sopra e si digiti cat prova_non_esiste.txt > prova2.txt 2> errore. prova2.txt sarà vuoto ed errore conterrà l'avviso che il file non esite.
Oltre alla ridirezione è possibile concatenare i comandi tra loro generando un flusso di dati che sono l'output del primo comando e l'input del secondo. Per creare questo flusso si ricorre alla pipe. Nell'esempio precedente abbiamo introdotto proprio la pipe indicata dal carattere "|". Il comando ps, utilizzato unitamente ai parametri "aux", elenca i processi attivi; mentre il comando grep cerca la stringa "kmix". Unendo i 2 due comandi mediante pipe abbiamo richiesto alla shell di mostrarci tutti i processi registrati aventi come sotto stringa "kmix".
Un'altro semplice esempio è mostrare l'elenco dei file di una directory avendo cura di visualizzare tante righe quante concesse dalla console attiva. Il comando sarà l -al | more.


LE VARIABILI
Durante l'esecuzione di un comando o più in generale di un programma, potrebbe essere necessario assegnare dei valori temporanei a delle variabili; queste avrebbero vita nell'ambito dell'esistenza della shell.
Esistono già variabili impostate quali ad esempio il path di ricerca quando eseguiamo un comando. Per visualizzare questa variabile basterà digitare il comando echo $PATH. Il comando echo visualizza il valore della variabile PATH (precedendo il nome della variabile dal carattere “$”).
Per creare una variabile basterà darle una label ed assegnarle il valore con la seguente sintassi nome_variabile=valorefacendo attenzione a non inserire spazi prima o dopo il simbolo “=”. Nel caso il valore dovesse contenere degli spazi vuoti si dovrà ricorre ai doppi apici, come segue frase=”mi chiamo zendune”.
Per poter vedere tutte le variabili impostate nella shell basterà digitare il comando set. Per rimuovere una variabile si utilizzerà il comando unset come segue: unset prova.


I JOBS
Quando digitiamo un comando (che chiameremo job per distinguerlo dai processi) e premiamo il tasto "invio", questi viene eseguito ma, come abbiamo pilotato l'input e l'output, possiamo controllarne anche l'esecuzione. Alcuni comandi sono complessi e se avviati, impedirebbero l'uso della shell fino al loro completamento. E' possibile quindi avviare il comando in background ed avere nuovamente la shell libera per altri utilizzi; si può richiamare il comando in foreground oppure sospenderlo o annullarlo.
Per eseguire il comando in background è sufficiente inserire alla fine dello stesso il carattere “&”. Se volessimo stampare il file prova.txt in background basterebbe dare il comando lpr prova.txt &. Il sistema operativo assegna un numero univoco al job e lo avvia contrassegnandolo con un segno “+” (job attivo). Nel caso avviassimo un nuovo comando, a quest'ultimo verrebbe assegnato il numero successivo e marcato con il segno “-” (in attesa di esecuzione).
Per vedere quali e quanti jobs sono in esecuzione, basterà dare il comando jobs ottenendo l'output in figura.
E' possibile quindi permettere al comando di tornare in foreground utilizzando il comando fg seguito dal carattere “%” e dal numero del job. Se per esempio si volesse portare in foreground il secondo comando in coda, si digiterà fg %2. Il comando non potrà tornare in background fino alla sua conclusione. E' possibile comunque aggirare questa limitazione sospendendo il job con la combinazione di tasti “CTRL Z” e riavviandolo tramite fg o bg.
Un comando terminato non avviserà l'utente della conclusione del proprio lavoro se non esplicitamente indicato tramite notify %1 (in questo caso avvisa della terminazione del primo comando).
E' possibile infine procedere alla terminazione forzata del comando nel caso, ad esempio, entri in un ciclo infinito. Linux mette a disposizione il comando kill seguito dal numero che identifica il job (es. %1).


CONCLUSIONE
Con questa breve guida si è inteso fornire un'infarinatura della shell nonché la capacità di muoversi nelle varie cartelle in cui è organizzata la nostra memoria di massa. Potrà sembrare banale o superfluo quanto indicato ma in alcuni casi si rendere necessario: un blocco al server X e ci si ritrova in modalità testuale (in una shell); oppure, dopo aver installato la java vm, la stessa non funziona perché la variabile di ambiente $PATH non è correttamente settata.
Per chi volesse approfondire i comandi della BASH può fare riferimento a questo link http://ildp.pluto.it/guide/abs/index.html , guida approfondita naturalmente in italiano.


Generale: zendune [66.437 visite dal 16 Maggio 05 @ 23:01 pm]