What's the deal with the banner command?

前端 未结 8 1611
渐次进展
渐次进展 2020-12-24 09:02

In some versions of UNIX and Linux there\'s a banner command (usually /usr/bin/banner) that prints great output like this:

 #####  #######    #     #####  #          


        
相关标签:
8条回答
  • 2020-12-24 09:08

    If anyone is interested, here's a Java version. It generates a String, and it's up to you whether you use System.out.println() or your Logging framework of choice.

    public class Banner {
        public static String print(String s, char stdCh) {
            StringBuilder sb = new StringBuilder();
            for (int row = 0; row < 8; row++) {
                sb.append('\n');
                for (char ch : s.toCharArray()) {
                    int enc = CHAR_LIST.indexOf(ch);
                    if (enc < 0) continue;
                    for (int col = 0; col < 8; col++) {
                        sb.append(isPresent(row, enc, col) ? charToPrint(ch, stdCh) : ' ');
                    }
                }
            }
            return sb.append('\n').toString();
        }
    
        private static char charToPrint(char ch, char stdCh) {
            return ch != ' ' && stdCh != 0 ? stdCh : ch;
        }
    
        private static boolean isPresent(int row, int enc, int col) {
            return (map[enc][row] & 1 << col) != 0;
        }
    
        // @formatter:off
        private static final String CHAR_LIST = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.,:!/\\|+-*=";
    
        private static int        A = 1<<0;
        private static int        B = 1<<1;
        private static int        C = 1<<2;
        private static int        D = 1<<3;
        private static int        E = 1<<4;
        private static int        F = 1<<5;
        private static int        G = 1<<6;
        private static int        H = 1<<7;
    
        // define the 'font'
        private static int[][] map = new int[][] {
            /* */ {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}
        };
    
        /*
           01234567  01234567  01234567  01234567  01234567  01234567
        0   #####               #           ###               #
        1  #     #              #          #                  #
        2  #     #    ####      #          #        #### #    #
        3   #####         #     #####    #####     #    #     ####
        4  #     #    #####     #    #     #       #    #     #   #
        5  #     #   #    #     #    #     #        ####      #   #
        6   #####     #### #   # ####      #            #    ##   #
        7                                           ####
        */
    
        /*
           01234567  01234567  01234567  01234567  01234567  01234567
        0                       #
        1    #          #       #  #
        2                       # #      #         #####      #### #
        3   ##          #       ##       ### ##     #   #    #    #
        4    #          #       # #      #  #  #    #   #    #    #
        5    #          #       #  #     #  #  #    ####      ####
        6  #####     #  #      ##  ##    ## #  #    #             #
        7             ##                           ##             ##
        */
    
        /*
           01234567  01234567  01234567  01234567  01234567  01234567
        0
        1
        2  ## ##      ####     #    #     #   #    ######    #     #
        3   ##  #    #          #  #      #   #        #     #     #
        4   #         ####       ##       #   #       #      #  #  #
        5   #             #     #  #       #  #      #       #  #  #
        6  ##        #####     #    #    #  ##      ######    ## ##
        7                                 ###
        */
    
        /*
           01234567  01234567  01234567  01234567  01234567  01234567
        0     #      #####       ###     ####      #####     #     #
        1    # #     #    #     #   #    #   #       #       #     #
        2   #   #    #    #    #         #    #      #       #     #
        3   #   #    #####     #         #    #      #       #     #
        4   #####    #    #    #         #    #      #       #  #  #
        5  #     #   #    #     #   #    #   #       #       # # # #
        6  #     #   #####       ###     ####      # #        #   #
        7                                           #
        */
    
        // @formatter:on
    }
    
    0 讨论(0)
  • 2020-12-24 09:14

    Because there were the two divergent behaviours when POSIX was standardized, back in the late 80s, banner was omitted from the standard. It was not essential and there wasn't a prevailing standard to select as 'the standard'.

    And yes, you are out of luck if you use banner in your script; the behaviour is not reliable across platforms.

    0 讨论(0)
  • 2020-12-24 09:15

    The banner command from bsdmainutils package version 8.0.13 is now called printerbanner and is located here /usr/bin/printerbanner.

    0 讨论(0)
  • 2020-12-24 09:20

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

    0 讨论(0)
  • 2020-12-24 09:23

    There's always FIGLet. Gives source for unix, windows, dos, mac etc. hope this points you in the right direction.

    Also, there's TOIlet, which could be considered figlet++.

    0 讨论(0)
  • 2020-12-24 09:23

    It isn't really essential to a unix system, I am not sure why it would be part of the standard. There are a many other things that are arguably more important that the standard setting bodies should be focused on.

    If it isn't available on the system you could simply install it or build a equivalent.

    There is a banner clone on debian it has a single c file with 155 lines of code, and most of that is just the glyphs. The source can be found on the package page. http://packages.debian.org/testing/misc/sysvbanner

    It shouldn't be too difficult to even build another clone in the scripting language of your choice.

    0 讨论(0)
提交回复
热议问题