如何使用自定义 zsh 函数保留颜色输出?

如何使用自定义 zsh 函数保留颜色输出?

我正在设置一个zshshell 环境,我想尝试编写一个简单的函数用于我自己的学习目的:

# ~/.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 listlist env,这只是一个玩具示例。

conda_which我面临的问题是损失grep的颜色突出显示的输出numpy。我该如何维护这个?

引文:

答案1

Grep 默认没有颜色。相反,颜色可以由用户启用。许多现代 Linux 系统都附带了别名为grep --color.例如,在我的 Arch 上:

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

现在,GNUgrep足够聪明,可以检测其输出何时通过管道传输,并且将禁用颜色,除非您使用另一个选项告诉它始终打印彩色输出。从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 为“始终”使用颜色,“从不”为不使用颜色,或“自动”为使用颜色。普通 --color 的处理方式类似于 --color=auto;如果没有给出 --color 选项,则默认为 --color=never。

这一切意味着,如果您运行greporgrep --color并且其输出通过管道传输到其他内容,则grep不会输出颜色代码。要强制执行此操作,您需要使用--col9or=always.所以,在你的函数中,尝试这样的事情:

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

相关内容