Cowsay

是否可以在 cowsay/cowthink 的輸出中註入換行符,同時保留“泡沫”?

  • January 30, 2019

我隨身攜帶了一份印刷版的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

它使用linkszcat查看聯機和本地聯機幫助頁原始碼中的特定字元串,以及 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像我最初那樣使用。我隨意使用了一些字元(雙破折號)進行格式化——這很粗糙。

你可以使用像cowsay這樣的換行符嗎?有一個更好的方法嗎?

這不是cowsay的問題。這就是 shell 如何處理參數中的換行符:它們被視為任何空格。試一試echo $(ls):所有文件都在一行中輸出,即使ls輸出換行符也是如此。

幸運的是,您可以通過 stdin 將數據傳遞給 cowsay:

(echo "header line"; links ...; links ...; links...) | \
   cowsay -W80 -f bud-frogs

為了製作漂亮的氣泡,cowsay 預設修剪所有空格。這意味著換行。如果你連續通過兩個換行符,cowsay 會同時列印它們。

嘗試

cowsay "lala
lala"

對比

cowsay "lala

lala"

第一個會lala lala冒泡輸出,後者會輸出

lala

lala

這不是與 shell 相關的行為,這只是牛說 :)

如果你不喜歡這個,你需要-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

引用自:https://unix.stackexchange.com/questions/133902