Script di shell in OS X

Nei sistemi operativi basati su Unix la shell è una applicazione che permette di eseguire i comandi del sistema tramite una interfaccia testuale a linea di comando.

La shell più popolare oggi è bash, acronimo di “Bourne-Again Shell”, un gioco di parole fra Stephen Bourne, l’autore della shell sh da cui deriva bash, e il termine “born” (nato). Bash significa quindi sia “la nuova shell di Bourne” che “la shell rinata”.

Bash è la shell ufficiale del progetto GNU, ed è da tempo la shell di default in praticamente tutte le distribuzioni di Linux oltre che in OS X.
Per accedere a bash in OS X si utilizza il Terminale, una applicazione di cui si è già parlato più volte in questo blog. Il Terminale si trova in Applicazioni > Utility.

Bash permette di eseguire i comandi del sistema operativa sia in modo interattivo, scrivendoli uno alla volta sulla linea di comando, che tramite uno script di shell (shell script), un vero e proprio programma all’interno del quale è possibile usare variabili, strutture di controllo e funzioni, esattamente come in tutti i linguaggi di programmazione.

Uno script di shell ben fatto può diventare quindi un vero e proprio comando specializzato, eseguibile dalla linea di comando e praticamente indistinguibile dai comandi intrinseci del sistema.

Ma come si crea uno script di shell? Basta seguire alcune semplici regole.

  • Innanzi tutto lo script va scritto usando un editor, mai un wordprocessor come Word o Pages. Lo script deve infatti essere un semplice file di testo e non deve contenere i codici di formattazione o i caratteri speciali inseriti normalmente dai programmi di videoscrittura.
    Come editor si può usare TextEdit, preinstallato in tutte le versioni di OS X, ma vanno ancora meglio programmi gratuiti, come TextWrangler, TextMate 2.0, Brackets, Atom, o commerciali, come il mostro sacro BBEdit e Sublime Text. Tutti questi editor hanno il grande vantaggio rispetto al semplice TextEdit di evidenziare i comandi di bash e di supportare l’autocompletamento delle parole chiave riconosciute dall’editor.
    Volendo si possono usare anche macvim o emacs, ma chi è in grado di usarli non ha bisogno di sicuro di leggere queste note.

  • Per permettere al sistema operativo di identificare il file come uno script per la shell bash, gli script devono iniziare con la riga

    #!/bin/bash

  • È buona regola salvare tutti i propri script in una cartella (directory) comune, in modo che siano facilmente rintracciabili dal sistema operativo (ma dopo un po’ di tempo anche da noi stessi!)
    Per uniformarci alle convenzioni di Unix, creiamo una directory bin nella nostra cartella Inizio (o directory home), dove salveremo tutti gli script.1
    Lanciamo il Terminale ed eseguiamo i comandi

    $ cd ~
    $ mkdir bin

dove il simbolo ~ indica per convenzione la cartella home dell’utente.

  • Lo script deve essere reso eseguibile direttamente con il comando

    $ chmod u+x scriptname    

  • Aiutiamo il sistema operativo a trovare facilmente i nostri script aggiungendo la directory bin appena creata alla variabile di ambiente PATH, che definisce le directory dove il sistema operativo va a cercare i comandi del sistema. Torniamo al Terminale ed eseguiamo in sequenza i comandi

    cp -p .bashrc .bashrc.ORIGINAL
    echo "export PATH=~/bin:$PATH" >> .bashrc

Il primo comando duplica il file .bashrc originale, mentre il secondo aggiunge la riga contenuta fra virgolette alla fine del file .bashrc.
Bisogna stare molto attenti ad usare due simboli di maggiore nel secondo comando altrimenti si rischia di sovrascrivere .bashrc con effetti potenzialmente disastrosi (questo è il motivo per cui è bene prima duplicare il file .bashrc originale).

Una volta chiuso e rilanciato il Terminale, la cartella ~/bin sarà aggiunta alla lista delle directory contenenti i comandi eseguiti da bash.

Bisogna notare che la creazione della directory ~/bin e la sua aggiunta al PATH del sistema vanno eseguiti una sola volta per ogni utente del Mac.

Vorrei infine sfatare una credenza ormai obsoleta: non è assolutamente necessario che il nome dello script termini con l’estensione .sh. È una vecchia abitudine che ha l’unico vantaggio di rendere immediatamente riconoscibile uno script salvato in una directory qualunque del sistema. Ma è una pratica inutile se si segue il consiglio di tenere tutti gli script di shell in una directory predefinita come ~/bin.


  1. La cartella Inizio in OS X è quella identificata dall’icona di una casetta. 
