> MENU
lfs1.png

Il File System di Linux (1/2)

Top 25: il The Best Of dei comandi utilizzati...

20 novembre 2007 Visualizzazioni: 2220 Focus

Quattro modi per estrarre il nome della directory corrente

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

twittergoogle_pluslinkedinmail
  • http://www.webalice.it/maurizio.farthest/ farthest

    Ciao

    che ne dici di echo + awk:
    echo $PWD| awk 'BEGIN{RS=""; FS="/"}{ print $NF }'

    oppure di echo+sed:
    echo $PWD| sed 's/.*\///'

    ciao

  • http://www.webalice.it/maurizio.farthest/ farthest

    Il mio preferito è quello con 'basename' ma carino è "echo ${PWD##*/}"

    ciao

  • http://www.aeromobail.cucu dicsy

    in merito al comando “basename” esiste pure la controparte, ovvero “dirname”, qui di seguito un esempio d’utilizzo:

    root@cesso /var/named# basename /usr/local/bin
    bin

    root@cesso /var/named# dirname /usr/local/bin
    /usr/local

    ciao ;)

  • lastfeel

    ma mi chiedo ancora come mai su i blog di linux ci sono le propagande microsoft