複数行の文字列をカラーで印刷するには、次の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回は同じプロセス(forSyp
とCode
)に同じパイプを使用しようとしています。私が何度も言及したように:
- 必要ないので、共同プロセスを使用しないでください。
- getlineテストは失敗します(これを行うと、コードはこの問題を報告します)。
- 開いているパイプをすべて閉じます。
また、このために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
。