当我跑步时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 中grep
,egrep
和fgrep
无论如何都是 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
)。
唯一需要注意的方面是您的打包系统仍然“拥有”egrep
和fgrep
二进制文件,因此每当软件包升级时您都会丢失更改。为了避免这种情况,您可以告诉打包系统它不再拥有这些文件;在 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
.
(好奇的读者可能想阅读导致这些警告的错误报告, 和一些错误报告提交因此.)