启动终端显示 ASCII 动物图案和一句箴言,麻烦指点一下。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zeroday
V2EX    Bash

启动终端显示 ASCII 动物图案和一句箴言,麻烦指点一下。

  •  
  •   zeroday 2014-04-10 14:04:31 +08:00 4943 次点击
    这是一个创建于 4239 天前的主题,其中的信息可能已经有所发展或是发生改变。
    根据 设置

    ##********************This is my ~/.bash_profile file*****************##


    #for color
    export CLICOLOR=1

    export PS1='\n\[\e[0;30m\]┌─\[\e[0m\]\[\e[01;30m\]\u@\h\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\n\[\e[0;30m\]└───\[\e[0m\]\$ \[\e[00;33m\]$(__git_ps1 "(%s)")\[\e[00m\] '


    #!/bin/bash
    # see: http://blog.tomtung.com/2009/11/cowsay-fortune
    # http://www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed
    # https://github.com/busyloop/lolcat
    #
    # requires `fortune` and ruby gem `lolcat`

    printf "\n"

    fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | lolcat -f
    cowsay | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | lolcat -f

    printf "\n"`

    显示效果:
    http://ntu.me/di/NBH2Q/_2014-04-10_下午1.png

    想做个调整,要怎么样才能把一句箴言放到动物的对话框内?
    第 1 条附言    2014-04-10 16:03:12 +08:00
    感谢@dorentus 指点
    也发现一个小tip:bash shell中给变量赋值等号两边不能有空格。
    因为空格和等号都属于元字符中的IFS。
    21 条回复    2014-06-14 22:40:15 +08:00
    dorentus
        1
    dorentus  
       2014-04-10 14:21:25 +08:00   1
    lolcat 纯粹是为了搞颜色的
    fortune 是输出一句箴言
    cowsay 文本 会把文本放到动物的对话框内
    中间那句 sed 是把 fortune 可能输出的、但是 lolcat 还是 cowsay 不太好显示的特殊字符删掉(这个我记不太清了……)

    你要的效果,这样应该就可以了吧:
    cowsay `fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"` | lolcat -f
    dorentus
        2
    dorentus  
       2014-04-10 14:22:56 +08:00   1
    `fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"` 或者 $(fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"),是把里面的命令 fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 的结果保存成一个字符串,于是 cowsay `#####` 就是直接把这个字符串拿来作参数了

    等同于:
    TEXT=$(fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
    cowsay $TEXT | olcat -f

    然后 cowsay $TEXT 就是把 $TEXT 的内容放到框里,后面 | lolcat -f 就是把 cowsay 输出的内容传给 lolcat 变颜色。
    dorentus
        3
    dorentus  
       2014-04-10 14:32:45 +08:00   1
    话说如果觉得太慢的话,就把 | lolcat -f 去掉吧,有时真的是感觉会很慢……
    dorentus
        4
    dorentus  
       2014-04-10 14:44:14 +08:00   1
    其实最简单的 fortune | cowsay | lolcat 就可以(from: https://github.com/busyloop/lolcat)
    我已经忘了为啥我那脚本最终变成那么复杂了……
    zeroday
        5
    zeroday  
    OP
       2014-04-10 15:58:22 +08:00
    @dorentus 原作者竟然献身回答,真的很惊喜。非常感想你的回答,答的真是太好了。
    看到

    TEXT=$(fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
    cowsay $TEXT | lolcat -f

    也明白了,自己的错误。原来Bash shell给变量赋值时不能有空格。习惯了WEB代码,写Bash shell时习惯性地写上了

    SaySomething = $(fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
    cowsay $SaySomething | lolcat -f

    怪不得提示SaySomething不是可执行命令…
    dorentus
        6
    dorentus  
       2014-04-10 16:24:03 +08:00
    哈哈,加空格这习惯我也有,经常被 bash 坑……
    meizhile
        7
    meizhile  
       2014-04-10 19:52:23 +08:00 via Android
    ps看起来莫名烦躁-_-||
    dorentus
        8
    dorentus  
       2014-04-11 23:47:29 +08:00   1
    https://github.com/dorentus/mruby-lolcat-bin
    把 lolcat gem 移植到 mruby 上了,现在编译后直接是一个可执行文件,不依赖 ruby 什么的

    https://gist.github.com/dorentus/4689543#file-lolcat-banner-sh
    这个脚本我也更新了一下,现在应该快多了……
    dorentus
        9
    dorentus  
       2014-04-12 00:56:23 +08:00
    OS X 用 homebrew, brew install dorentus/tap/lolcat_mruby 直接可以装,装好后命令是 lolcat_m
    然后还有 bug,lolcat_m /etc/hosts [OK]、lolcat_m /etc/hosts > /tmp/lol 会失败……
    dorentus
        10
    dorentus  
       2014-04-12 01:19:45 +08:00
    bugfixed...
    zeroday
        11
    zeroday  
    OP
       2014-04-12 03:06:44 +08:00
    @dorentus You are so good.
    zeroday
        12
    zeroday  
    OP
       2014-04-12 03:09:15 +08:00
    @dorentus 奇怪,是我的ruby版本(2.1.1)问题吗?

    make install PREFIX=/usr/local/Cellar/lolcat_mruby/0.42.2
    rake aborted!
    undefined method `exists?' for Dir:Class
    ./rakefile:39
    make: *** [install] Error 1
    zeroday
        13
    zeroday  
    OP
       2014-04-12 03:11:36 +08:00
    @dorentus 发现一件有趣的事,brew install cowsay和gem install cowsay两个版本是不一样的。gem install cowsay生成的动物可以自动变换。
    dorentus
        14
    dorentus  
       2014-04-12 03:18:29 +08:00
    这个错误我看看……按理说 ruby 1.8 没有 Dir.exists?,但是 ruby 2.1.1 应该有的啊……

    gem install cowsay 装的那个是 ruby 写的,和 brew install cowsay 装的不是一个版本

    https://github.com/PatrickTulskie/ruby_cowsay 还可以在 ruby 代码里面来调用……
    zeroday
        15
    zeroday  
    OP
       2014-04-12 03:23:12 +08:00
    @dorentus 兄弟你又一次给了我惊喜,没想到这么晚了还有人和我一样没休息。
    dorentus
        16
    dorentus  
       2014-04-12 03:38:08 +08:00
    我作息时间一向很乱……

    ----
    上面那个问题,我估计是用 homebrew 装的时候,偶尔会切换成使用系统自带的 1.8 版的 ruby,而我的 makefile 里面就是直接写的 ruby,然后就出错了……

    我刚刚修复了一下 Rakefile,支持 ruby 1.8 了。你 brew update 然后再装试试,应该可以装了。
    zeroday
        17
    zeroday  
    OP
       2014-04-12 04:04:05 +08:00
    @dorentus 成功安装,我估计是我环境的问题,虽然安装了2.1.1版的ruby,但是实际上是切换成系统自带的1.8版的ruby,因为有时候启动终端时会提示如下错误:

    /Library/Ruby/Gems/1.8/gems/cowsay-0.0.5/lib/cowsay/character/base.rb:20:in `template': #template should be subclassed (RuntimeError)
    from /Library/Ruby/Gems/1.8/gems/cowsay-0.0.5/lib/cowsay/character/base.rb:26:in `render_character'
    from /Library/Ruby/Gems/1.8/gems/cowsay-0.0.5/lib/cowsay/character/base.rb:16:in `say'
    from /Library/Ruby/Gems/1.8/gems/cowsay-0.0.5/lib/cowsay.rb:17:in `say'
    from /Library/Ruby/Gems/1.8/gems/cowsay-0.0.5/bin/cowsay:6
    from /usr/bin/cowsay:19:in `load'
    from /usr/bin/cowsay:19

    对了,我发现#lolcat-banner.sh `fortune -a -s | $cmd_sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | $cmd_lolcat -f`
    修改为才不出错
    `fortune -a -s | $cmd_sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | $cmd_lolcat -f`

    Linux下`sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"`
    Mac下`sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"`
    zeroday
        18
    zeroday  
    OP
       2014-04-12 04:08:37 +08:00
    @dorentus 想必兄台的作息时间一定乱中有序,我先去休息了,ruby的环境真的是把我头都搞大了,起床后继续。
    aiym
        19
    aiym  
       2014-06-14 02:58:01 +08:00
    @dorentus 想请问一下#9#楼里面所说的“装好后命令是 lolcat_m”,为什么我在安装成功之后发现lolcat_m没有反应呢,但是lolcat命令是完好的。请问是不是后来又做了某些修改?重新alias了一下?(不过我看了一下代码貌似没有发现类似的--抱歉,因为不会ruby,更不了解mruby,所以可能问得比较弱。。)不过这样的话,确实比使用lolcat_m方便。还是要多谢!!!

    但如果没有lolcat_m命令的话,那么源文件里面的这句就不需要了吧?
    cmd_lolcat="$(command -v lolcat_m)" || cmd_lolcat="$(command -v lolcat)"

    话说用了一下这个最新版本的lolcat觉得没有什么速度方面的问题哈,是因为mruby的语言比较轻导致的么?
    dorentus
        20
    dorentus  
       2014-06-14 13:02:36 +08:00
    @aiym
    确实是我后来改过……

    安装(换了个 brew tap 名): brew install dorentus/recipes/lolcat_mruby
    然后装好之后的程序名字直接改成了 lolcat,没后缀了,也确实就不需要源文件里面的那行判断了。

    速度的话,主要是我这边的 ruby 是用的 rbenv 装的,总感觉 rbenv 初始化的时候有些慢
    而 lolcat_mruby 因为是编译好了之后直接是一个不依赖 ruby 的程序,可以在 rbenv 初始化之前运行,感觉上会快些吧
    aiym
        21
    aiym  
       2014-06-14 22:40:15 +08:00
    @dorentus 多谢解惑 !
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3840 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 10:21 PVG 18:21 LAX 02:21 JFK 05:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86