簡體   English   中英

Bash:如何突出顯示已執行的命令?

[英]Bash: how to highlight executed commands?

Bash提供了-v --verbose選項,該選項會將命令讀取到stderr時將其寫入。
需要突出顯示此輸出。 當前解決方案

bash -v script 2> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2)

突出顯示stderr中的所有內容。

因此,問題是將-v輸出與其他stderr分開。

加成。 bash具有BASH_XTRACEFD ,可用於突出顯示-x (xtrace)輸出。

更新:這種重定向也違反了命令/響應的順序-響應可以出現在命令之前。
因此,當前的解決方案是根本不突出顯示任何內容。

Upd2 .:使用expect -與交互式程序進行編程對話似乎是個好主意。

編輯:

您所要求的是不可能的:

  1. 如果不修補bash ,則無法將bash的-v輸出與程序的stderr分離
  2. 即使有可能,拆分的輸出也無法輕松地重新同步,因此您將無法使每行都帶有顏色,緊接着是其輸出。

您可以輕松獲得所需的唯一方法是

  1. 修改腳本,以便每一行都可以單獨獲得(是有效的bash命令行)
  2. 創建一個包裝腳本,逐行讀取您的腳本,並在將其彩色打印后進行評估。

我的原始答案(保留在下面)使用一種變通辦法,該變通辦法可以完成您想要的,但要注意的是將所有彩色輸出分組在一個塊中(並且您希望每行執行時都進行彩色化)。

原版的:

由於當前無法告訴bash為-v的輸出使用另一個描述符,因此您無法將其與腳本的stderr分開。

如果要實現的僅突出顯示-v的輸出(而不突出顯示stderr),則可以實現的唯一方法是調整腳本以手動分離流:

  1. exec 2>&3添加為腳本中的第一條指令,
  2. 將其余代碼包裝在{ ... ; } 2>&4 { ... ; } 2>&4
  3. 呼叫bash -v newscript 3> >(sed $'s,.*,\\e[38;5;123m&\\e[m,' >&2) 4>&2

如果希望包裝器自動執行所有操作,則可以使用以下方法:

bash -v <(printf %s\\n 'exec 2>&3' '{'; cat script; printf %s\\n '' '} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2

或者,如果您是echo迷:

bash -v <(echo $'exec 2>&3\n{'; cat script; echo $'\n} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
  • (請注意,第二個printf中的''部分用於處理沒有尾隨換行符的腳本)
  • 確保使用34以外的其他FD,因為您的腳本需要使用它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM