抑制警告:egrep 已过时;使用 grep -E

抑制警告:egrep 已过时;使用 grep -E

当我跑步时egrep,它显示warning: egrep is obsolescent; using grep -E

但我将它用作我经常使用的 shell 自动完成脚本的一部分,并且我不想重写它们。

我正在寻找抑制这些警告的方法,因为我的自动完成变得“丑陋”,例如:当输入时mycmd myargum<TAB>,我期望自动完成能够做到这一点mycmd myargument,但它却写道:

mycmd myargum<TAB>grep: warning: egrep is obsolescent; using grep -E
grep: warning: egrep is obsolescent; using grep -E
ent

目前我尝试这样做:

mv /usr/bin/egrep /usr/bin/egrep.backup
echo 'grep -E $@' > /usr/bin/egrep
chmod a+x /usr/bin/egrep

它的工作原理是将 grep 二进制文件更改为调用“grep -E”的脚本。

附加信息:

$ egrep.backup --version
egrep.backup: warning: egrep.backup is obsolescent; using grep -E
grep (GNU grep) 3.8
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

问题是:

  • 这个方法可以吗?会产生意想不到的后果吗?
    • 如果卸载/清除 grep 包,也许它会使egrep.backup二进制文件仍然未被删除,但这应该不是问题,因为我从未计划这样做
  • 有没有更好的方法来抑制这个警告消息?

答案1

在 GNU 中grepegrepfgrep无论如何都是 shell 脚本;从 3.8 开始,这些是产生过时警告的地方:

#!/bin/bash
cmd=${0##*/}
echo "$cmd: warning: $cmd is obsolescent; using grep -E" >&2
exec grep -E "$@"

用你自己的版本替换它们就可以了;以前的版本是

#!/bin/sh
exec grep -E "$@"

(有一个明显的变体fgrep)。

唯一需要注意的方面是您的打包系统仍然“拥有”egrepfgrep二进制文件,因此每当软件包升级时您都会丢失更改。为了避免这种情况,您可以告诉打包系统它不再拥有这些文件;在 Debian 衍生版本中,运行

sudo dpkg-divert --divert /usr/bin/egrep.original --rename /usr/bin/egrep
sudo dpkg-divert --divert /usr/bin/fgrep.original --rename /usr/bin/fgrep

这将导致打包系统始终将打包文件重命名为?grep.original.

(好奇的读者可能想阅读导致这些警告的错误报告, 和一些错误报告提交因此.)

相关内容