防止手錶斷色

防止手錶斷色

我正在更改工作中監視日誌檔案的腳本,以挑選出某些項目並為它們著色。最終輸出是一個由幾列組成的 6 位數字的列表。我已經能夠~在數字的開頭添加 a ,並且它不會破壞最終輸出中的任何內容,但它相當醜陋且難以閱讀。然而,當我嘗試對數字進行著色時,無論是在前面的 bash 腳本中還是在 Perl 腳本中對資料的最終處理中,顏色文字都會被破壞。

例如,原始數字,我將放入$num

123456

我在 perl 中輸入這個(或在 bash 中輸入大致相同的內容):

"\e[1;34m" . $num . "\e[0m"

這就是我得到的:

[1;34m123456[0m 

我也嘗試過這個,一個轉義版本,但得到了相同的結果:

"\x1B[1;34m" . $num . "\x1B[0m"

如果這有什麼不同,這裡是真正的腳本堆疊(一團糟):

  • Perl 呼叫內部 shell 腳本,然後透過管道傳輸到grep/ cut/etc。
  • shell 腳本包含更多cut/etc.,然後透過管道傳輸到 .pl
  • shell 腳本監視該輸出

也許watch不喜歡顏色?

我不太了解perl,所以我想展示我在列印行周圍看到的內容不會有什麼壞處:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

答案1

我遇到了“顏色竊取”問題手錶,這是因為 watch 使用簡單的 /bin/sh 輸出樣式,它會破壞任何顏色、別名、快捷方式......整個 shebang!

所以我把它拼湊起來,放在我的.bashrc,允許我使用我自己的所有別名、快捷方式等等:

Usage:
    watcher 20 'somecommand | apipe | grep'

該數字是更新之間的延遲(以秒為單位),該命令可以包含您可以引用的任何內容。

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

分解它:

function watcher()
{ 
  WATCHERTIME=$1
  WATCHERFILE=/tmp/watcher$$
  shift
  while true; do
    WATCHERHEIGHT=$(($LINES - 5))
    ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
    clear
    /bin/echo -n "Every ${WATCHERTIME} seconds - "
    date
    /bin/echo
    cat ${WATCHERFILE}
    \rm -f ${WATCHERFILE}
    /bin/echo
    /bin/echo "=="
    sleep ${WATCHERTIME}
  done
}

它以行為單位確定當前螢幕高度,減去足夠的行以用於自己的輸出,然後重複執行給定的命令,然後清除螢幕,顯示輸出並等待下一個循環。它在底部顯示一個短的“==”,表示輸出就此結束。有時了解這一點很有幫助。

我這樣做是為了在顯示時盡可能減少延遲。如果你不捕獲輸出然後顯示,你會得到一個長時間的停頓,然後輸出......令人討厭。

由於它不會破壞顏色,因此您可以獲得您習慣的一切。享受!

答案2

問題是watch使用 Curses 和curses字串輸出函數在虛擬幀緩衝區上工作,該虛擬幀緩衝區具有單獨的字元及其屬性/顏色平面。字串按原樣發送到幀緩衝區,沒有終端指令解釋。為了防止破壞最終狀態,Curses 會忽略ESC(除其他外),因此watch預設不會執行顏色。

您可以按照以下任一者的明智建議來解決此問題jw013或者洛尼克斯:使用watch --color或將腳本包裝在類似while true; do clear; $SCRIPT; sleep 2; done循環的內容中。

答案3

您可能需要--color選擇watch.

相關內容