Quando ci si cimenta nella programmazione di uno script per la shell, spesso si ha bisogno del nome della directory corrente e non di tutto il path che viene tornato in output dal comando pwd. E’ possibile ricavare questa informazione in ben quattro modi diversi.
1) Usare basename
Usare il comando basename è il modo più semplice per estrarre l’informazione relativa alla directory corrente; questo comando consente di recuperare la directory corrente a partire dal path che deve essere dato come parametro da riga di comando. Viene riportato di seguito un esempio di utilizzo del comando:
debian:/home/argesino# basename /usr/local/bin
bin
Tuttavia il comando riportato sopra non ha alcuna utilità in uno script shell dove le directory variano spesso. Per rendere tale comando più utile a tal scopo è possibile utilizzare la command substitution, disponibile ad esempio sulla shell bash. Questa può essere realizzata scrivendo il comando in questo modo:
debian:/home/argesino# basename $(pwd)
argesino
Su alcune shell è possibile ottenere lo stesso comportamento scrivendo pwd tra apici in questo modo:
cd /usr/local/bin basename `pwd` bin
2) Usando la sostituzione di parametro con echo
Oltre alla command substitution introdotta sopra, il linguaggio di scripting bash è pieno di altri interessanti trucchetti tra cui anche la parameter subsitution, che consente di manipolare o espandere variabili. E’ possibile usare parameter substitution con la sintassi ${var##pattern}, che rimuove da $var la parte più lunga di $pattern che corrisponde al front end di $var. Ecco un esempio di quanto detto:
debian:/home/argesino# echo ${PWD##*/}
argesino
PWD è la variabile d’ambiente che memorizza il path corrente, mentre “##” è l’istruzione che dice allo script di rimuovere qualunque cosa che trova fino a */. In altre parole, rimuove qualsiasi cosa fino all’ultimo /, lasciando solo l’ultima stringa, che qui è la directory corrente di nome argesino. Per chi fosse interessato, è possibile imparare di più circa la parameter substitution e altri modi per manipolare variabili nella Advanced Bash-Scripting Guide.
3) Usando awd e rev
Una soluzione molto più elaborata usa una combinazione di awk (una utility di pattern-scanning) e rev (una utility che riversa linee da un file o dallo standard input stdin):
debian:/home/argesino# pwd | rev | awk -F \/ ‘{print $1}’ | rev
argesino
E’ più semplice da capire lo script che segue:
debian:/home/argesino# pwd | rev
onisegra/emoh/
debian:/home/argesino# pwd | rev
onisegra/emoh/
debian:/home/argesino# pwd | rev | awk -F \/ ‘{print $1}’ | rev
argesino
4) Usando sed
Infine è possibile fare il parse dell’output di pwd nello stream editor sed usando un espressione regolare elaborata. Questo approccio può essere educativo, ma non è molto pratico.
debian:/home/argesino# pwd | sed 's,^(.*/)?([^/]*),2,' argesino
Per capire meglio come funziona questo script, è possibile rimuovere il carattere di escape(\), che è richiesto per caratteri speciali come “(“:
sed ‘s,^(.*/)?([^/]*),\2,’
s sostituisce una stringa per un’altra. Cerca due pattern, che sono indicati tra la prima e la seconda virgola. Il primo pattern (^(.*/)?) cerca dall’inizio della linea (^) fino all’ultima occorrenza che trova di / (nell’esempio, esso fa riferimento a /home/).
Il secondo pattern (([^/]*)) cerca qualunque cosa dall’ultimo pattern eccetto il carattere /, che è indicato da [^/]*, dove ^ all’inizio delle parentesi quadre significa not. Questo risulta in /home/ e argesino. La seconda parte di questa espressione regolare è la sostituzione, indicata da \2. In sed, questo è chiamato una back reference. Come il suo nome suggerisce, torna indietro e richiama un riferimento precedentemente usato. Potrebbero esserci nove di questi riferimenti, chiamati \1, \2, \3, e così via. Nell’esempio, \2 fa riferimento al secondo pattern trovato, che è argesino, cioè proprio il risultato atteso.
Concludendo, questo breve tutorial mostra che Linux offre molti modi diversi per trovare il nome di una directory. Offrire molte scelte per un compito specifico è una delle sue peculiarità.
di Francesco Argese - TuxJournal.net