banner (Unix)
Banner software | |
---|---|
Genere | Utility |
Data prima versione | sysvbanner: 4 febbraio 1997 |
Sistema operativo | Unix-like |
Licenza | GPLv3+ (licenza libera) |
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.[1]
Funzionamento
[modifica | modifica wikitesto]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.[1] Un programma correlato e più flessibile è FIGlet, il quale può mostrare il testo con diversi font.[2]
Implementazione
[modifica | modifica wikitesto]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.[3]
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.[3]
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.[3]
Versioni
[modifica | modifica wikitesto]Lista non esaustiva di versioni:
- Di AT&T, in UNIX System V.[4][5] Nei sistemi basati su Debian il comando banner è fornito da questa versione nel pacchetto sysvbanner[6] 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
[modifica | modifica wikitesto]Esempio di utilizzo di banner in un'applicazione orientata al terminale, in Debian:
$ banner 'Hello!'
# # ###
# # ###### # # #### ###
# # # # # # # ###
####### ##### # # # # #
# # # # # # #
# # # # # # # ###
# # ###### ###### ###### #### ###
Una lettera dal programma banner orientato alla stampa come di solito si presenta in BSD e derivati:
$ banner -w80 "a"
#####
#########
############### ###
################ ######
################## ########
##### ##### #########
#### #### ## ###
### #### ##
### ### ##
### ### ###
#### ### ####
#############################
##############################
##############################
############################
###########################
###
#
#
In questo esempio il comando banner stampa l'ora corrente fornita tramite date
all'atto della chiamata.
$ banner `date +"%H:%M:%S"`
##### ##### # ##### ####### # # #
# # # # # # # # # # # # ## # #
# # # # # # # # # #
##### ##### ##### # # #######
# # # # # # # #
# # # # # # # # # # # #
####### ##### # ##### # # ##### #
Mostra un orologio dinamico per circa 1000 secondi[N 1] (equivale all'utilizzo dell'utility FIGlet con la sostituzione di banner
con figlet -f banner
):
$ repeat 1000 sh -c '( clear ; date +" %H.%M.%S" | xargs banner ; sleep 1)'
# ##### # ##### ####### #######
## # # ## # # # #
# # # # # # # #
# ###### # ##### ###### ######
# # # ### # # ### # #
# # # ### # # ### # # # #
##### ##### ### ##### ####### ### ##### #####
Note
[modifica | modifica wikitesto]Esplicative
[modifica | modifica wikitesto]- ^ Se il codice seguente non è eseguito da una shell Zsh il comando repeat necessita di essere definito,[7] come in questo frammento di codice:
function repeat(){ for ((i=0;i<$1;i++)); do eval ${*:2} }
oppure tale definizione può essere evitata rimpiazzando direttamente il comando repeat con un ciclo while:
$ i=0 ; while (($i<1000)); do sh -c '( clear ; date +" %H.%M.%S" | xargs banner ; sleep 1 ; ((i=$i+1)))' ; done
Bibliografiche
[modifica | modifica wikitesto]- ^ a b (EN) Steve Moritsugu, Sanjiv Guha, James Edwards e David Pitts, Practical UNIX, Indianapolis, Que Publishing, 2000, pp. 220–221, ISBN 0-7897-2250-X. URL consultato il 26 gennaio 2022. Ospitato su archive.org.
- ^ (EN) Arnold Robbins, UNIX in a Nutshell, 4ª ed., O'Reilly, 2006 [1989], pp. 24, ISBN 0-596-10029-9. URL consultato il 26 gennaio 2022. Ospitato su archive.org.
- ^ a b c (EN) Diomidis Spinellis, Code Quality, Adobe Press, 2006, pp. 70–71, ISBN 0-321-16607-8.
- ^ (EN) Hatch, System V in AIX and Dynix/ptx, su zen77087.zen.co.uk, 19 aprile 2004. URL consultato il 23 luglio 2008 (archiviato dall'url originale il 26 maggio 2009).
- ^ (EN) AIX 7.2: banner Command, su ibm.com, IBM. URL consultato il 27 gennaio 2022.
- ^ (EN) Dettagli sul pacchetto sysvbanner in Debian (v. 1.0.15 o successive), su packages.debian.org, Debian. URL consultato il 6 maggio 2010 (archiviato il 20 dicembre 2016).
- ^ (EN) Jędrzej Frankowski, Linux Commands – Repeat a Command n Times, su baeldung.com, 8 maggio 2020. URL consultato il 22 gennaio 2022 (archiviato il 19 novembre 2021).
Bibliografia
[modifica | modifica wikitesto]- (EN) Amir Afzal, The banner command, in UNIX Unbounded, Prentice Hall, 2008, pp. 462–463, ISBN 0-13-119449-6.
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Brian Martin, banner and sysvbanner, su unixgeeks.org, 1999. URL consultato il 27 gennaio 2022.
- (EN) v03i071: SYSV-like banner program for clock (v03i056) on BSD systems, su Google Groups, 11 luglio 1988. URL consultato il 27 gennaio 2022.
- Daniele Giacomini, 200.1 Banner, su Appunti di informatica libera, 2007. URL consultato il 27 gennaio 2022 (archiviato il 29 agosto 2007).
- (EN) Mark Horton, banner (6) – 4.2BSD Games Manual, su tuhs.org, 1º febbraio 1983. URL consultato il 27 gennaio 2022.
- (EN) banner(6) – FreeBSD Games Manual, su FreeBSD, 26 maggio 2020. URL consultato il 27 gennaio 2022.