![Syp: 및 Code:에 대한 선 색상 지정이 실패합니다.](https://linux55.com/image/216909/Syp%3A%20%EB%B0%8F%20Code%3A%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%84%A0%20%EC%83%89%EC%83%81%20%EC%A7%80%EC%A0%95%EC%9D%B4%20%EC%8B%A4%ED%8C%A8%ED%95%A9%EB%8B%88%EB%8B%A4..png)
여러 줄 문자열을 컬러로 인쇄하려면 다음 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 Syp
및 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
.