Syp:とCode:の線の色付けが失敗します。

Syp:とCode:の線の色付けが失敗します。

複数行の文字列をカラーで印刷するには、次のbash関数を使用しています。

  desc="
 Syp:
 {-W,-w,--wht}
 -f FILE
   Print Syp brief
 Red:
   Some red details here.
 Code:
   Some code here
   More code
 Red:
   Some red details here.
 Blu:
   Some blue details here.
   Some blue details here.

 Mgn:
   Magonta

 Cyn:
   Some details here.

 Code:
   Code here
   More code

 Rst:
   Wore"

fire "$desc"

Wht:Grn:、、、、を使用すると期待どおりに機能しますBlu:が、andを使用すると機能しません。私は彼らがどのように違う行動をするのか理解するのが難しいです。Ylw:Red:Amb:Cyn:Mgn:Syp:Code:

Syp:そしてCode:電話一通を受けました!kl

fire ()
 {
  awk 'BEGIN { kl=0
         ("tput sgr0") |& getline rst
         ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
         kb = "Cyn 51 Mgn 201 Syp 196 Code 196"
         ks = sprintf("%s %s", ka, kb)
         n = split(ks, kaggr)
         for ( i=1; i<n; i+=2 ) {
           knam = kaggr[i] ":"
           knum = kaggr[i+1]
           ("tput bold; tput setaf " knum) |& getline tseq[knam]
          }
       }

       ($1 in tseq) { kl=1 ; ctp=$1 ; next }
       /Rst:/ { kl=0 ; next }

       kl { printf("%s%s%s\n", tseq[ctp], $0, rst) }
       !kl { printf("%s\n", $0) }
      ' <<< "$@"
 }

答え1

カラーコード196(for)に対してtputを最初に呼び出すときにcoprocessを生成し、そのRedパイプを閉じないので、次の2回は同じプロセス(forSypCode)に同じパイプを使用しようとしています。私が何度も言及したように:

  1. 必要ないので、共同プロセスを使用しないでください。
  2. getlineテストは失敗します(これを行うと、コードはこの問題を報告します)。
  3. 開いているパイプをすべて閉じます。

また、このために3つの別々の変数を使用する必要はありません。

     ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
     kb = "Cyn 51 Mgn 201 Syp 196 Code 196"
     ks = sprintf("%s %s", ka, kb)

次のことができます。

     ks = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214 " \
          "Cyn 51 Mgn 201 Syp 196 Code 196"

また、これは:

   kl { printf("%s%s%s\n", tseq[ctp], $0, rst) }
   !kl { printf("%s\n", $0) }

のみ:

   kl { print tseq[ctp] $0 rst }
   !kl { print }

これはすべてコードを不必要に複雑にします[s]printf

関連情報