我保留一个打印该手册的版本Bash
很方便,所以我很好奇对其所做的任何更改 - 特别是因为我并不总是关注我更新的软件包。通常在本地你有与你所拥有的软件版本相关的手册版本,并且你可以跟踪变化容易地。
我构建这个是为了检查一些来源并进行总结:
#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates
header="BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www)"
data="$(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}') -- $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*' | cut -d ' ' -f 3-)"
cowthink -W80 -f bud-frogs -- $header $data
它使用links
和zcat
来查看在线和本地手册页源中的特定字符串,以及 Bash 存储库的 /doc 部分,最后是在线参考手册中的特定字符串。输出如下所示:
( BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www) )
( Feb 2 2014 -- Feb 2 2014 -- 2014-02-26 -- August 22, 2012 )
-------------------------------------------------------------------------------
o
o
oO)-. .-(Oo
/__ _\ /_ __\
\ \( | ()~() | )/ /
\__|\ | (-___-) | /|__/
' '--' ==`-'== '--' '
但我希望我有成对的项目和日期,每个都在一行上,如下所示:
BASH manual: Feb 2 2014
Local BASH manual: Feb 2 2014
BASH repo /doc: 2014-02-26
BASH Reference man(www): August 22, 2012
但为此,我需要在连接项目及其日期后更改行 - 而且我无法实现它cowsay/cowthink
。这解释了为什么我这样设计脚本。这两个变量只是帮助我格式化,但在执行时没有影响。碰巧的是,标题和数据变量的宽度都小于 80 列,并且为此目的将命令输出设置为 80 列。我还曾经cut
缩短它们在一行上显示的日期,而不是grep -o
像我最初那样使用。我随意使用一些字符(双破折号)进行格式化 - 这很粗糙。
你可以使用换行符吗考赛?有一个更好的方法吗?
答案1
为了制作漂亮的气泡,cowsay 默认会修剪所有空白。这意味着换行。如果连续传递两个换行符,cowsay 会打印这两个换行符。
尝试
cowsay "lala
lala"
与
cowsay "lala
lala"
第一个会lala lala
在气泡中输出,后者会输出
lala
lala
这不是与 shell 相关的行为,这只是owsay :)
如果您不喜欢这样,则需要切换-n
。它完全防止自动换行,因此允许任意空白字符。
不幸的是,以下命令无法正常工作:
cowsay -n "lala
lala"
因为在我的版本中,cowsay 不允许在-n
给出选项时将消息作为参数传递。但
echo "lala
lala" | cowsay -n
起到了魅力的作用。
因此,对于您的问题,如果您不喜欢输出中的双 \n,请将命令更改为
(echo "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')"; echo "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')"; echo "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')"; echo "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -f tux -n
答案2
这对于cowsay来说不是问题。这就是 shell 处理参数中的换行符的方式:它们被像任何空格一样对待。尝试一下echo $(ls)
:所有文件都在一行中输出,即使ls
确实输出换行符。
幸运的是,您可以通过标准输入将数据传递给cowsay:
(echo "header line"; links ...; links ...; links...) | \
cowsay -W80 -f bud-frogs
答案3
在考虑了答案之后,我能够通过添加换行符序列并将整个事情传递给cowthink来完成我想做的事情标准输入:
#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates
(echo -e "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')\n"; echo -e "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')\n"; echo -e "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')\n"; echo -e "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -W80 -f tux
______________________________________________________________
( BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014 )
( )
( Local BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014 )
( )
( BASH repo /doc: 2014-02-26 )
( )
( BASH Reference man(www): last updated August 22, 2012 )
--------------------------------------------------------------
o
o
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/