在UNIX和Linux的某些版本中,有一个横幅命令(通常是/ usr / bin / banner),可以打印出如下的输出:
##### ####### # ##### # # # # # # # # # # # # # # # # # # ##### # # # # ### # # ####### # # # # # # # # # # # # ##### # # # ##### # #
在其他版本中,横幅命令(频繁/ usr / games / banner)会打印出一个巨大的横幅,就像您在1980年用Printshop制作的那样,适合在生日派对上使用。
我倾向于使用横幅为我的脚本,但它本质上是不可移植的,因为这个问题。 UNIX是“旗帜”的一部分,为什么不是POSIX标准的一部分? 这是一些BSD与SysV的区别,但为什么没有解决?
我知道那里有再现我喜欢的横幅的figlet。 但是这个命令的问题是可移植性。 横幅应该是UNIX的一部分,恕我直言,即使他们需要包括在不同的名字下的两个版本(尽pipe理想的行为应该被合并成一个命令与一个期望的输出选项)。
如何优化std :: map insert()函数?
URL中是否允许冒号?
我应该允许strerror_r的大小是多less?
如何成功使用RDAP协议而不是whois
如果我使用横幅,在脚本中的可移植性我只是运气不好?
LSB中是否有RPM文件命名约定?
便携式的方式来实现ls的-v标志(即按版本sorting)?
ifstream创build文件,如果它不存在
Windows标准文件位置
因为在POSIX标准化时出现了两种不同的行为,那就是在80年代后期,标准中没有标题。 这不是必须的,没有一个普遍的标准选择为“标准”。
是的,如果您在脚本中使用banner ,那么您运气不佳; 该行为在各个平台上不可靠。
没有什么比直线C更便携
你可能会发现我的粗略草案在这里比修改和扩展更容易修改和扩展(由于隐含的版权,如果没有别的)。 此代码旨在易于阅读和理解,无需任何意见。
[ 不要怕那个大阵,实际的代码很短。 而最底层则有用于可视化和构建位图的“评论”。 如果你能理解为什么空间字符尽管被编码为反斜杠,那么你就明白了整个事情。 其余的只是填写字母表。 ]
#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,/*2*/ {B|C|D|E|F,A|G,C|D|E|F,A,A|B|C|D|E|F|G,/*3*/ {B|C|D|E|F,/*4*/ {A|F,A|F,B|C|D|E|F|G,/*5*/ {A|B|C|D|E|F|G,/*6*/ {B|C|D|E|F,A|B|C|D|E|F,/*7*/ {B|C|D|E|F|G,/*8*/ {B|C|D|E|F,/*9*/ {B|C|D|E|F,/*a*/ {0,B|C|D|E,B|C|D|E|G,/*b*/ {B,B|G,A|C|D|E|F,/*c*/ {0,C|D|E,B|F,C|D|E},/*d*/ {F,/*e*/ {0,/*f*/ {C|D|E,A|B|C|D,/*g*/ {0,B|C|D|E},/*h*/ {B,A|B|F,/*i*/ {0,B|C,A|B|C|D|E,/*j*/ {0,A|D,B|C},/*k*/ {B,B|E,B|D,A|B|E|F,/*l*/ {A|B,A|B|C,/*m*/ {0,A|C|E|F,A|B|D|G,/*n*/ {0,B|D|E,B|C|F,/*o*/ {0,/*P*/ {0,A|B},/*q*/ {0,F|G},/*r*/ {0,A|B|D|E,A|B,/*s*/ {0,/*t*/ {0,D|E,/*u*/ {0,/*v*/ {0,C|E,/*w*/ {0,B|C|E|F,/*x*/ {0,C|D,/*y*/ {0,C|F,A|D|E,B|C|D},/*z*/ {0,/*A*/ {D,/*B*/ {A|B|C|D|E,/*C*/ {C|D|E,/*D*/ {A|B|C|D,A|E,/*E*/ {A|B|C|D|E|F,/*F*/ {A|B|C|D|E|F,/*G*/ {C|D|E,A|E|F|G,B|F|G,C|D|E|G,/*H*/ {A|G,/*I*/ {A|B|C|D|E,/*J*/ {A|B|C|D|E,A|C,B},/*K*/ {A|F,/*L*/ {A,/*M*/ {A|B|F|G,A|C|E|G,/*N*/ {A|G,/*O*/ {C|D|E,/*P*/ {A|B|C|D,/*Q*/ {C|D|E,B|D|F,/*R*/ {A|B|C|D,/*S*/ {C|D|E,/*T*/ {A|B|C|D|E|F|G,/*U*/ {A|G,/*V*/ {A|G,/*W*/ {A|G,/*X*/ {A|G,/*Y*/ {A|G,/*Z*/ {A|B|C|D|E|F|G,/*.*/ {0,/*,*/ {0,D},/*:*/ {0,/*!*/ {D,/*/ */ {G,/*\*/ {A,/*|*/ {D,/*+*/ {0,/*-*/ {0,/***/ {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 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 # */
所需的横幅是System V横幅,至少在Ubuntu 11上安装sysvbanner软件包以获取它
总是有figlet 。 为unix,windows,dos,mac等提供源代码,希望这可以指导你正确的方向。
此外,还有TOIlet ,可以被认为是figlet ++。
这对unix系统来说并不是必须的,我不确定它为什么会成为标准的一部分。 还有很多其他的事情可以说是标准制定机构应该关注的重要问题。
如果在系统上不可用,您可以简单地安装它或建立一个等效的。
在debian上有一个横幅文件,它有一个包含155行代码的c文件,其中大部分就是字形。 源代码可以在包页面找到。 http://packages.debian.org/testing/misc/sysvbanner
甚至用您选择的脚本语言构建另一个克隆应该不会太困难。
这是一个来自@luser droog代码启发的shell实现。 它不符合POSIX标准,但可以与ksh93和bash一起使用,这使得它对于大多数当前的Unix实现来说足够便携。
#!/bin/ksh93 # or #!/bin/bash A=$((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} cr for ((c=0; c<l; c++)) do outChar "${1:$c:1}" done echo for ((r=0; r<8; r++)) do printf "%-*.*sn" "${COLUMNS:-80}" "${COLUMNS:-80}" "${raw[r]}" raw[r]="" done } for i do outArg "$i" echo done
来自bsdmainutils软件包版本8.0.13的banner命令现在称为printerbanner,位于/ usr / bin / printerbanner。
如果有人有兴趣,这是一个Java版本。 它会生成一个字符串,无论您使用System.out.println()还是您所选择的Logging框架,都取决于您。
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,/*0*/ {B|C|D|E|F,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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。