Shell: Fondamentali

Scorciatoie

Alcune dritte per lavorare con la shell:

combinazione funzione
Control-c uccide il comando/script in esecuzione
Tab autocompleta comandi e percorsi
, scorrono tra i comandi dati in precedenza
history stampa a schermo la storia dei comandi
Control-←, Control-→ scorrono tra le parole della riga
Home, End saltano all’inizio e alla fine della riga
Control-l pulisce il terminale

Trovare gli errori

Quando costruite una pipeline complessa (con |), e’ conveniente procedere in modo incrementale: partendo dalla prima, aggiungete una componente alla volta, verificando ad ogni passaggio che il risultato sia corretto.

Se la lunga sequenza di comandi che avete appena scritto non funziona, come trovare il colpevole?

  • Controllate di trovarvi nella directory giusta con pwd.

  • Controllate che i file e le directory che impiegate esistano e che il loro contenuto sia quello che vi aspettate (ad esempio che non siano vuoti).

  • Controllate la sintassi dei comandi sospetti. Potete farlo usando man:

    man comando
    
  • Controllate che le redirezioni (<, >, >>, |) siano giuste. Sono nel verso giusto? I comandi con cui le usate supportano la redirezione?

  • Controllate che minuscole e maiuscole siano corrette (ad esempio, /home/stefano/Informatica e /home/stefano/informatica sono diversi).


Invocare comandi

Per invocare un comando cmd e’ sufficiente scrivere:

cmd

nella shell e dare invio.

Alcuni comandi supportano argomenti ed opzioni aggiuntivi:

  • Gli argomenti indicano tipicamente percorsi a file, ad esempio da dove prendere l’input del comando e/o dove mettere il risultato. Ad esempio:

    scanformotifs protein.fasta known_motifs.txt motifs_found_in_protein.txt
    
  • Le opzioni alterano il comportamento del comando, spesso sono facoltative. Ad esempio:

    cmd -x -y -z --long-option
    

Esempio. Il comando ls stampa a schermo la lista dei file contenuti in una directory. Accetta uno o piu’ argomenti, che devono essere dei percorsi (a file o directory), e zero o piu’ opzioni che ne alterano il comportamento.

La sintassi completa e’:

ls [opzioni] <percorso_1> ... <percorso_n>

Per visualizzare una lista dettagliata dei contenuti della mia come con ls, ordinati per tempo di modifica, scrivo:

ls -l -t /home/stefano

Per delucidazioni, potete scrivere:

man ls

o alternativamente:

ls --help

Esempio. Per invocare il manuale di cmd, scrivo:

man cmd

Cosi’ ottengo la sintassi di cmd, incluse le opzioni accettate.

Per uscire dal manuale, premete q (quit). Per spostarvi potete usare le frecce. Per cercare un termine (ad esempio, l’opzione -t) premete / e scrivete -t; potete usare n (next) e p (previous) per spostarvi tra le varie apparizioni del testo -t nel manuale.


Lista dei Comandi

Ecco una lista completa dei comandi che useremo:

comando funzione
pwd stampa la directory corrente
ls (<percorso>) elenca i file in una directory
cd <percorso> cambia la directory corrente
mv <cosa> <dove> sposta o rinomina un file/directory
cp <cosa> <dove> copia un file/directory
rm <cosa> rimuove un file/directory
mkdir <percorso> crea una o piu’ directory
echo <testo> stampa l’eco
cat <percorso> stampa il contenuto di un file
tac <percorso> stampa il contenuto sottosopra
head <percorso> stampa l’inzio di un file
tail <percorso> stampa la fine di un file
wc <percorso> conta caratteri, parole e righe
sort <percorso> ordina righe
uniq <percorso> rimuove righe consecutive identiche
cut <percorso> stampa una o piu’ colonne
tr <percorso> sostituisce un carattere con un altro
grep <regex> <percorso> seleziona righe in base ad una regex

Percorsi

Nei sistemi Unix (quindi Linux, MacOS X, Android, etc.) il filesystem puo’ essere visto come un albero, simile a questo:

Struttura ad albero del filesystem.

La posizione di ogni file e directory nel filesystem e’ specificata da un percorso (o path).

Per usare un comando sara’ (talvolta) necessario dirgli da quali file prendere gli input e dove mettere il risultato. Per farlo, gli passeremo come argomenti i percorsi a questi file.

Ogni volta che aprite una shell, il vostro alter-ego virtuale sara’ posizionato nella directory home, che si trova qui:

/home/login.utente/

Potete cambiare posizione all’interno del filesystem usando cd e manipolare sia la struttura del filesystem (“cosa si trova dove”) sia i contenuti dei file (i dati veri e propri).

In ogni momento, potete usare pwd per visualizzare il percorso della directory dove vi trovate.

Un percorso e’ assoluto se include tutte le directory a partire dalla radice, ad esempio:

/home/login.utente/informatica/esercizi/data

oppure relativo se parte dalla directory in cui vi trovate ora, ad esempio:

informatica/esercizi/data

Esempio. Se mi trovo nella mia home (posso verificarlo con pwd), i due path:

informatica

e:

/home/stefano/informatica

sono equivalenti: indicano la stesso directory.

Alcune utili scorciatoie:

  • / e’ il percorso della radice (o root) del filesystem.
  • . e’ il percorso alla directory in cui vi trovate, qualunque essa sia.
  • .. e’ il percorso alla directory che contiene la directory in cui vi trovate, qualunque essa sia.
  • ~ e’ il percorso alla vostra home; e’ identico a /home/login.utente/.

Esempio. Per spostarmi nella radice scrivo:

cd /

Per spostarmi nella directory che contiene la directory in cui mi trovo, scrivo:

cd ..

Esercizi

  1. Cosa significa l’opzione -l di ls?

  2. Cosa significa l’opzione -n di cat?

  3. I comandi cat e tac accettano le stesse opzioni?

  4. Come si invoca il manuale di man?

  5. Verificare (a mente) se i seguenti percorsi sono validi, assoluti o relativi:
    1. .
    2. ../bio/luca
    3. /home/luca/data
    4. ../..
    5. ...
    6. ././here/there
    7. ..// (verificare con la shell usando cd)
    8. /../home
  6. Qual’e’ il percorso assoluto della tua home?

  7. Qual’e’ il percorso relativo di x se la directory in cui ti trovi e’ y?
    1. x = ~/data, y = ~
    2. x = ~/foo/bar, y = ~/bee/muu
  8. Qual’e’ il percorso assoluto di x se la directory in cui ti trovi e’ y?
    1. x = ., y = ~/data
    2. x = .., y = ~/personal
    3. x = .././maria/.., y = ~/informatica
    4. x = ./../nicola/., y = ~/informatica
    5. x = .., y = /
  9. Qual’e’ il percorso assoluto di ../proteins? Questa domanda ha senso?

  10. Il percorso relativo di una directory e’ unico?