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:
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¶
Cosa significa l’opzione
-l
dils
?Cosa significa l’opzione
-n
dicat
?I comandi
cat
etac
accettano le stesse opzioni?Come si invoca il manuale di
man
?- Verificare (a mente) se i seguenti percorsi sono validi, assoluti o relativi:
.
../bio/luca
/home/luca/data
../..
...
././here/there
..//
(verificare con la shell usandocd
)/../home
Qual’e’ il percorso assoluto della tua home?
- Qual’e’ il percorso relativo di x se la directory in cui ti trovi e’ y?
- x =
~/data
, y =~
- x =
~/foo/bar
, y =~/bee/muu
- x =
- Qual’e’ il percorso assoluto di x se la directory in cui ti trovi e’ y?
- x =
.
, y =~/data
- x =
..
, y =~/personal
- x =
.././maria/..
, y =~/informatica
- x =
./../nicola/.
, y =~/informatica
- x =
..
, y =/
- x =
Qual’e’ il percorso assoluto di
../proteins
? Questa domanda ha senso?Il percorso relativo di una directory e’ unico?