Code, Learn

Consigli e trucchi per la vostra shell Bash

7 Maggio 2020 - 4 minuti di lettura

Come tutti gli utenti Linux e Mac (e magari anche windows con WSL (1)) non passa giorno in cui non spenda del tempo con un terminale.

Ci si sforza sempre di automatizzare i processi di sviluppo ma velocizzare anche quello che c’è a contorno non è una cattiva idea.

Ecco perché Alex Mufatti ci fornisce un elenco di consigli tra comandi e shortcut per Bash (2) che possono velocizzare il vostro lavoro (per una lista completa, vi rimandiamo al manuale di riferimento (3)).

Event designators

Gli event designators sono riferimenti a comandi appartenenti alla history, ovvero la storia dei comandi digitati nel terminale.

!-n

!-n è il riferimento all’n-esimo comando nella history partendo dall’ultimo. Quindi !-1 sarà l’ultimo comando !-2 il penultimo e così via.

$ cd tmp
$ echo "ciao"
ciao
$ mkdir pippo
$ !-2
$ echo "ciao"
ciao

!!

Una shortcut della shortcut è !! che rappresenta l’ultimo comando della history.

Uno degli usi più interessante per questa shortcut è:

$ mkdir /pippo
mkdir: cannot create directory ‘/pippo’: Permission denied
$ sudo !!
$ sudo mkdir /pippo

^string1^string2

^string1^string2 serve a ripetere il comando precedente sostituendo string2 a string1.

$ cd /cartella/con/un/path/sbagliato/esageratamente/lungo 
cd: no such file or directory: /cartella/con/un/path/sbagliato/esageratamente/lungo 
$ ^sbagliato^giusto 
$ cd /cartella/con/un/path/giusto/esageratamente/lungo 
$

Word designator

In associazione con gli event designator si possono utilizzare dei word designator per selezionare solo parte del comando precedente. Per farlo si utilizza la forma <event designator>:<word designator>.

Esistono vari tipi di word designator; il più semplice è quello che prende l’ennesimo argomento del comando:

$ cat file1.txt file2.txt file3.txt 
$ cat !!:2 
$ cat file2.txt

Alcune shortcut dei word designator sono !^ che seleziona il primo argomento del comando precedente e !$che seleziona l’ultimo argomento del comando precedente.

Tilde

Tutti conosciamo il significato di ~, ovvero tilde. Però non tutti sanno che ci sono altre espansioni gestite dal carattere tilde.

Le più utili sono:

  • ~username: la cartella home dello user username;
  • ~+: la cartella corrente (equivalente a $PWD);
  • ~-: il path dell’ultima cartella visitata.

Spazio

Un altro trucco di Bash è quello di far precedere un comando da uno spazio. In questo modo il comando non sarà salvato nella history della shell.

Questo risulta utile quando si devono immettere delle password come parametro di un comando:

$ cd tmp
$ comando_che_richiede_la_mia_password -p 1234 
$ history -1 
1111 cd tmp

Brace expansion

Con il comando brace expansion è possibile generare stringhe multiple data un stringa in una forma specifica. Le brace expansion possono essere precedute da un prefisso e un suffisso.

$ cat file_{a,b,c}.txt 
cat: file_a.txt: No such file or directory 
cat: file_b.txt: No such file or directory 
cat: file_c.txt: No such file or directory

È possibile espandere anche sequenze di numeri nella forma {numero_iniziale..numero_finale..intervallo} e concatenare diverse espansioni:

$ cat file_{a,b,c}_{1..10..2}.txt 
cat: file_a_1.txt: No such file or directory 
cat: file_a_3.txt: No such file or directory 
cat: file_a_5.txt: No such file or directory 
cat: file_a_7.txt: No such file or directory 
cat: file_a_9.txt: No such file or directory 
cat: file_b_1.txt: No such file or directory 
cat: file_b_3.txt: No such file or directory 
cat: file_b_5.txt: No such file or directory 
cat: file_b_7.txt: No such file or directory 
cat: file_b_9.txt: No such file or directory

Attenzione agli spazi però: espansioni separate da spazi sono indipendenti fra loro.

$ echo foo{bar,baz} {1,2}{0,5}
foobar foobaz 10 15 20 25

Parameter expansion

Parlando di parameter expansion si apre un mondo di possibilità. Ne citerò solo alcune, quelli che reputo più utili.

${parametro:offset:lun}

Ritorna la porzione di lunghezza lun a partire dal carattere offset della stringa in parametro:

$ parameter=ciao_come_va 
$ echo ${parameter:2:2} 
ao 
$ echo ${parameter:2:-3}
ao_come

${parametro:offset}

Ritorna la porzione stringa in parametro a partire dal carattere offset fino al termine della stringa:

$ parameter=ciao_come_va 
$ echo ${parameter:2}
ao_come_va

${parametro%match}

Ritorna la porzione stringa in parametro a meno della parte che soddisfa il pattern match :

$ parameter=ciao_come_va
$ echo ${parameter%come_va}
ciao_

${parameter^}, ${parameter^^}, ${parameter^^match}

Ritorna la porzione stringa in parametro con rispettivamente la prima lettera maiuscola, tutto in maiuscolo o le lettere che soddisfano match in maiuscolo.

$ parameter=ciao_come_va 
$ echo ${parameter^} 
Ciao_come_va 
$ echo ${parameter^^} 
CIAO_COME_VA 
$echo ${parameter^^[cao]} 
CiAO_COme_vA
Articolo scritto da