Basic shell

La Command Line Interface

Un tool indispensabile di un amministratore di sistema Unix (e ovviamente Linux) è sicuramente la Command Line Interface (CLI), l’interfaccia a riga di comando, chiamata anche Text User Interface per differenziarla dalla Graphical User Interface – la GUI, l’interfaccia utente grafica.

Sostanzialmente si tratta di un programma che interpreta ed esegue comandi letti da file o standard input (quindi generalmente inseriti tramite tastiera) e che comunica con l’utente per mezzo di messaggi mostrati su standard output (il monitor  usualmente).

Questo modo di amministrare è molto utilizzato soprattutto in virtù della sua rapidità di esecuzione e della sua versatilità.

La CLI nella sua veste grafica viene chiamata “emulatore di terminale”, questo per differenziarla dall’originale “terminale”, un apparecchio ormai pressoché in disuso. Nell’uso odierno l’accezione terminale” sta ad indicare l’emulatore di  terminale.

Dipendentemente dall’ambiente grafico utilizzato, l’emulatore di terminale di default ha differenti nomi, ma la sostanza è sempre la stessa. Ad esempio, in un ambiente grafico GNOME si chiama gnome-terminal, in KDE invece konsole, in XFCE xfce4-terminal, e cosi via. Esistono comunque anche altri emulatori di terminale che non sono legati al window manager utilizzato, con caratteristiche analoghe, ma generalmente più scarni di funzionalità accessorie e quindi meno esigenti nella richiesta di risorse di sistema, come ad esempio xterm, xvt, aterm, giusto per citare i più rinomati.

La Shell

Sia gli emulatori di terminale che le  console una volta  avviati lanciano l’esecuzione  di  una “shell” che è il vero e proprio programma che interpreta i comandi ivi digitati: una “conchiglia” al cui interno esiste un intero ecosistema con variabili d’ambiente e con un set di comandi che  permettono di:

  • spostarsi nel file system;
  • copiare, rinominare, rimuovere file e directory;
  • gestire i processi in esecuzione e molto altro, tra cui anche la possibilità  di  lanciare l’esecuzione di comandi e applicazioni non integrate nella shell stessa, intesa come programma, detti pertanto comandi esterni (si veda il paragrafo 5.4, “Comandi interni e comandi esterni”).

Mentre la scelta dell’emulatore di terminale è una questione quasi estetica, quella della shell può invece rappresentare  una  scelta funzionale, soprattutto quando si parla di scripting, cioè programmazione della shell. Vi sono molte shell disponibili negli ambienti Unix e citando quelle maggiormente diffuse troviamo:

  • bash, la Bourne Again Shell, per differenziarla dall’originale shell (“sh”) di Bourne. È compatibile con gli standard IEEE POSIX e implementa funzionalità più avanzate di derivazione della ksh e csh. Generalmente è la shell di default  nelle  distribuzioni Linux.
  • tcsh, la TENEX C Shell, una versione avanzata dell’originale Berkeley Unix C  Shell.
  • ksh, la Korn Shell, nata come estensione (superset) dell’originale sh, default in sistemi Unix come IBM AIX e SUN Solaris.
  • zsh, una shell moderna con funzionalità molto  avanzate
  • dash, la Debian Almquist Shell, una shell standard POSIX leggera con poche dipendenze di librerie, più robusta e veloce della bash e pertanto ben adatta per l’esecuzione di script (che vedremo più sotto).

Ogni shell ha dei file di controllo e di configurazione che vengono salvati all’interno della home utente. Tali file hanno lo scopo di definire e personalizzare l’ambiente di lavoro di quell’utente specifico. Prendiamo in analisi la shell di default nella maggior parte degli ambienti Linux, la bash. Nella home dell’utente possiamo trovare almeno tre file  nascosti

  • il loro nome inizia con un carattere punto (“.”) – relativi a questa  shell:
    • .bashrc : contiene comandi e configurazione di variabili d’ambiente che vengono richiamati ogni qual volta viene lanciata una shell bash; praticamente un file di inizializzazione dell’ambiente su cui si andrà a lavorare.
    • .bash_history: registra un certo numero degli ultimi comandi inseriti da tastiera. Nella bash il default è 500.
    • .bash_logout: contiene i comandi da eseguire nel momento in cui l’utente chiude la shell. Di solito è vuoto o richiama un comando che pulisce la console, ma può essere personalizzato ad esempio per lanciare un backup, per mandare una e-  mail o altro.

Per ogni shell esistono file di controllo analoghi a quelli ora mostrati.