Colors
我怎樣才能像對貓一樣為頭部、尾部和更少的顏色著色?
感謝其他人,我的“彩色貓”工作得很好
(請參閱我如何為貓輸出著色,包括黑白中的未知文件類型?)。
在我的
.bashrc
:cdc() { for fn in "$@"; do source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn; done } alias cat='cdc' # To be next to the cdc definition above.
我希望能夠將此技術用於其他功能,例如 head、tail 和 less。
我怎麼能為所有四個功能做到這一點?有什麼方法可以概括答案?
我可以選擇
gd
使用git diff
gd() { git diff -r --color=always "$@" }
這樣的事情應該做你想做的事:
for cmd in cat head tail; do cmdLoc=$(type $cmd | awk '{print $3}') eval " $cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - done } " done
你可以像這樣壓縮它:
for cmd in cat head tail; do cmdLoc=$(type $cmd |& awk '{print $3}') eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }" done
例子
將上述內容放在一個名為
tst_ccmds.bash
.#!/bin/bash for cmd in cat head tail; do cmdLoc=$(type $cmd |& awk '{print $3}') eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }" done type cat type head type tail
當我執行它時,我會按照您的要求設置功能:
$ ./tst_ccmds.bash cat () { for fn in "$@"; do source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ; done } head is a function head () { for fn in "$@"; do source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ; done } tail is a function tail () { for fn in "$@"; do source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -; done }
在行動
當我在我的 shell (
source ./tst_ccmds.bash
) 中使用這些函式時,它們的工作方式如下:貓
頭
尾巴
純文字
有什麼訣竅?
最大的技巧,我認為它更像是一種 hack,是使用破折號 (
-
) 作為 , 的參數cat
,head
並tail
通過管道強制它們輸出來自source-highlight
管道的 STDIN 的內容。這一點:...STDOUT -i "$fn" | /usr/bin/head - ....
另一個技巧是使用以下
--failsafe
選項source-highlight
:--failsafe if no language definition is found for the input, it is simply copied to the output
這意味著如果找不到語言定義,它的行為就像
cat
,只是將其輸入複製到標準輸出。關於別名的注意事項
如果
head
,tail
或cat
是別名中的任何一個,此函式將失敗,因為type
呼叫的結果將不指向執行檔。如果您需要將此函式與別名一起使用(例如,如果您想使用less
需要-R
標誌來著色的函式),則必須刪除別名並單獨添加別名命令:less(){ for fn in "$@"; do source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" | /usr/bin/less -R || /usr/bin/less -R "$fn"; done }