彩色 grep 输出:不是 GREP_OPTIONS 不是别名

gue*_*tli 12 grep colors

我想要grep.

.... 但

  • 策略 1:GREP_OPTIONS。但这已被弃用。请参阅http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
  • 策略 2: GREP_COLORS 乍一看似乎是一个解决方案,但实际上却有所不同。
  • 策略三:别名。这不适用于find ... | xargs grep,因为 xargs 不评估别名。
  • 策略 4:编写一个简单的包装器脚本。不,我认为这太脏了,而且比解决的麻烦还多。
  • 策略五:修补源代码
  • 策略 6:联系 grep 开发人员,要求更换 GREP_OPTIONS
  • 策略 NICE-and-EASY:...这是缺失的。我没有线索。

如何解决这个问题?

Nom*_*mal 13

OP 表示这些选项不合适的一些原因没有现实依据。在这里,我展示了使用 OP 的策略 4 有什么样的效果:


在大多数发行版中,grep安装在/bin(典型)或/usr/bin(OpenSUSE,可能是其他)中,默认PATH包含/usr/local/binbefore/bin/usr/bin. 这意味着,如果你创建/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"
Run Code Online (Sandbox Code Playgroud)

/bin/sh您的发行版提供的与 POSIX 兼容的 shell在哪里,通常是 bash 或 dash。如果grep/usr/bin,那么做

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Run Code Online (Sandbox Code Playgroud)

此脚本的开销很小。该exec语句表示脚本解释器被grep二进制替换;这意味着 shell 在grep执行时不会保留在内存中。因此,唯一的开销是脚本解释器的一次额外执行,即挂钟时间的小延迟。延迟大致恒定(仅取决于页面缓存中是否存在grep和是否存在,以及sh有多少 I/O 带宽可用),而不取决于grep执行多长时间或处理的数据量。

那么,延迟有多长,即包装脚本增加的开销?

要找出答案,请创建上面的脚本,然后运行

time /bin/grep --version
time /usr/local/bin/grep --version
Run Code Online (Sandbox Code Playgroud)

在我的机器上,前者需要 0.005 秒的实时时间(在大量运行中),而后者需要 0.006 秒的实时时间。因此,在我的机器上使用包装器的开销是每次调用 0.001 秒(或更少)。

这是微不足道的。

我也没有看到任何“肮脏”的东西,因为许多常见的应用程序和实用程序使用相同的方法。要在/bin和 中查看您机器上的此类列表/usr/bin,只需运行

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Run Code Online (Sandbox Code Playgroud)

在我的机器上,上面的输出包括egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, and xfig,我经常使用它们。除非你认为你的整个发行版因为依赖包装脚本而“脏”,否则你没有理由认为这样的包装脚本“脏”。


至于这样的包装脚本可能导致的问题:

如果只有人类用户(而不是脚本)的用grep的版本,默认为,如果输出到终端颜色支持,则包装脚本可以被命名colorgrepcgrep或任何OP认为合适。

这避免了所有可能的兼容性问题,因为 的行为grep根本没有改变。


grep使用包装脚本启用选项,但要避免任何新问题:

GREP_OPTS即使GREP_OPTIONS不支持(因为它已经被弃用),我们也可以轻松地重写包装器脚本以支持自定义。通过这种方式,用户可以简单地添加export "GREP_OPTIONS=--color=auto"或类似他们的个人资料。/usr/local/bin/grep然后是

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Run Code Online (Sandbox Code Playgroud)

请注意,周围没有引号$GREP_OPTIONS,因此用户可以指定多个选项。

在我的系统上,time /usr/local/bin/grep --version使用GREP_OPTIONSempty 或 with执行与GREP_OPTIONS=--color=auto以前版本的包装器脚本一样快;即,执行时间通常比 plain 多一毫秒grep

最后一个版本是我个人推荐使用的版本。


总之,OP的策略4:

  • grep开发商推荐的aready

  • 实现起来很简单(两行)

  • 开销微不足道(在这台特定的笔记本电脑上每次调用额外延迟一毫秒;在每台机器上都可以轻松验证)

  • 可以实现为添加GREP_OPTS支持的包装器脚本(替换已弃用/不支持GREP_OPTIONS

  • 可以实现(作为colorgrep/ cgrep),完全不影响脚本或现有用户

因为它是一种已经在 Linux 发行版中广泛使用的技术,所以它是一种常见的技术,而不是“肮脏的”。

如果实现为单独的包装器 ( colorgrep/ cgrep),则不会产生新问题,因为它根本不会影响grep行为。如果实现为添加GREP_OPTS支持的包装器脚本,则使用GREP_OPTS=--color=auto具有与上游添加默认值完全相同的风险(现有脚本的问题)--color=auto。因此,“产生的问题多于解决的问题”的评论是完全错误的:没有产生额外的问题。


小智 5

您提供的第一个策略的文档显示:

\n\n
\n

请改用别名或脚本。例如,如果 grep 位于目录 \xe2\x80\x98/usr/bin\xe2\x80\x99 中,您可以将 $HOME/bin 添加到您的 PATH 中,并创建一个包含以下内容的可执行脚本 $HOME/bin/grep:

\n
\n\n
#! /bin/sh\nexport PATH=/usr/bin\nexec grep --color=auto --devices=skip "$@"\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,如果别名对您来说不可能,则包装脚本是唯一的方法。

\n