Oggi melabit compie tre anni. Per l’occasione ho chiesto all’amico Lux il permesso di ripubblicare un mio vecchio intervento sul suo (bellissimo) blog Ping, chiuso purtroppo con la cessazione della pubblicazione dell’edizione italiana di Macworld.
Perché pubblicare di nuovo questo articolo dopo più di sei anni?
Innanzi tutto perché quello che c’è scritto è ancora attuale e, come ha scritto a suo tempo Lux con il suo stile inimitabile, può essere utile per “avvicinarsi agli incantesimi Unix che danno vita al mondo magico di Mac OS X”, una cosa a cui tengo sempre moltissimo. Magari oggi proporrei di usare sul Mac launchd
al posto di cron
, anche se quest’ultimo rimane la soluzione più generica, valida su un qualunque sistema Unix.
C’è poi un motivo più personale: proprio dopo questo intervento ho cominciato a pensare che tenere un blog non fosse un’idea proprio fuori dal mondo. Ci ho messo un po’ (come sempre!) a realizzarla, ma dopo tre anni devo ammettere che è stata un’ottima decisione, le soddisfazioni non sono mancate.
Introduzione
L’articolo rispondeva all’esigenza di un lettore di Ping di cambiare automaticamente i permessi di determinati tipi di file contenuti in una cartella del Mac. Cosa ci può essere di meglio del Terminale per fare queste cose?
Ho lasciato praticamente inalterato il testo originale, limitandomi a correggere alcune imprecisioni e ad aggiungere qualche dettaglio qui e là.
Me li do io i permessi
Premessa #1: il Terminale in Mac OS X si trova in Applicazioni > Utility
. Una volta lanciato può essere configurato in molti modi (tramite le Preferenze) perdendo quell’aspetto un po’ triste e troppo serioso che spaventa l’utente normale.
Dopo l’avvio, il Terminale presenta il cosiddetto prompt, che su OS X mostra tipicamente il nome del computer, la cartella dove ci si trova e il nome dell’utente. L’ultimo carattere del prompt è normalmente il $
. Nel Terminale i comandi vengono inseriti dopo il simbolo $
su quella che viene definita la riga di comando e si eseguono premendo il tasto Invio
.
Il Terminale di OS X esegue di default la cosiddetta shell bash
, uno strumento potentissimo per interagire con il sistema operativo. La shell bash
può essere usata direttamente, scrivendo i comandi uno ad uno sulla riga di comando e leggendone il risultato direttamente nel Terminale.
Oppure si possono scrivere degli script
, piccoli programmi nel linguaggio di bash
nei quali si inseriscono in sequenza i comandi da far eseguire alla shell, che si dimostrano molto utili per automatizzare delle operazioni che eseguiamo ripetutamente sul Mac.
Premessa #2: perché usare i comandi di bash
invece di Automator o di AppleScript? Beh, innanzitutto perché bash
è multipiattaforma e quindi funziona su Linux e, volendo, anche su Windows. E poi semplicemente perché bash
mi piace!
Lanciamo quindi il Terminale (magari configurandolo prima, io consiglio almeno di aumentare le dimensioni della finestra a circa 100×40 per stare comodi e di scegliere un tema grafico più accattivante di quello bianco e un po’ spento di default) e iniziamo a lavorare.
Creiamo innanzi tutto una cartella ~/bin
, dove il carattere ~
(tilde, ALT+5) indica per convenzione sui sistemi basati su Unix la cartella Inizio
(detta anche Home
) dell’utente che sta usando il computer in questo momento. Per farlo da Terminale, digitiamo (ATTENZIONE, come già detto $
indica solo l’ultimo carattere del prompt e NON va mai inserito nei comandi seguenti):
$ cd
$ mkdir bin
$ chflags hidden bin
$ cd bin
Il primo comando serve per essere sicuri di partire dalla Home
, il secondo crea una nuova cartella bin
nella Home
, il terzo la nasconde al Finder e l’ultimo comando ci fa spostare nella cartella bin
appena creata.
In teoria siamo liberi di salvare i nostri comandi bash
in una qualunque cartella del Mac e possiamo anche usarne una già esistente. Ma usare la cartella bin
nella nostra Home
rispetta le convenzioni dei sistemi Unix e mi sembra preferibile.
A questo punto usiamo nano
(un editor testuale molto semplice installato di default sul Mac) per editare lo script bash
cambia_permessi
, nel quale inseriremo i comandi veri e propri che ci servono per cambiare i permessi dei file contenuti nella cartella nella quale verrà eseguito lo script:
$ nano cambia_permessi
Non preoccupatevi per l’interfaccia un po’ ostica di nano
, qui ci basta usare solo due comandi, CTRL+O
per salvare il file editato e CTRL+X
per uscire da nano. Dimenticavo: CTRL+O
significa premere contemporaneamente il tasto CTRL
, l’ultimo in basso a sinistra sulle tastiere Mac (nei portatili è a fianco di fn), e il tasto O
. Analogamente per CTRL+X
.
Torniamo al nostro file cambia_permessi
. A questo punto bisognerebbe copiare a mano le linee mostrate qui sotto. Ma OS X è furbo e il copia e incolla funziona anche nella finestra del Terminale, per cui è sufficiente selezionare tutte le linee mostrate qui sotto, copiarle e poi incollarle nella finestra del Terminale dove è attivo nano
:
#!/bin/bash
#
DIR=~/scansioni/
FILES=*
PERM=u+rw
#
if [ -d $DIR ]; then
cd $DIR
chmod -R $PERM $FILES
cd
fi
Salviamo lo script premendo CTRL+O
ed usciamo da nano
con CTRL+X
.
Cosa significano questi comandi? Il più importante è chmod
, che cambia i permessi di tutti i file contenuti nella cartella ``~/scansioni/` in modo che siano leggibili e scrivibili dall’utente attuale del Mac. Il resto è solo roba di contorno.
Quello che è ancora più importante è che lo script è totalmente parametrico: basta cambiare i valori di DIR
, FILES
e PERM
per adattarlo alle proprie esigenze.
Per esempio, se la cartella ~/scansioni/
contenesse vari tipi di file e si volessero cambiare i permessi dei soli file pdf
lasciando gli altri file invariati, la riga FILES=*
diventerebbe FILES=*.pdf
.
Non è finita. Controlliamo prima di tutto di avere veramente fatto tutto bene con il comando:
$ cat cambia_permessi
che dovrebbe mostrare sullo schermo lo script appena inserito.
Per semplificarci la vita, rendiamo lo script eseguibile con il comando:
$ chmod u+x cambia_permessi
Bisogna notare che con questo comando abbiamo reso eseguibile lo script solo per l’utente attuale del Mac. I motivi li tralascio per brevità, ma credetemi, è decisamente meglio fare così.
Un ultimo passo necessario. In questo momento, per cambiare i permessi dei file nella cartella ~/scansioni/
bisogna eseguire a mano il comando dal Terminale:
$ ~/bin/cambia_permessi
(anche se, per come è configurato di default OS X, usare soltanto $ cambia_permessi
, senza scrivere esplicitamente il percorso dove è salvato lo script basta e avanza).
Ciò è sicuramente molto più comodo di cambiare uno ad uno i permessi dei file, ma si può fare di meglio.
Qui entra in gioco cron
, uno strumento che esegue dei comandi stabiliti dall’utente a intervalli di tempo predefiniti. Sembra una cosa un po’ cretina, ma in realtà permette di far fare al computer un mare di cose automaticamente. Purtoppo la sintassi di cron è orrenda. E questo post sta diventando troppo lungo.
Cercherò di sintetizzare ma se qualcuno è interessato posso scrivere qualcosa in proposito. (Nel frattempo l’ho fatto, chi fosse interessato può leggere questo articolo dettagliato su cron.)
Diciamo che vogliamo che ogni cinque minuti lo script cambia_permessi
venga eseguito automaticamente. Dal solito Terminale dobbiamo allora eseguire i comandi:
$ export EDITOR=/usr/bin/nano
$ crontab -e
La prima riga serve ad evitare di usare l’editor preimpostato, vi
, vn vero reperto archeologico che sarebbe bene dimenticare una volta per tutte. Dovrebbe invece aprirsi il solito nano
, in cui dobbiamo incollare esattamente la riga seguente:
*/5 * * * * ~/bin/cambia_permessi
(prima e dopo ciascun asterisco è presente una tabulazione), eventualmente aggiungendola in coda ai comandi già presenti.
Salviamo con CTRL+O
e usciamo da crontab
con CTRL+X
.
Ovviamente se vogliamo che lo script venga eseguito più o meno frequentemente, basta cambiare il valore */5
in, diciamo, */2
o */15
(per eseguire lo script ogni 2 o 15 minuti). Per casi più complicati basta leggere qui.
Abbiamo finito. Sembra complicato, ma credetemi, è molto più lungo da leggere (e da scrivere!) che da mettere in pratica.
Nota finale
Per chi ha paura del Terminale e soprattutto di cron
, un programma potente ma, bisogna ammetterlo, ben poco user-friendly, ecco una soluzione aggiuntiva, farina di Lux.
Aggiungo solo una piccola nota per gli inesperti di Terminale che si scontrano con
cron
(e, su Snow Leopard, conlaunchd
). Una scorciatoia artigianale consiste nel definire un evento ricorrente dentro iCal e, nelle informazioni relative, stabilire che in occasione dell’evento va eseguito uno script.
Molto pratica se si ha bisogno di ripetere uno script una o due volte al giorno al massimo, in tutti gli altri casi temo che finirebbe per riempire all’inverosimile il proprio Calendario, con conseguenze che francamente mi sfuggono.