Mini guida per BASH – parte 1 –

In questa mini-guida, ho pensato di inserire un insieme di comandi utili della nota shell linux.

Quale comando devo usare per … ?

#> type , which apropos, locate, find, ls

Come ottenere informazioni su di un file ?

#>ls, stat, file

 ls  elenca i file in una directory 
 ls -a  elenca i file in una directory compresi i file che iniziano con punto 
 ls -R elenca i file ricorsivamente all’interno delle sub-directory 
 ls -1 elenca tutti i file, uno per linea 
 ls -F elenca i file compresi di attributi, specificare uno dei seguenti attributi : / * @ % | 

Usando l’opzione -F ricordiamo che / indica una directory, l’asterisco * indica che il file è eseguibile, la chiocciola @ indica un link simbolico, il percento % mostra un —- mentre la barretta verticale | si usa per il pipe delle utility.

 stat   mostra lo status di un file o del file system, deve essere completato con dei parametri 
 stat -c ‘%A %n’ <nome file> mostra gli attributi ed il nome di um file

Se volessimo mandare più comandi in modo consecutivo, potremo scriverli su di una sola riga dividendoli con un punto e virgola (;)

 #>ls; ls -al avremo prima la lista dei file e poi la stessa lista completa di attributi

Come si usano e visualizzano le variabili in bash ?

Innanzitutto : per inizializzare e poi accedere al contenuto di una variabile in bash :

 #> var = “un valore”  // inizializzo la variabile di nome var  
 #> echo $var  // stampo il contenuto della variabile var ( attenti al $ prima del nome)
 #> un valore  // risultato del comando
 #> echo ‘Stampa di $var ‘  // Usiamo solo l’apice singolo
 #> Stampa di $var // non interpola la variabile
 #> echo “Stampa di $var” // usiamo gli apici doppi
 #> Stampa di un valore // abbiamo ottenuto il valore della variabile $var
 #> echo ‘Stampa di’ “$var” ‘contenuto nella variabile’ // usiamo un misto di apice singolo e doppio dove vogliamo inserire il valore contenuto da una variabile
 #> Stampa di un valore contenuto nella variabile // Otteniamo l’intera frase compresa di valore contenuto in $var

Ma se avessi bisogno di stampare un carattere speciale come ad esempio il dollaro ($) o l’apice singolo (‘) o l’apice doppio (“), come faccio ?

Si usa il carattere di escape cioè il back slash  \   prima del carattere, quindi:

 #> echo “Stampa di $var contenuto in \$var”  //usando gli apici doppi possiamo decidere quando interpolare la variabile 
 #> Stampa di un valore contenuto in $var // il risultato

Come posso salvare l’output di un comado?

Per salvare l’output di un comando possiamo usare l’operatore > (simbolo di maggiore) seguito dal nome del file che dovrà contenere l’output. Se volessimo invece “appendere”, cioè aggiungere in coda, useremo l’operatore >> (doppio simbolo di maggiore).

 #> ls > elenco.txt //salva l’output nel file elenco.txt  
 #> ls ../ >> elenco.txt //aggiunge l’elenco dei file in coda al file elenco.txt

Mentre per leggere il contenuto del file elenco.txt appena realizzato useremo il comando cat, il quale permette anche di concatenare il contenuto di più file, quindi :

#> cat elenco.txt  //restituirà il contenuto del file
#> cat file1.txt file 2.txt file3.txt > fileTot.txt //avremo il fileTot.txt che conterrà quanto memorizzato nei file1 – file2 e file3

Come faccio a leggere parte di un file ?

Usando il comando tail (inizia a leggere il file dalla fine) ed head (inizia a leggere il file dall’inizio). Supponiamo di avere un file (test.txt) che contiene il seguente testo una parola per rigo : uno, due, tre, quattro, cinque.

 #> tail test.txt //restituisce l’intero contenuto del file 
 #> tail +2 test.txt //restituisce il contenuto leggendo dalla terza riga in poi (due …)
 #> tail -2 test.txt //restituisce il contenuto leggendo dalla terz’ultima riga (quattro…)
 #> head -2 test.txt //restituisce le prime due righe (uno e due)

Quando realizziamo i nostri script, potremmo essere interessati a salvare tutto l’output generato da un comando, quindi output ed errore.

 #> ls …/ //generiamo un errore 
 #> ls …/ > salva.txt //a video vedremo un messaggio di errore, ma non sarà salvato nel file salva.txt 
 #> ls …/ >& salva.txt //a video non vedremo nulla, tutto sarà salvato nel file.
 #> ls …/ > salva.txt 2>&1 //questo metodo è uguale al precedente 

Nel caso volessimo redirezionare l’output di più comandi all’interno di un file, dovremo usare le parentesi graffe ( { } ) per contenere tutti i comandi

 #>{ ls -al; ls}> parentesi.txt  //otterremo un file che contiene sia l’output di ls -al sia di ls 

Usiamo il cestino

Quando abbiamo l’esigenza di “buttare nel cestino” un output (che sia di una utility o di uno stream) possimao usare il dispositivo /dev/null.

#>ls; ls …/ >& /dev/null//listiamo il contenuto di una directory mentre l’errore generato dal secondo comando viene “buttato” in /dev/null

Usare l’output di una utility come input per un’altra

Questa è una delle possibilità più interessanti della shell, il pipe di comandi che si esegue con la barretta verticale ( | ). Usiamo il file test.txt dell’esempio con tail.

 #>cat test.txt  //restituirà il contenuto dell’intero file
 #> cat test.txt|tail -2 //restituirà dalla pen’ultima riga in poi

noterete che alla utility tail non abbiamo dato un file in input inquanto lo riceve da cat. Quindi ricordate che un comando in una catena pipe riceve l’input dalla sua sinistra ed emette il suo output a destra. Ci sono però dei comandi che non leggono il proprio input in caso di pipeing quindi useremo un metodo diverso, genereremo uno stream, che poi passeremo alla utility.

 #> rm $(find / -name test.*) //cancellerà tutti i file (trovati con find) che si chiamano test con qualsiasi estensione

Il comado tee

Questo comando permette di copiare lo standard input nel file indicato e nello standard output.

 #> tee file.txt //se adesso digitassimo qualsiasi cosa, verrà visualizzato e copiato tutto in file.txt