# Banner (Unix)

banner è un comando presente nei sistemi Unix e Unix-like. Produce una ASCII art del testo fornito come argomento.
Un utilizzo di questo comando consiste nel creare pagine di separazione ben visibili tra i fogli da stampare.

## Funzionamento

Ogni argomento è troncato in blocchi di 10 caratteri i quali vengono stampati su "linee" differenti. Per stampare più parole su una singola linea, esse devono essere quindi passate come un singolo argomento, cosa che viene eseguita dalla shell eseguendo l'escape o citando le parole a seconda dei casi. Un programma correlato e più flessibile è FIGlet, il quale può mostrare il testo con diversi font.

## Implementazione

Il modo in cui il programma viene implementato internamente è antiquato. I font utilizzati sono inseriti nel codice del programma stesso, come strutture di dati inizializzate staticamente. Vengono utilizzate due strutture di dati: la prima è una tabella di dati comprendente una sequenza di istruzioni di stampa che codificano la bitmap per ogni carattere (in una codifica specifica del programma banner) mentre la seconda è un indice che in quella tabella indica, per ogni codice carattere, dove iniziano e finiscono le istruzioni di stampa per quel carattere.
Entrambe le strutture dati sono state scritte a mano. Spinellis osserva che è "difficile trovare un formato dati più soggetto a errori e non mantenibile". Egli osserva un netto contrasto tra il codice sorgente del programma banner e il codice sorgente automaticamente generato per codificare i font nella sezione program data (usando nel codice sorgente i dati del font 6×10 del port mac68k di NetBSD per confronto). I dati generati automaticamente sono stati generati da un file bitmap, a sua volta generato utilizzando un programma di creazione/modifica bitmap con un'interfaccia utente grafica. Successivamente essi vengono commentati, documentando con ASCII art come sono stati derivati i pattern di bit. Tali dati sono organizzati in modo semplice ed ovvio: una sequenza di lunghezza fissa di byte non codificati per ogni glifo.
Spinellis osserva inoltre che nei moderni sistemi informatici è raramente sensato incorporare tali dati nell'immagine eseguibile del programma stesso, poiché i guadagni in termini di prestazioni in tal modo sono trascurabili. Fare ciò rende difficile adattare il programma a diverse localizzazioni oppure mantenere il programma. L'approccio più seguito nei sistemi moderni è quello di archiviare tali informazioni in un file di dati separato, distinto dal file immagine eseguibile del programma, o in un resource fork del programma, che il programma legge in fase di esecuzione.

## Versioni

Lista non esaustiva di versioni:
* Di AT&T, in UNIX System V. Nei sistemi basati su Debian il comando banner è fornito da questa versione nel pacchetto sysvbanner e per quest'ultimo, banner accetta esclusivamente il testo sotto forma di argomento non permettendone l'utilizzo tramite pipe.
* Di Cedar Solutions. Gira su sistemi moderni Linux a partire dal 2008. Stampa solo orizzontalmente con una dimensione fissa del font.
* Di Mary Ann Horton all'Università della California - Berkeley, distribuita come parte del pacchetto bsdmainutils, sotto il nome di printerbanner. Può essere eseguita su versioni moderne di Linux, GNU Hurd, e sistemi Mac OS X a partire dal 2008. Stampa verticalmente con la possibilità di variare la dimensione del font.

## Esempi

Esempio di utilizzo di banner in un'applicazione orientata al terminale, in Debian:
Una lettera dal programma banner orientato alla stampa come di solito si presenta in BSD e derivati:
In questo esempio il comando banner stampa l'ora corrente fornita tramite date all'atto della chiamata.
Mostra un orologio dinamico per circa 1000 secondi (equivale all'utilizzo dell'utility FIGlet con la sostituzione di banner con figlet -f banner):