V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zeroday
V2EX  ›  Bash

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

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

    ##********************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 | lolcat -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   ·   我们的愿景   ·   实用小工具   ·   2933 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:59 · PVG 21:59 · LAX 06:59 · JFK 09:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.