Advertisements
Tagged with: , , , , ,
Pubblicato su programmazione
10 comments on “Script di shell in OS X
  1. frix ha detto:

    Ottimo,
    pensi di proseguire con l’argomento?

    Mi piace

  2. Sabino Maggi ha detto:

    In che senso? Se intendi fare un corso di shell scripting, non credo. Ce ne sono di ottimi in giro, inutile reinventare la ruota.
    Se invece intendi scrivere di argomenti introduttivi, direi di si, quando serve. Il problema è che scrivendo di certi argomenti di programmazione o amministrazione del Mac (come il post padre di questo, mi sono reso conto che è difficile farlo perché per essere più comprensibile possibile devo sempre assumere che il lettore non ne sappia nulla o quasi. Il che obbliga a ripetere ogni volta dei concetti di base. Allora ho deciso che quando serve faccio prima a scrivere un singolo post introduttivo e a riferirmi a questo ogni volta che mi serve.

    Mi piace

  3. Mario ha detto:

    Salve.
    Nn mi intendo assolutamente di shell scripting.
    Avrei però la necessita di uno shell script che effetti il dismount di un disco secondario da utilizzare con carbon copy cloner dopo che lo stesso ha effettuato un clone del mio disco principale.
    La motivazione è semplice!! ….utilizzo dropbox e quando faccio la ricerca di un file o cartella nel finder ….il sistema ne trova due copie, uno sul disco principale e l’altra sul disco secondario / clone.

    Penso che non sia complicato, ….ma se ci fosse qualcuno disposto a darmi una mano, ….sarebbe molto appezzato.

    Grazie

    Mi piace

    • Sabino Maggi ha detto:

      Non è complicato, hai ragione. Anzi potrebbe essere un buon modo per usare launchd. In pratica, se capisco bene, tu vuoi collegare un disco esterno, lanciare CCC, fare il backup e poi scollegarlo automaticamente. Non male, potrebbe essere molto utile anche per l’Air di mia moglie.
      Il vero problema è riconoscere quando CCC ha finito il backup. Speriamo che sia scriptabile o che abbia la possibilità di lanciare degli script da dentro il programma. Stay tuned…

      Mi piace

      • Mario ha detto:

        Ciao, grazie per la rispsota.
        Per cinpletezza d’informazione: CCC 4 prevede le opzioni prima e dopo la fase di backup/clonazione ….fra queste quello di scegliere uno script di shell da lanciare al termine della procwdura.
        Grazie sempre.

        Mi piace

        • Sabino Maggi ha detto:

          Allora è facilissimo. In questi giorni sono preso allo spasimo, però appena ho una mezz’ora libera, vediamo che viene fuori.

          Mi piace

          • Mario ha detto:

            Thanks,

            I look forward to yours.

            Ciao

            Mi piace

          • Mario ha detto:

            Ciao,
            pensi di poter dedicare qualche minuto allo script di cui abbiamo parlato?
            Grazie

            Mi piace

          • Sabino Maggi ha detto:

            Hai fatto bene a ricordarmelo, mi era passato completamente di mente. Vedo quello che posso fare, in effetti andrebbe benissimo come esempio all’interno di un nuovo articolo su launchd. Stay tuned.

            Mi piace

          • Sabino Maggi ha detto:

            Scusami se ho fatto passare un mese ma purtroppo spesso ci sono cose imprevedibile che assorbono al 100%. Anche il blog ne sta soffrendo.

            A parte questo: l’ho fatto ed è pure facilissimo, non serve scomodare launchd, bash o chissà. C’è già tutto nelle opzioni avanzate di CCC.

            Quello che devi fare in pratica è collegare il disco esterno, configurare il backup, cliccare su Advanced Settings e selezionare l’opzione “Unmount the Destination Volume” sotto la scritta AFTER TASK RUNS, come puoi vedere nell’immagine qui sotto.

            Io ho provato a fare il backup di una mia cartella di lavoro su una chiavetta esterna che uso quando devo trasferire file su computer con Windows e funziona perfettamente.

            Comunque uno script di shell ce l’ho messo, che dice solo Ho finito quando… ha finito il backup. Lo script si chiama finito.sh

            #!/bin/bash
            say -v Alice Ho finito
            

            e l’ho messo nella mia directory ~/bin (il perché l’ho già scritto più volte su questo blog). Se vuoi usarlo con CCC s se, come dovrebbe, la tua ~/bin è nascosta, clicca sul bottone Choose e poi fai la ricerca in base al nome invece di selezionare direttamente il file.

            Comunque questo CCC mi piace, iio ho sempre usato Super Duper ma ora CCC è veramente ben fatto.

            Mi piace

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Informativa
Questo sito utilizza cookie di terze parti per inviarti pubblicità e servizi in linea con le tue preferenze. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie, clicca qui. Scorrendo questa pagina, cliccando su un link o su qualunque altro elemento o proseguendo la navigazione in altra maniera, acconsenti all'uso dei cookie.
Follow MelaBit on WordPress.com
Categorie
Archivi
%d blogger hanno fatto clic su Mi Piace per questo: