Cal (Unix)

cal è un comando dei sistemi operativi Unix e Unix-like che consente di visualizzare un calendario in formato testuale attraverso l'interfaccia a riga di comando. Se eseguito senza argomenti, mostra il calendario del mese corrente; specificando un anno, visualizza tutti i dodici mesi, mentre indicando un mese e un anno mostra il calendario del mese richiesto.

Il comando è contemplato dalle specifiche POSIX nell'ambito dell'opzione XSI. Le diverse implementazioni, tra cui quella inclusa nel pacchetto util-linux e quelle dei sistemi BSD, possono offrire opzioni e funzionalità aggiuntive.

Nella rappresentazione delle date storiche, la convenzione prevista dalle specifiche POSIX colloca il passaggio dal calendario giuliano al calendario gregoriano nel settembre 1752, con il 14 settembre immediatamente successivo al 2 settembre. Alcune implementazioni consentono tuttavia di modificare la data della riforma o di utilizzare esclusivamente uno dei due calendari.

Storia

Il comando cal è documentato fin dalla prima edizione di Unix, sviluppata presso i Bell Labs. Nell'UNIX Programmer's Manual del 3 novembre 1971, il programma compariva nella sezione VI con la sintassi /usr/ken/cal year. Il manuale riportava «ken», identificativo di Ken Thompson, nel campo relativo al responsabile del programma. Questa prima versione consentiva di visualizzare il calendario di un intero anno, compreso tra 0 e 9999; l'anno 0 era interpretato come il 1º anno a.C. Per i periodi nei quali erano in uso differenti sistemi calendariografici, il comando adottava le convenzioni dell'Inghilterra e delle sue colonie. La documentazione invitava inoltre a esaminare il calendario del 1752, anno in cui la Gran Bretagna adottò il calendario gregoriano.

Nella settima edizione di Unix, pubblicata nel 1979, cal era documentato nella sezione 1 del manuale, dedicata ai comandi. La sintassi cal [month] year permetteva di specificare facoltativamente un mese, visualizzandone il calendario anziché quello dell'intero anno. Rispetto alla versione documentata nel 1971, l'intervallo degli anni ammessi iniziava da 1 anziché da 0, mentre il mese doveva essere indicato con un numero compreso tra 1 e 12. Rimaneva la convenzione britannica relativa al passaggio dal calendario giuliano a quello gregoriano. Il manuale segnalava inoltre due limitazioni: l'inizio dell'anno era sempre fissato al 1º gennaio, indipendentemente dalle convenzioni storiche, e gli anni espressi con una o due cifre non venivano interpretati come abbreviazioni di anni più recenti.

Un'evoluzione del comando nell'ambito dei sistemi BSD fu l'introduzione di ncal, comparso in FreeBSD 2.2.6, distribuito nel marzo 1998. Il programma, sviluppato da Wolfgang Helbig, affiancava a cal una rappresentazione alternativa del calendario, caratterizzata da una disposizione più compatta dei giorni e dei mesi, che consentiva di visualizzare un intero anno su un terminale di 25 righe per 80 colonne. Entrambi i comandi sono documentati nella stessa pagina del manuale di FreeBSD, che ne distingue le modalità di visualizzazione e le opzioni disponibili.

Funzionamento

Il comando cal genera un calendario testuale e lo scrive sullo standard output, generalmente visualizzato nel terminale. I giorni del mese sono disposti secondo le settimane, con intestazioni che identificano il mese, l'anno e i giorni della settimana. Il formato esatto della rappresentazione non è stabilito dalle specifiche POSIX e può variare a seconda dell'implementazione e delle impostazioni locali del sistema.

La visualizzazione è influenzata dalle variabili d'ambiente relative alla localizzazione. In particolare, LC_TIME determina il formato e il contenuto del calendario, mentre TZ specifica il fuso orario utilizzato per individuare il mese corrente.

Sintassi

La sintassi di base prevista dalle specifiche POSIX è la seguente:

cal [[month] year]

Gli argomenti sono facoltativi e hanno il seguente significato:

  • month: indica il mese da visualizzare, espresso con un numero intero compreso tra 1 (gennaio) e 12 (dicembre).
  • year: indica l'anno, espresso con un numero intero compreso tra 1 e 9999.

L'esecuzione senza argomenti produce il calendario del mese corrente. Se viene specificato soltanto l'anno, il comando visualizza tutti i dodici mesi; indicando sia il mese sia l'anno, mostra esclusivamente il mese richiesto. L'anno viene interpretato letteralmente: ad esempio, cal 89 visualizza il calendario dell'anno 89 e non quello del 1989.

Le implementazioni moderne possono ampliare questa sintassi. La versione distribuita con util-linux, ad esempio, accetta anche un giorno del mese come argomento, nomi di mesi e specificazioni temporali relative. Tali estensioni non fanno parte della sintassi di base prevista da POSIX.

Opzioni principali

Oltre alla sintassi di base, le implementazioni di cal mettono a disposizione diverse opzioni per modificare la disposizione dei mesi, la numerazione dei giorni e la visualizzazione delle settimane. Queste opzioni non sono tutte previste dalle specifiche POSIX e possono differire tra i sistemi operativi.

Tra le opzioni più comuni figurano:

Opzione Descrizione
-j Visualizza i giorni mediante la numerazione progressiva dall'inizio dell'anno, anziché utilizzare i giorni del mese.
-y Visualizza il calendario dell'intero anno, generalmente quello corrente se non viene specificato un anno.
-3 Visualizza tre mesi consecutivi, comprendendo quello precedente e quello successivo al mese di riferimento.
-w Aggiunge la numerazione delle settimane al calendario, nelle implementazioni che supportano questa opzione.

La numerazione delle settimane, quando supportata, può seguire convenzioni differenti. Nell'implementazione di util-linux, se la settimana inizia di domenica viene utilizzata la numerazione nordamericana, nella quale la settimana contenente il 1º gennaio è considerata la prima dell'anno. Se invece la settimana inizia di lunedì, viene adottata la numerazione prevista dalla norma ISO 8601, secondo cui la prima settimana dell'anno è quella che contiene il primo giovedì di gennaio. Anche in OpenBSD l'utilizzo congiunto delle opzioni -m e -w attiva la numerazione conforme a ISO 8601.

La numerazione progressiva attivata da -j assegna ai giorni valori compresi tra 1 e 365, oppure 366 negli anni bisestili. Non comporta l'utilizzo del calendario giuliano: la scelta del sistema calendariografico costituisce una funzionalità distinta.

Altre opzioni presentano differenze significative tra le implementazioni. In util-linux, -m imposta il lunedì come primo giorno della settimana, mentre -s imposta la domenica. In FreeBSD, invece, -M imposta il lunedì come primo giorno della settimana e -m serve a specificare il mese da visualizzare.

L'implementazione di util-linux comprende inoltre opzioni specifiche, tra cui -n per stabilire il numero di mesi da mostrare, --reform per selezionare la convenzione relativa alla riforma del calendario gregoriano e --color per controllare la colorazione dell'output.

Esempi d'uso

L'esecuzione del comando senza argomenti visualizza il calendario del mese corrente:

cal

Per visualizzare un mese e un anno specifici, si indicano i rispettivi valori numerici. Ad esempio, il comando seguente mostra il calendario di febbraio 2024:

cal 2 2024

Un possibile risultato, con le intestazioni in inglese e la domenica come primo giorno della settimana, è il seguente:

   February 2024
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29

Per visualizzare tutti i mesi di un anno è sufficiente specificare il solo anno. Il comando seguente produce il calendario completo del 2024:

cal 2024

Nelle implementazioni che supportano l'opzione -j, è possibile ottenere un calendario con i giorni numerati progressivamente dall'inizio dell'anno. Ad esempio:

cal -j 2 2024

In questo caso, i giorni di febbraio 2024 sono rappresentati dai numeri compresi tra 32 e 60, essendo il 2024 un anno bisestile. L'opzione -3, disponibile tra l'altro nell'implementazione di util-linux, consente invece di visualizzare contemporaneamente il mese corrente, quello precedente e quello successivo:

cal -3

Implementazioni

Il comando cal è disponibile in diverse implementazioni dei sistemi Unix e Unix-like. Pur mantenendo la funzione principale di visualizzazione dei calendari, queste versioni differiscono per le opzioni supportate, i formati di output e il trattamento delle date storiche.

Un esempio di comportamento differente è rappresentato dall'implementazione di cal in SCO OpenServer. Quando viene eseguito senza argomenti, il comando visualizza contemporaneamente il mese precedente, quello corrente e quello successivo, accompagnati dalla data e dall'ora correnti. Consente inoltre di specificare il mese mediante il nome completo o un'abbreviazione sufficientemente lunga da identificarlo senza ambiguità, anziché esclusivamente attraverso un valore numerico. La presenza di versioni di Unix che visualizzano tre mesi contemporaneamente è documentata anche da Steve Moritsugu nel volume Practical UNIX, pubblicato nel 2000. Questi comportamenti costituiscono varianti rispetto all'interfaccia di base definita dalle specifiche POSIX.

Nei sistemi GNU/Linux, una delle implementazioni più diffuse è quella distribuita con il pacchetto util-linux. Questa versione comprende funzionalità aggiuntive rispetto alla specifica POSIX, tra cui la visualizzazione di un numero arbitrario di mesi mediante -n, la numerazione delle settimane con -w e la disposizione verticale del calendario tramite -v. Supporta inoltre la selezione del calendario gregoriano prolettico o di quello giuliano attraverso l'opzione --reform.

In FreeBSD, cal è affiancato dal comando ncal, che offre una diversa disposizione dei giorni della settimana e ulteriori funzionalità. In particolare, ncal permette di selezionare la data di adozione del calendario gregoriano in base al paese mediante l'opzione -s, di visualizzare le date di riforma disponibili con -p e di calcolare la data della Pasqua secondo le tradizioni occidentale e ortodossa. Il comando cal mantiene invece il formato tradizionale del calendario, con i giorni della settimana disposti in colonne.

L'implementazione di NetBSD comprende opzioni per visualizzare i mesi precedenti e successivi a quello selezionato, modificare il primo giorno della settimana e scegliere una diversa data di passaggio dal calendario giuliano a quello gregoriano. Quest'ultima funzionalità è accessibile mediante -R, che accetta sia denominazioni predefinite di paesi sia date specificate dall'utente. La documentazione include un elenco di date storiche di adozione della riforma gregoriana in diversi paesi.

In OpenBSD, cal conserva un insieme più limitato di opzioni. Oltre alla visualizzazione mensile e annuale, supporta la numerazione progressiva dei giorni dell'anno con -j, l'inizio della settimana di lunedì con -m e la numerazione delle settimane con -w. Quando le ultime due opzioni sono utilizzate insieme, la numerazione delle settimane segue il sistema previsto dalla norma ISO 8601. Le opzioni -j e -w non possono essere utilizzate contemporaneamente.

Le differenze tra queste implementazioni rendono necessario consultare il manuale specifico del sistema utilizzato, soprattutto per le opzioni non previste dalle specifiche POSIX.

Gestione dei calendari storici

Una caratteristica del comando cal è la gestione del passaggio dal calendario giuliano al calendario gregoriano. Secondo le specifiche POSIX, le date comprese tra il 1º gennaio dell'anno 1 e il 2 settembre 1752 sono rappresentate secondo il calendario giuliano, mentre quelle dal 14 settembre 1752 al 31 dicembre 9999 seguono il calendario gregoriano.

Questa convenzione riflette la riforma del calendario adottata dalla Gran Bretagna e dai suoi possedimenti nel 1752. Il Calendar (New Style) Act 1750, approvato nel 1751, stabilì che al 2 settembre 1752 seguisse direttamente il 14 settembre, omettendo undici date intermedie. La riforma britannica è stata oggetto di studi storici specifici, tra cui quello di Robert Poole, pubblicato nel 1995 sulla rivista Past & Present. La data adottata convenzionalmente da cal non coincide pertanto con quella di introduzione del calendario gregoriano in tutti i paesi.

Il comportamento può essere osservato eseguendo il comando:

cal 9 1752

Un esempio della rappresentazione tradizionale, con la domenica come primo giorno della settimana, è il seguente:

   September 1752
Su Mo Tu We Th Fr Sa
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

La scelta del 1752 non rappresenta tuttavia una regola storica universale. La riforma gregoriana fu introdotta nel 1582 e adottata in periodi differenti dai vari Stati. In Italia, Spagna, Portogallo e Polonia, ad esempio, il 4 ottobre 1582 fu seguito dal 15 ottobre, mentre altri paesi continuarono a utilizzare il calendario giuliano per diversi secoli.

Le implementazioni del comando gestiscono queste differenze in modi diversi. In util-linux, l'opzione --reform permette di scegliere tra la convenzione britannica del 1752, il calendario gregoriano prolettico e il calendario giuliano. Il calendario gregoriano prolettico applica retroattivamente le regole gregoriane anche alle date precedenti l'introduzione storica della riforma. Gli argomenti gregorian e iso selezionano questa modalità, mentre julian imposta l'utilizzo esclusivo del calendario giuliano.

