고양이처럼 머리, 꼬리 등을 어떻게 색칠할 수 있나요?

고양이처럼 머리, 꼬리 등을 어떻게 색칠할 수 있나요?

다른 사람들 덕분에 내 "컬러 고양이"는 잘 작동합니다
(참조알 수 없는 파일 형식을 포함한 고양이 출력을 흑백으로 색상화하는 방법은 무엇입니까?).

.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다음과 같이 작동합니다.

고양이

고양이 SS

머리

SS장

꼬리

테일 SS

일반 텍스트

텍스트SS

어떤 팁이 있나요?

가장 큰 트릭(나는 그것을 해킹이라고 부르기를 선호한다)은 , 및 파이프에 대한 인수로 대시( )를 사용하여 파이프 의 -STDIN 에서 오는 내용을 출력하도록 하는 것입니다 . 이 지점에서:catheadtailsource-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단순히 해당 입력을 표준 출력에 복사하는 것처럼 작동합니다.

별칭에 대한 참고 사항

headtail또는 가 별칭인 경우 cat호출 결과 type가 실행 파일을 가리키지 않기 때문에 함수가 실패합니다. 별칭과 함께 이 함수를 사용해야 하는 경우(예: 색상 지정에 lessrequire -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
}

관련 정보