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

2014-04-10 14:04:31 +08:00
 zeroday
根据 https://gist.github.com/dorentus/4689543 设置

##********************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

想做个调整,要怎么样才能把一句箴言放到动物的对话框内?
4517 次点击
所在节点   Bash
21 条回复
dorentus
2014-04-10 14:21:25 +08:00
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
2014-04-10 14:22:56 +08:00
`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
2014-04-10 14:32:45 +08:00
话说如果觉得太慢的话,就把 | lolcat -f 去掉吧,有时真的是感觉会很慢……
dorentus
2014-04-10 14:44:14 +08:00
其实最简单的 fortune | cowsay | lolcat 就可以(from: https://github.com/busyloop/lolcat)
我已经忘了为啥我那脚本最终变成那么复杂了……
zeroday
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
2014-04-10 16:24:03 +08:00
哈哈,加空格这习惯我也有,经常被 bash 坑……
meizhile
2014-04-10 19:52:23 +08:00
ps看起来莫名烦躁-_-||
dorentus
2014-04-11 23:47:29 +08:00
https://github.com/dorentus/mruby-lolcat-bin
把 lolcat gem 移植到 mruby 上了,现在编译后直接是一个可执行文件,不依赖 ruby 什么的

https://gist.github.com/dorentus/4689543#file-lolcat-banner-sh
这个脚本我也更新了一下,现在应该快多了……
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
2014-04-12 01:19:45 +08:00
bugfixed...
zeroday
2014-04-12 03:06:44 +08:00
@dorentus You are so good.
zeroday
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
2014-04-12 03:11:36 +08:00
@dorentus 发现一件有趣的事,brew install cowsay和gem install cowsay两个版本是不一样的。gem install cowsay生成的动物可以自动变换。
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
2014-04-12 03:23:12 +08:00
@dorentus 兄弟你又一次给了我惊喜,没想到这么晚了还有人和我一样没休息。
dorentus
2014-04-12 03:38:08 +08:00
我作息时间一向很乱……

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

我刚刚修复了一下 Rakefile,支持 ruby 1.8 了。你 brew update 然后再装试试,应该可以装了。
zeroday
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
2014-04-12 04:08:37 +08:00
@dorentus 想必兄台的作息时间一定乱中有序,我先去休息了,ruby的环境真的是把我头都搞大了,起床后继续。
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
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 初始化之前运行,感觉上会快些吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/107984

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX