What's the deal with the banner command? What's the deal with the banner command? unix unix

What's the deal with the banner command?


Nothing is more portable across Unices as straight C.

You might find my rough draft here easier to modify and extend than one from a distribution (due to the implicit copyright if nothing else). This code was designed to be easy to read and understand without any comments.

[Don't be afraid of that big array, the actual code is very short. And at the very bottom there are "comments" which were used to visualize and construct the bitmaps. If you can understand why the space character works despite being coded as a backslash, then you understand the whole thing. The rest is just filling out the alphabet.]

#include <stdio.h>#include <string.h>enum {    A = 1<<0,    B = 1<<1,    C = 1<<2,    D = 1<<3,    E = 1<<4,    F = 1<<5,    G = 1<<6,    H = 1<<7,};char vec[] = " 0123456789"    "abcdefghijklmnopqrstuvwxyz"    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    ".,:!/\\|+-*=";unsigned char map[sizeof(vec)][8] = {    /* */ {A, B, C, D, E, F, G, H}, /* :) */    /*0*/ {B|C|D|E|F, A|F|G, A|E|G, A|D|G, A|C|G, A|B|G, B|C|D|E|F, 0},    /*1*/ {G, F|G, G, G, G, G, G, 0},    /*2*/ {B|C|D|E|F, A|G, G, C|D|E|F, B, A, A|B|C|D|E|F|G, 0},    /*3*/ {B|C|D|E|F, A|G, G, C|D|E|F, G, A|G, B|C|D|E|F, 0},    /*4*/ {A|F, A|F, A|F, B|C|D|E|F|G, F, F, F, 0},    /*5*/ {A|B|C|D|E|F|G, A, A, B|C|D|E|F, G, A|G, B|C|D|E|F, 0},    /*6*/ {B|C|D|E|F, A, A, A|B|C|D|E|F, A|G, A|G, B|C|D|E|F, 0},    /*7*/ {B|C|D|E|F|G, G, F, E, D, C, B, 0},    /*8*/ {B|C|D|E|F, A|G, A|G, B|C|D|E|F, A|G, A|G, B|C|D|E|F, 0},    /*9*/ {B|C|D|E|F, A|G, A|G, B|C|D|E|F|G, G, G, B|C|D|E|F, 0},    /*a*/ {0, 0, B|C|D|E, F, B|C|D|E|F, A|F, B|C|D|E|G, 0},    /*b*/ {B, B, B, B|C|D|E|F, B|G, B|G, A|C|D|E|F, 0},    /*c*/ {0, 0, C|D|E, B|F, A, A, B|F, C|D|E},    /*d*/ {F, F, F, B|C|D|E|F, A|F, A|F, B|C|D|E|G, 0},    /*e*/ {0, 0, B|C|D|E, A|F, A|B|C|D|E|F, A, B|C|D|E, 0},    /*f*/ {C|D|E, B, B, A|B|C|D, B, B, B, 0},    /*g*/ {0, 0, B|C|D|E|G, A|F, A|F, B|C|D|E, F, B|C|D|E},    /*h*/ {B, B, B, B|C|D|E, B|F, B|F, A|B|F, 0},    /*i*/ {0, C, 0, B|C, C, C, A|B|C|D|E, 0},    /*j*/ {0, D, 0, D, D, D, A|D, B|C},    /*k*/ {B, B|E, B|D, B|C, B|D, B|E, A|B|E|F, 0},    /*l*/ {A|B, B, B, B, B, B, A|B|C, 0},    /*m*/ {0, 0, 0, A|C|E|F, A|B|D|G, A|D|G, A|D|G, 0},    /*n*/ {0, 0, 0, B|D|E, B|C|F, B|F, B|F, 0},    /*o*/ {0, 0, B|C|D|E, A|F, A|F, A|F, B|C|D|E, 0},    /*p*/ {0, 0, A|B|C|D|E, B|F, B|F, B|C|D|E, B, A|B},    /*q*/ {0, 0, B|C|D|E|G, A|F, A|F, B|C|D|E, F, F|G},    /*r*/ {0, 0, A|B|D|E, B|C|F, B, B, A|B, 0},    /*s*/ {0, 0, B|C|D|E, A, B|C|D|E, F, A|B|C|D|E, 0},    /*t*/ {0, C, C, A|B|C|D|E, C, C, D|E, 0},    /*u*/ {0, 0, A|F, A|F, A|F, A|F, B|C|D|E|G, 0},    /*v*/ {0, 0, A|G, B|F, B|F, C|E, D, 0},    /*w*/ {0, 0, A|G, A|G, A|D|G, A|D|G, B|C|E|F, 0},    /*x*/ {0, 0, A|F, B|E, C|D, B|E, A|F, 0},    /*y*/ {0, 0, B|F, B|F, B|F, C|F, A|D|E, B|C|D},    /*z*/ {0, 0, A|B|C|D|E|F, E, D, C, B|C|D|E|F|G, 0},    /*A*/ {D, C|E, B|F, A|G, A|B|C|D|E|F|G, A|G, A|G, 0},    /*B*/ {A|B|C|D|E, A|F, A|F, A|B|C|D|E, A|F, A|F, A|B|C|D|E, 0},    /*C*/ {C|D|E, B|F, A, A, A, B|F, C|D|E, 0},    /*D*/ {A|B|C|D, A|E, A|F, A|F, A|F, A|E, A|B|C|D, 0},    /*E*/ {A|B|C|D|E|F, A, A, A|B|C|D|E, A, A, A|B|C|D|E|F, 0},    /*F*/ {A|B|C|D|E|F, A, A, A|B|C|D|E, A, A, A, 0},    /*G*/ {C|D|E, B|F, A, A, A|E|F|G, B|F|G, C|D|E|G, 0},    /*H*/ {A|G, A|G, A|G, A|B|C|D|E|F|G, A|G, A|G, A|G, 0},    /*I*/ {A|B|C|D|E, C, C, C, C, C, A|B|C|D|E, 0},    /*J*/ {A|B|C|D|E, C, C, C, C, C, A|C, B},    /*K*/ {A|F, A|E, A|D, A|B|C, A|D, A|E, A|F, 0},    /*L*/ {A, A, A, A, A, A, A|B|C|D|E|F, 0},    /*M*/ {A|B|F|G, A|C|E|G, A|D|G, A|G, A|G, A|G, A|G, 0},    /*N*/ {A|G, A|B|G, A|C|G, A|D|G, A|E|G, A|F|G, A|G, 0},    /*O*/ {C|D|E, B|F, A|G, A|G, A|G, B|F, C|D|E, 0},    /*P*/ {A|B|C|D, A|E, A|E, A|B|C|D, A, A, A, 0},    /*Q*/ {C|D|E, B|F, A|G, A|G, A|C|G, B|D|F, C|D|E, F|G},    /*R*/ {A|B|C|D, A|E, A|E, A|B|C|D, A|E, A|F, A|F, 0},    /*S*/ {C|D|E, B|F, C, D, E, B|F, C|D|E, 0},    /*T*/ {A|B|C|D|E|F|G, D, D, D, D, D, D, 0},    /*U*/ {A|G, A|G, A|G, A|G, A|G, B|F, C|D|E, 0},    /*V*/ {A|G, A|G, B|F, B|F, C|E, C|E, D, 0},    /*W*/ {A|G, A|G, A|G, A|G, A|D|G, A|C|E|G, B|F, 0},    /*X*/ {A|G, A|G, B|F, C|D|E, B|F, A|G, A|G, 0},    /*Y*/ {A|G, A|G, B|F, C|E, D, D, D, 0},    /*Z*/ {A|B|C|D|E|F|G, F, E, D, C, B, A|B|C|D|E|F|G, 0},    /*.*/ {0, 0, 0, 0, 0, 0, D, 0},    /*,*/ {0, 0, 0, 0, 0, E, E, D},    /*:*/ {0, 0, 0, 0, D, 0, D, 0},    /*!*/ {D, D, D, D, D, 0, D, 0},    /*/ */ {G, F, E, D, C, B, A, 0},    /*\\*/ {A, B, C, D, E, F, G, 0},    /*|*/ {D, D, D, D, D, D, D, D},    /*+*/ {0, D, D, B|C|D|E|F, D, D, 0, 0},    /*-*/ {0, 0, 0, B|C|D|E|F, 0, 0, 0, 0},    /***/ {0, B|D|F, C|D|E, D, C|D|E, B|D|F, 0, 0},    /*=*/ {0, 0, B|C|D|E|F, 0, B|C|D|E|F, 0, 0, 0}};int enc(int c) { return strchr(vec,c)-vec; }void show(char *s) {    int row,col;    char *sp;    for (row=0; row<8; row++, putchar('\n'))        for (sp = s; *sp; sp++)            if (strchr(vec,*sp)!=NULL)                for (col=0; col<8; col++)                    putchar(map[enc(*sp)][row] & 1<<col ? *sp:' ');}int main(int c,char **v) {    for (--c,++v;*v;v++,c--) show(*v);    return 0;}/*   01234567  01234567  01234567  01234567  01234567  012345670   #####               #           ###               #1  #     #              #          #                  #2  #     #    ####      #          #        #### #    #3   #####         #     #####    #####     #    #     ####4  #     #    #####     #    #     #       #    #     #   #5  #     #   #    #     #    #     #        ####      #   #6   #####     #### #   # ####      #            #    ##   #7                                           ####*//*   01234567  01234567  01234567  01234567  01234567  012345670                       #1    #          #       #  #2                       # #      #         #####      #### #3   ##          #       ##       ### ##     #   #    #    #4    #          #       # #      #  #  #    #   #    #    #5    #          #       #  #     #  #  #    ####      ####6  #####     #  #      ##  ##    ## #  #    #             #7             ##                           ##             ##*//*   01234567  01234567  01234567  01234567  01234567  01234567012  ## ##      ####     #    #     #   #    ######    #     #3   ##  #    #          #  #      #   #        #     #     #4   #         ####       ##       #   #       #      #  #  #5   #             #     #  #       #  #      #       #  #  #6  ##        #####     #    #    #  ##      ######    ## ##7                                 ###*//*   01234567  01234567  01234567  01234567  01234567  012345670     #      #####       ###     ####      #####     #     #1    # #     #    #     #   #    #   #       #       #     #2   #   #    #    #    #         #    #      #       #     #3   #   #    #####     #         #    #      #       #     #4   #####    #    #    #         #    #      #       #  #  #5  #     #   #    #     #   #    #   #       #       # # # #6  #     #   #####       ###     ####      # #        #   #7                                           #*/


The desired banner is the System V banner,install the sysvbanner package to get it,at least on Ubuntu 11


Here is a shell implementation inspired from @luser droog's code. It is not POSIX compliant but works with both ksh93 and bash, which make it portable enough for most current Unix implementations.

#!/bin/ksh93# or #!/bin/bashA=$((1<<0))B=$((1<<1))C=$((1<<2))D=$((1<<3))E=$((1<<4))F=$((1<<5))G=$((1<<6))H=$((1<<7))function outLine{  typeset r=0 scan  for scan  do    typeset l=${#scan}    typeset line=0    for ((p=0; p<l; p++))    do      line="$((line+${scan:$p:1}))"    done    for ((column=0; column<8; column++))      do        [[ $((line & (1<<column))) == 0 ]] && n=" " || n="#"        raw[r]="${raw[r]}$n"      done      r=$((r+1))    done}function outChar{    case "$1" in    (" ") outLine "" "" "" "" "" "" "" "" ;;    ("0") outLine "BCDEF" "AFG" "AEG" "ADG" "ACG" "ABG" "BCDEF" "" ;;    ("1") outLine "F" "EF" "F" "F" "F" "F" "F" "" ;;    ("2") outLine "BCDEF" "AG" "G" "CDEF" "B" "A" "ABCDEFG" "" ;;    ("3") outLine "BCDEF" "AG" "G" "CDEF" "G" "AG" "BCDEF" "" ;;    ("4") outLine "AF" "AF" "AF" "BCDEFG" "F" "F" "F" "" ;;    ("5") outLine "ABCDEFG" "A" "A" "ABCDEF" "G" "AG" "BCDEF" "" ;;    ("6") outLine "BCDEF" "A" "A" "BCDEF" "AG" "AG" "BCDEF" "" ;;    ("7") outLine "BCDEFG" "G" "F" "E" "D" "C" "B" "" ;;    ("8") outLine "BCDEF" "AG" "AG" "BCDEF" "AG" "AG" "BCDEF" "" ;;    ("9") outLine "BCDEF" "AG" "AG" "BCDEF" "G" "G" "BCDEF" "" ;;    ("a") outLine "" "" "BCDE" "F" "BCDEF" "AF" "BCDEG" "" ;;    ("b") outLine "B" "B" "BCDEF" "BG" "BG" "BG" "ACDEF" "" ;;    ("c") outLine "" "" "CDE" "BF" "A" "BF" "CDE" "" ;;    ("d") outLine "F" "F" "BCDEF" "AF" "AF" "AF" "BCDEG" "" ;;    ("e") outLine "" "" "BCDE" "AF" "ABCDEF" "A" "BCDE" "" ;;    ("f") outLine "CDE" "B" "B" "ABCD" "B" "B" "B" "" ;;    ("g") outLine "" "" "BCDEG" "AF" "AF" "BCDE" "F" "BCDE" ;;    ("h") outLine "B" "B" "BCDE" "BF" "BF" "BF" "ABF" "" ;;    ("i") outLine "C" "" "BC" "C" "C" "C" "ABCDE" "" ;;    ("j") outLine "D" "" "CD" "D" "D" "D" "AD" "BC" ;;    ("k") outLine "B" "BE" "BD" "BC" "BD" "BE" "ABEF" "" ;;    ("l") outLine "AB" "B" "B" "B" "B" "B" "ABC" "" ;;    ("m") outLine "" "" "ACEF" "ABDG" "ADG" "ADG" "ADG" "" ;;    ("n") outLine "" "" "BDE" "BCF" "BF" "BF" "BF" "" ;;    ("o") outLine "" "" "BCDE" "AF" "AF" "AF" "BCDE" "" ;;    ("p") outLine "" "" "ABCDE" "BF" "BF" "BCDE" "B" "AB" ;;    ("q") outLine "" "" "BCDEG" "AF" "AF" "BCDE" "F" "FG" ;;    ("r") outLine "" "" "ABDE" "BCF" "B" "B" "AB" "" ;;    ("s") outLine "" "" "BCDE" "A" "BCDE" "F" "ABCDE" "" ;;    ("t") outLine "C" "C" "ABCDE" "C" "C" "C" "DE" "" ;;    ("u") outLine "" "" "AF" "AF" "AF" "AF" "BCDEG" "" ;;    ("v") outLine "" "" "AG" "BF" "BF" "CE" "D" "" ;;    ("w") outLine "" "" "AG" "AG" "ADG" "ADG" "BCEF" "" ;;    ("x") outLine "" "" "AF" "BE" "CD" "BE" "AF" "" ;;    ("y") outLine "" "" "BF" "BF" "BF" "CDE" "E" "BCD" ;;    ("z") outLine "" "" "ABCDEF" "E" "D" "C" "BCDEFG" "" ;;    ("A") outLine "D" "CE" "BF" "AG" "ABCDEFG" "AG" "AG" "" ;;    ("B") outLine "ABCDE" "AF" "AF" "ABCDE" "AF" "AF" "ABCDE" "" ;;    ("C") outLine "CDE" "BF" "A" "A" "A" "BF" "CDE" "" ;;    ("D") outLine "ABCD" "AE" "AF" "AF" "AF" "AE" "ABCD" "" ;;    ("E") outLine "ABCDEF" "A" "A" "ABCDE" "A" "A" "ABCDEF" "" ;;    ("F") outLine "ABCDEF" "A" "A" "ABCDE" "A" "A" "A" "" ;;    ("G") outLine "CDE" "BF" "A" "A" "AEFG" "BFG" "CDEG" "" ;;    ("H") outLine "AG" "AG" "AG" "ABCDEFG" "AG" "AG" "AG" "" ;;    ("I") outLine "ABCDE" "C" "C" "C" "C" "C" "ABCDE" "" ;;    ("J") outLine "BCDEF" "D" "D" "D" "D" "BD" "C" "" ;;    ("K") outLine "AF" "AE" "AD" "ABC" "AD" "AE" "AF" "" ;;    ("L") outLine "A" "A" "A" "A" "A" "A" "ABCDEF" "" ;;    ("M") outLine "ABFG" "ACEG" "ADG" "AG" "AG" "AG" "AG" "" ;;    ("N") outLine "AG" "ABG" "ACG" "ADG" "AEG" "AFG" "AG" "" ;;    ("O") outLine "CDE" "BF" "AG" "AG" "AG" "BF" "CDE" "" ;;    ("P") outLine "ABCDE" "AF" "AF" "ABCDE" "A" "A" "A" "" ;;    ("Q") outLine "CDE" "BF" "AG" "AG" "ACG" "BDF" "CDE" "FG" ;;    ("R") outLine "ABCD" "AE" "AE" "ABCD" "AE" "AF" "AF" "" ;;    ("S") outLine "CDE" "BF" "C" "D" "E" "BF" "CDE" "" ;;    ("T") outLine "ABCDEFG" "D" "D" "D" "D" "D" "D" "" ;;    ("U") outLine "AG" "AG" "AG" "AG" "AG" "BF" "CDE" "" ;;    ("V") outLine "AG" "AG" "BF" "BF" "CE" "CE" "D" "" ;;    ("W") outLine "AG" "AG" "AG" "AG" "ADG" "ACEG" "BF" "" ;;    ("X") outLine "AG" "AG" "BF" "CDE" "BF" "AG" "AG" "" ;;    ("Y") outLine "AG" "AG" "BF" "CE" "D" "D" "D" "" ;;    ("Z") outLine "ABCDEFG" "F" "E" "D" "C" "B" "ABCDEFG" "" ;;    (".") outLine "" "" "" "" "" "" "D" "" ;;    (",") outLine "" "" "" "" "" "E" "E" "D" ;;    (":") outLine "" "" "" "" "D" "" "D" "" ;;    ("!") outLine "D" "D" "D" "D" "D" "" "D" "" ;;    ("/") outLine "G" "F" "E" "D" "C" "B" "A" "" ;;    ("\\") outLine "A" "B" "C" "D" "E" "F" "G" "" ;;    ("|") outLine "D" "D" "D" "D" "D" "D" "D" "D" ;;    ("+") outLine "" "D" "D" "BCDEF" "D" "D" "" "" ;;    ("-") outLine "" "" "" "BCDEF" "" "" "" "" ;;    ("*") outLine "" "BDF" "CDE" "D" "CDE" "BDF" "" "" ;;    ("=") outLine "" "" "BCDEF" "" "BCDEF" "" "" "" ;;    (*) outLine "ABCDEFGH" "AH" "AH" "AH" "AH" "AH" "AH" "ABCDEFGH" ;;    esac}function outArg{  typeset l=${#1} c r  for ((c=0; c<l; c++))  do    outChar "${1:$c:1}"  done  echo  [ -z "$COLUMNS" ] && COLUMNS=$(tput cols 2>/dev/null)  for ((r=0; r<8; r++))  do    printf "%-*.*s\n" "${COLUMNS:-80}" "${COLUMNS:-80}" "${raw[r]}"    raw[r]=""  done}for ido  outArg "$i"  echodone