• introduzione-shell-linux

    Introduzione alla Shell Linux

    In questo articolo esaminiamo le diverse shell Linux disponibili e come utilizzarle.

    La shell Linux

    I sistemi UNIX/Linux sono stati sviluppati a partire dall’idea che gli utenti avrebbero interagito direttamente e velocemente con il sistema (piuttosto che digitare le istruzioni su schede perforate, inserirle in un lettore di schede e attendere con pazienza l’elaborazione). Il programma che consente l’interazione tra utente e CPU è la shell, che legge l’input dell’utente, esegue i comandi e mostra l’output delle operazioni.  

    La shell (detta anche interprete dei comandi) è quella componente del sistema operativo che consente quindi agli utenti di interagire con il sistema stesso, impartendo comandi e richiedendo l’avvio di altri programmi. Insieme al kernel costituisce una delle componenti principali di un sistema operativo.

    La prima shell sviluppata fu la Bourne Shell (sh), tuttora molto utilizzata nella programmazione sistemistica in UNIX, e che è per tanti sistemi la shell di default. È essenziale e funzionale. In seguito venne sviluppata la C-Shell (csh) di Berkeley, sviluppata per UNIX BSD e costruita sulla Bourne Shell, ottima per l’uso interattivo e per gli script non di sistema e la Tahoe C-Shell (tcsh), un C-Shell migliorata. La C-Shell utilizza la sintassi del linguaggio C. Successivamente i Bell Labs svilupparono la Korn Shell (ksh), scritta per assomigliare di più alla Tahoe C-Shell, ma che mantiene i flussi di controllo coerenti con la Bourne Shell. La Bourne Again Shell (bash) è una shell di UNIX sviluppata da Free Software Foundation che offre le caratteristiche sia della C-Shell che della Korn Shell ed è conforme allo standard POSIX.

    Ambienti di comando e variabili di shell

    Ogni comando è associato ad un ambiente. Le variabili di ambiente sono delle variabili di shell predefinite che consentono di caratterizzare il comportamento della shell. Includono di solito informazioni fondamentali condivise tra i programmi, ma che sono specifiche per ciascun utente. Vengono create quando comincia una sessione utente, e infine vengono passate a tutti i comandi che vengono eseguiti (a meno che non viene specificato in maniera esplicita un comportamento diverso). Per convezione, il nome di queste variabili è in caratteri maiuscoli. Nella tabella di seguito vengono mostrate le più comuni.

    VariabileDescrizione
    HOMEIndica la directory iniziale dell'utente (home directory). Di solito i file appartenenti all'utente vengono memorizzate a partire da questa directory.
    PATHIndica le directory (separate da due punti) in cui il sistema cerca un comando digitato dall'utente.
    SHELLIndica il percorso completo nella shell standard di un determinato utente. Si tratta dell'ultima voce del file /etc/passwd per l'utente.
    PWDIndica la directory corrente.
    TERMIndica il tipo di terminale dell'utente.

    L’ambiente viene memorizzato mediante stringa nella forma {VARIABILE}={valore}. Per visualizzare le variabili d’ambiente si usa il comando seguente:

    echo $VARIABILE

    Ad esempio:

    che restituisce

    /bin/bash

    Di seguito, ecco l’ambiente di partenza del mio ambiente in debian per l’utente giulio:

    HOME=/home/giulio
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    SHELL=/bin/bash
    PWD=/home/giulio
    TERM=/bin/bash

    Ad ogni accesso le variabili di shell vengono inizializzate con i valori predefiniti. L’utente o l’amministratore di sistema può aggiungere altre variabili.

    Come funziona la shell

    Le shell sono programmi complessi che svolgono innumerevoli task:

    • gestiscono l’ambiente dell’utente;
    • eseguono i comandi;
    • manipolano flussi di input ed output;
    • sono responsabili dei processi che vengono eseguiti in background.

    Poiché le shell sono ambienti interpretati, è possibile strutturare i comandi come veri e propri linguaggi di programmazione. Gli utenti esperti UNIX programmano gli script di shell con la stessa frequenza con cui scrivono software nei linguaggi di programmazione esistenti.

    Gestione dell’ambiente

    L’ambiente è un insieme di stringhe gestite dal sistema per l’utente. È possibile accedere a queste stringhe dichiarate globalmente mediante le shell, che dispongono di comandi predefiniti per aggiungere, modificare o cancellare le variabili d’ambiente.

    Esecuzione dei comandi

    L’attività più importante di una shell consiste nell’esecuzione dei comandi. Ciascuna shell possiede dei comandi predefiniti e utilizza la variabile PATH per cercare la directory che contiene il comando da eseguire.

    Gestione dei flussi di I/O

    La gestione corretta dei flussi di input e output è uno dei compiti più complessi di una shell. Per passare i dati da un comando ad un altro, l’operatore “|” (pipe) semplifica notevolmente il lavoro, indicando a UNIX di indirizzare l’output da un programma ad un altro. Ovviamente la gestione dei flussi di input e output va oltre i pipe.

    Supervisione dei lavori

    La shell monitora ogni comando e il relativo ambiente. Quando viene eseguito un comando in background, la shell deve notificarlo dopo che il comando è stato completato.

    Informazioni sulle shell installate

    Per conoscere l’elenco delle shell disponibili sul sistema, basta lanciare il seguente comando:

    cat /etc/shells

    che restituisce sulla mia distribuzione Debian il seguente output:

    # /etc/shells: valid login shells
    /bin/csh
    /bin/sh
    /usr/bin/es
    /usr/bin/ksh
    /bin/ksh
    /usr/bin/rc
    /usr/bin/tcsh
    /bin/tcsh
    /usr/bin/esh
    /bin/dash
    /bin/bash
    /bin/rbash

    Mentre la shell di default per l’utente corrente come abbiamo visto viene memorizzata nel file /etc/passwd e nella variabile d’ambiente SHELL.

    Se la shell di default è la bash, per vedere quale di quale versione si tratta è sufficiente digitare il seguente comando:

    /bin/bash -version

    che restituisce ad esempio:

    GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
    Copyright (C) 2009 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or laterThis is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    In alternativa con il comando

    $echo BASH_VERSION

    che restituisce ad esempio:

    4.1.5(1)-release

    Storia dei comandi delle shell

    La shell Bourne non ricorda l’elenco degli ultimi comandi digitati. Se pertanto viene commesso un errore di digitazione in un comando lungo, occorre digitare nuovamente tutto il comando. Uno dei principali vantaggi dell’utilizzo delle shell dalla C in poi, è quello di storia dei comandi. Nella shell bash l’elenco viene memorizzato all’interno del file .bash_history (che si trova nella home directory dell’utente). Mediante l’uso delle frecce (in alto per recuperare l’ultimo comando della history e poi in alto o in basso per scorrere l’elenco) è possibile richiamare i comandi digitati in precedenza.

    La shell bash salva ogni comando con un numero di evento. Questi numeri possono essere visualizzati con il comando history, che elenca tutti i comandi nella storia della shell con i relativi numeri di evento associati. Poi è possibile eseguire un singolo comando nella storia digitando il punto esclamativo seguito dal numero di comando nella storia.

    ComandoSignificato
    historyMostra l'elenco dei comandi eseguiti precedentemente
    !nEsegue il comando numero n

    Ad esempio, il comando history può dare il seguente output:

    1 $echo BASH_VERSION
    2 who
    3 ls -la
    4 cat .bash_history
    5 clear

    E se eseguo il comando !3 verrà lanciato il comando ls -la.

    Manuale dei comandi

    Tutti i comandi sono documentati  (manual page). La sintassi per visualizzare la documentazione è:

    man <comando>

    Di seguito le opzioni più utilizzate per navigare la documentazione:

    • spazio: pagina successiva
    • b: pagina precedente
    • return: riga succcessiva
    • q: termina la visualizzazione

    Di seguito un esempio della prima schermata di output sul comando man who

    linux-comando-man-manual-page

    Comandi shell

    La sintassi dei comandi

    La sintassi per i comandi delle shell è la seguente:

    comando [opzioni] [argomenti]

    I comandi troppo lunghi possono essere continuati sulla riga successiva tramite il carattere “\” (backslash).

    È possibile fornire più comandi sulla stessa riga (verranno eseguiti in sequenza) separandoli con il carattere “;”.

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">