![고양이처럼 머리, 꼬리 등을 어떻게 색칠할 수 있나요?](https://linux55.com/image/3986/%EA%B3%A0%EC%96%91%EC%9D%B4%EC%B2%98%EB%9F%BC%20%EB%A8%B8%EB%A6%AC%2C%20%EA%BC%AC%EB%A6%AC%20%EB%93%B1%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%83%89%EC%B9%A0%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
다른 사람들 덕분에 내 "컬러 고양이"는 잘 작동합니다
(참조알 수 없는 파일 형식을 포함한 고양이 출력을 흑백으로 색상화하는 방법은 무엇입니까?).
내 .bashrc
:
cdc() {
for fn in "$@"; do
source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
done
}
alias cat='cdc' # To be next to the cdc definition above.
머리, 꼬리 등과 같은 다른 기능에도 이 기술을 사용할 수 있기를 바랍니다.
네 가지 기능 모두에 대해 이 작업을 어떻게 수행할 수 있나요? 답변을 일반화할 수 있는 방법이 있나요?
gd
선택해서 사용할 수 있어요git diff
gd() {
git diff -r --color=always "$@"
}
답변1
다음과 같은 작업이 원하는 작업을 수행해야 합니다.
for cmd in cat head tail; do
cmdLoc=$(type $cmd | awk '{print $3}')
eval "
$cmd() {
for fn in \"\$@\"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" |
$cmdLoc -
done
}
"
done
다음과 같이 압축할 수 있습니다.
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
예
위의 내용을 이라는 쉘 스크립트에 넣으십시오 tst_ccmds.bash
.
#!/bin/bash
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
type cat
type head
type tail
이것을 실행하면 요청한 대로 기능이 설정됩니다.
$ ./tst_ccmds.bash
cat ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ;
done
}
head is a function
head ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ;
done
}
tail is a function
tail ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -;
done
}
행동 중
shell()에서 이러한 함수를 사용하면 source ./tst_ccmds.bash
다음과 같이 작동합니다.
고양이
머리
꼬리
일반 텍스트
어떤 팁이 있나요?
가장 큰 트릭(나는 그것을 해킹이라고 부르기를 선호한다)은 , 및 파이프에 대한 인수로 대시( )를 사용하여 파이프 의 -
STDIN 에서 오는 내용을 출력하도록 하는 것입니다 . 이 지점에서:cat
head
tail
source-highlight
...STDOUT -i "$fn" | /usr/bin/head - ....
--failsafe
또 다른 비결은 다음 옵션을 사용하는 것입니다 source-highlight
.
--failsafe
if no language definition is found for the input, it is simply
copied to the output
즉, 언어 정의를 찾을 수 없으면 cat
단순히 해당 입력을 표준 출력에 복사하는 것처럼 작동합니다.
별칭에 대한 참고 사항
head
tail
또는 가 별칭인 경우 cat
호출 결과 type
가 실행 파일을 가리키지 않기 때문에 함수가 실패합니다. 별칭과 함께 이 함수를 사용해야 하는 경우(예: 색상 지정에 less
require -R
플래그를 사용하려는 경우) 별칭을 제거하고 별칭 명령을 별도로 추가해야 합니다.
less(){
for fn in "$@"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" |
/usr/bin/less -R || /usr/bin/less -R "$fn"; done
}