L'implementazione di NetBSD consente una selezione più dettagliata mediante l'opzione -R, che permette di indicare un paese tra quelli previsti dal programma oppure una data specifica nel formato AAAA/MM/GG. In FreeBSD, analoghe funzionalità sono disponibili nel comando ncal, attraverso l'opzione -s, che seleziona la data della riforma associata a un codice nazionale.

La rappresentazione delle date anteriori all'adozione del calendario gregoriano dipende quindi dalle convenzioni dell'implementazione utilizzata e non coincide necessariamente con il calendario effettivamente in vigore in un determinato territorio nel periodo considerato.

Un ulteriore limite nella rappresentazione delle date storiche riguarda l'inizio dell'anno, che cal colloca convenzionalmente al 1º gennaio. Questa caratteristica era già segnalata tra i limiti del programma nel manuale della settima edizione di Unix del 1979. La convenzione non corrisponde necessariamente ai sistemi di datazione utilizzati in passato[Quale passato?]: in Inghilterra, ad esempio, il computo ufficiale dell'anno rimase basato sul 25 marzo fino al 1751, mentre il 1º gennaio divenne l'inizio dell'anno civile nel 1752.

Le date di riforma associate ai singoli paesi nelle implementazioni che prevedono questa funzionalità costituiscono tuttavia delle semplificazioni storiche. Il manuale di FreeBSD segnala esplicitamente che l'associazione tra i codici nazionali e le date di passaggio dal calendario giuliano a quello gregoriano non è sempre storicamente accurata. Di conseguenza, la selezione di un paese non garantisce necessariamente la riproduzione delle convenzioni calendariografiche effettivamente adottate in ogni suo territorio e periodo storico.

Note

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 (EN) cal — print a calendar, su The Open Group Base Specifications Issue 8, The Open Group. URL consultato il 28 ottobre 2026.
  2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 (EN) cal(1) — Linux manual page, su man7.org. URL consultato il 28 ottobre 2026.
  3. 1 2 3 4 5 6 7 8 9 (EN) cal(1) — FreeBSD General Commands Manual, su FreeBSD Manual Pages, The FreeBSD Project. URL consultato il 28 ottobre 2026.
  4. ↑ (EN) Warren Toomey, First Edition Unix: Its Creation and Restoration, in IEEE Annals of the History of Computing, vol. 32, n. 3, 2010, pp. 74–82, DOI:10.1109/MAHC.2009.55.
  5. 1 2 (EN) UNIX Programmer's Manual, First Edition – CAL (VI) (PDF), su nokia.com, Bell Laboratories, 3 novembre 1971. URL consultato il 28 ottobre 2026.
  6. 1 2 3 (EN) UNIX Programmer's Manual, Seventh Edition, Volume 1 – CAL (1) (PDF), su filibeto.org, Bell Telephone Laboratories, gennaio 1979. URL consultato il 28 ottobre 2026.
  7. ↑ (EN) FreeBSD 2.2.6 Announcement, su freebsd.org, The FreeBSD Project, 25 marzo 1998. URL consultato il 28 ottobre 2026.
  8. 1 2 3 (EN) cal(1) — OpenBSD Manual Pages, su man.openbsd.org, The OpenBSD Project. URL consultato il 28 ottobre 2026.
  9. ↑ (EN) cal(C) — SCO OpenServer Manual Pages, su SCO OpenServer Documentation, The SCO Group. URL consultato il 28 ottobre 2026.
  10. ↑ (EN) Steve Moritsugu, The Calendar Command, in Practical UNIX, Que, 2000, ISBN 9780789722508.
  11. 1 2 3 4 5 6 (EN) cal(1) — NetBSD Manual Pages, su man.netbsd.org, The NetBSD Project. URL consultato il 28 ottobre 2026.
  12. ↑ (EN) Calendar (New Style) Act 1750, su legislation.gov.uk, The National Archives. URL consultato il 28 ottobre 2026.
  13. ↑ (EN) Robert Poole, "Give Us Our Eleven Days!": Calendar Reform in Eighteenth-Century England, in Past & Present, vol. 149, n. 1, 1995, pp. 95–139, DOI:10.1093/past/149.1.95.
  14. ↑ (EN) C. R. Cheney e Michael Jones (a cura di), A Handbook of Dates: For Students of British History (PDF), 2ª, Cambridge University Press, 2000, pp. 13–14, ISBN 9780521778459.

Voci correlate

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica