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:, Ylw:, 를 사용할 Red:때는 예상대로 작동 Amb:하지만 and 를 사용할 때는 작동하지 않습니다. 나는 그들이 어떻게 다르게 행동하는지 이해하는 데 어려움을 겪습니다.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번은 동일한 프로세스(for SypCode)에 대해 동일한 파이프를 사용하려고 합니다. 내가 여러 번 언급했듯이:

  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.

관련 정보