사용자 정의 zsh 기능을 사용하여 색상 출력을 보존하는 방법은 무엇입니까?

사용자 정의 zsh 기능을 사용하여 색상 출력을 보존하는 방법은 무엇입니까?

저는 쉘 환경을 설정 중이며 zsh학습 목적으로 간단한 함수를 작성해 보고 싶었습니다.

# ~/.zsh-extensions/conda_which

# get version in conda env
function conda_which {
    # this comes from Flament's answer below
    readonly env=${1:?"The environment must be specified."}
    readonly pkg=${2:?"The package must be specified."}

    conda list -n $env | grep $pkg
}

그리고 내.zshrc

# ~/.zshrc

# this comes from Terbeck's answer below
fpath=(~/.zsh-extensions/ $fpath)

# this comes from _conda file recommendation for conda autocompletion
fpath+=~/.zsh-extensions/conda-zsh-completion

# this comes from Terbeck's answer below
autoload -U $fpath[1]/*(.:t)

이제 다음과 같이 할 수 있습니다.

$ conda_which test_env numpy
numpy                     1.23.5          py310h5d7c261_0    conda-forge

바꾸다

$ conda list -n test_env | grep numpy

인지 종종 잊어버리기 때문에 env list이것은 list env단지 장난감 예일 뿐입니다.

conda_which내가 직면한 문제는 grep출력에서 ​​색상 강조 표시가 손실된다는 것입니다 numpy. 이것을 어떻게 유지하나요?

소환:

답변1

Grep에는 기본적으로 색상이 없습니다. 대신 사용자가 색상을 활성화할 수 있습니다. 많은 최신 Linux 시스템에는 별칭이 있습니다 grep --color. 예를 들어 내 Arch에서는 다음과 같습니다.

$ type grep
grep is aliased to `grep --color'

이제 GNU는 grep출력이 파이프되는 시기를 감지할 만큼 똑똑하며, 항상 컬러 출력을 인쇄하도록 지시하는 다른 옵션을 사용하지 않는 한 컬러를 비활성화합니다. 에서 man grep:

      --color[=WHEN], --colour[=WHEN]
              Surround  the  matched  (non-empty)  strings,  matching  lines,
              context lines, file names,  line  numbers,  byte  offsets,  and
              separators (for fields and groups of context lines) with escape
              sequences to display them in color on the terminal.  The colors
              are  defined  by the environment variable GREP_COLORS.  WHEN is
              never, always, or auto.

이것info페이지는grep자세한 내용을 입력하세요.

표준 출력이 터미널 장치와 연관되어 있고 TERM 환경 변수의 값이 터미널이 색상을 지원함을 나타내는 경우, WHEN은 색상을 사용하는 경우 "always", 색상을 사용하지 않는 경우 "never", 색상을 사용하는 경우 "auto"입니다. 일반 --color는 --color=auto와 유사하게 처리됩니다. --color 옵션이 지정되지 않은 경우 기본값은 --color=never입니다.

이것이 의미하는 바는 grepor 를 실행 grep --color하고 그 출력이 다른 것으로 파이프되면 grep색상 코드가 출력되지 않는다는 것입니다. 이 작업을 강제하려면 를 사용해야 합니다 --col9or=always. 따라서 함수에서 다음과 같이 시도해 보세요.

conda list -n "$env" | grep --color=always "$pkg"

관련 정보