是否可以在 cowsay/cowthink 的輸出中註入換行符,同時保留“泡沫”?
我隨身攜帶了一份印刷版的
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
像我最初那樣使用。我隨意使用了一些字元(雙破折號)進行格式化——這很粗糙。你可以使用像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