Hashbang!

Hashbang!

Aprendo un qualsiasi script o un programma Python o Perl su un sistema Linux o BSD è la norma trovare nella primissima riga del file i caratteri cancelletto e punto esclamativo seguiti dal percorso verso un programma.

Ad esempio;

#!/bin/sh

La sequenza #! è detta hashbang perchè si tratta dei caratteri hash (il cancelletto) e il punto esclamativo che in maniera onomatopeica viene interpretato come "bang", nel senso di un forte colpo che sorprende. Spesso ci si riferisce a questa sequenza anche con altri nomi, come shabang, dove sha sta per "sharp" che è un nome alternativo per il carattere #, oppure molto più comunemente con il termine shebang dove non è chiarissimo da cosa derivi "she".

Comunque la vogliamo chiamare, questa sequenza di due caratteri indica che se il file testuale in cui si trova viene eseguito, in realtà deve essere interpretato attraverso il programma dichiarato dallo shabang.

Chi ha dimestichezza con i sistemi Windows sicuramente saprà che in questi è l'estensione del nome del file che dichiara come il file deve essere eseguito. Ad esempio un file con estensione .bat o .cmd viene eseguito dal prompt dei comandi.

Nei sistemi Unix invece per rendere eseguibile un file occorre innanzitutto flaggare il file come eseguibile (ad esempio con chmod +x nomefile e poi dichiarare nella prima riga del medesimo con quale programma deve essere interpretato.

In termini pratici accade che se ad esempio creo un file chiamato mioprogramma, lo marco come eseguibile e sulla sua prima riga inserisco l'hashbang: #!/bin/perl, e lo lancio, la shell carica la prima riga del file, si accorge grazie all'hashbang che il file è uno script eseguibile con /bin/perl, e quindi provvede a rilanciare perl usando lo script come input.

Quindi noi impartiamo il comando:

./mioprogramma

e la shell, visto l'hashbang #!/bin/perl lo reinterpreta come:

/bin/perl ./mioprogramma

In tutto questo il nome e l'estensione del file non hanno alcun ruolo, quello che conta è che il file abbia il flag x (eseguibile) e che sia presente un hashbang per indicare quale programma deve essere usato per interpretare lo script.

Esempio: un testo autostampante

Vediamo un esempio divertente: create un file chiamato leggimi che contenga le seguenti righe:

#!/bin/cat

Questo è un testo autostampante!

Rendetelo eseguibile con:

chmod +x leggimi

Poi eseguitelo:

 ~$ ./leggimi 
#!/bin/cat

Questo è un testo autostampante!

env

Come abbiamo più volte detto, i sistemi Unix-like sono estremamente configurabili e personalizzabili. Tutta questa libertà però ha un prezzo: non ho mai la certezza che che i programmi che mi servano siano dove mi aspetto. Faccio un esempio pratico: nella quasi totalità dei sistemi Linux la shell bash ha come path /bin/bash, ma su FreeBSD, dove la shell non c'è di default ma deve essere installata come programma aggiuntivo, solitamente viene installata in /usr/local/bin e quindi il suo path completo è /usr/local/bin/bash. Ne segue che uno script creato per Linux che ha come hashbang #!/bin/bash su FreeBSD non funzionerà perché non riuscirà a trovare bash li dove si aspetta. In questi casi risulta molto utile il programma env che cerca nel path un programma dato e lo esegue. Nel nostro esempio potremmo sostituire l'hashbang #!/bin/bash con:

#!/usr/bin/env bash

e in questo modo lo script potrà funzionare sia su Linux dove bash è in /bin, sia su FreeBSD dove bash, se è installata, risiede in /usr/local/bin. Ovviamente env è su entrambi Linux e Bsd nella stessa poszione: /usr/bin/env.

Currently there are no comments, so be the first!