OP指出选项不合适的某些原因在现实中没有根据。在这里,我将展示使用OP的策略4有什么样的效果:
在大多数发行版中,grep
安装在/bin
(典型)或/usr/bin
(OpenSUSE,也许其他)中,并且默认PATH
包含/usr/local/bin
在/bin
或之前/usr/bin
。这意味着如果您/usr/local/bin/grep
使用
#!/bin/sh
exec /bin/grep --color=auto "$@"
这里/bin/sh
是你的分布,通常bash或破折号提供POSIX兼容的shell。如果grep
在中/usr/bin
,则使
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
该脚本的开销很小。该exec
语句意味着脚本解释器将被grep
二进制文件替换;这意味着外壳grep
程序在执行时不会保留在内存中。因此,唯一的开销是脚本解释器的一个额外执行,即挂钟时间的较小延迟。延迟大致是恒定的(仅取决于是否在页面缓存中grep
和sh
已经在页面缓存中,以及取决于有多少I / O带宽),并且不取决于grep
执行时间或处理的数据量。
那么,该延迟(即包装器脚本添加的开销)有多长时间?
要找出答案,请创建上面的脚本,然后运行
time /bin/grep --version
time /usr/local/bin/grep --version
在我的机器上,前者的实时时间为0.005s(经过大量运行),而后者的时间为0.006s。因此,在我的机器上使用包装器的开销是每次调用0.001s(或更短)。
这无关紧要。
我也看不到任何“肮脏”的东西,因为许多常见的应用程序和实用程序使用相同的方法。要在/bin
和中查看您计算机上的此类列表/usr/bin
,只需运行
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
在我的机器,上面的输出包括egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
,和xfig
,这是我经常使用。除非您将整个发行版都视为依赖包装器脚本的“肮脏”,否则您没有理由将此类包装器脚本视为“肮脏”。
对于此类包装脚本可能会导致的问题:
如果只有人类用户(而不是脚本)的用grep的版本,默认为,如果输出到终端颜色支持,则包装脚本可以被命名colorgrep
或cgrep
或任何OP认为合适。
这样可以避免所有可能的兼容性问题,因为的行为grep
完全不会改变。
grep
使用包装器脚本启用选项,但要避免任何新问题:
我们可以轻松地重写包装器脚本以支持自定义,GREP_OPTS
即使该脚本GREP_OPTIONS
不受支持(因为它已被弃用)。这样,用户可以简单地添加export "GREP_OPTIONS=--color=auto"
或类似于他们的个人资料。/usr/local/bin/grep
然后
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
请注意,左右没有引号$GREP_OPTIONS
,因此用户可以指定多个选项。
在我的系统上,time /usr/local/bin/grep --version
用GREP_OPTIONS
empty或GREP_OPTIONS=--color=auto
用来执行,与包装器脚本的先前版本一样快。也就是说,执行时间通常比plain花费一毫秒grep
。
最后一个版本是我个人推荐使用的版本。
总而言之,OP的策略4:
被grep
开发人员推荐
实现起来很简单(两行)
开销微不足道(在此特定笔记本电脑上每次调用额外延迟一毫秒;在每台计算机上轻松验证)
可以作为添加GREP_OPTS
支持的包装脚本来实现(以替换已弃用/不受支持的GREP_OPTIONS
)
可以完全不影响脚本或现有用户的方式(作为colorgrep
/ cgrep
)实现
因为它是一种已经在Linux发行版中广泛使用的技术,所以它是一种常见的技术,而不是“肮脏的”。
如果实现为单独的包装器(colorgrep
/ cgrep
),则它不会产生新的问题,因为它根本不影响grep
行为。如果将其实现为可增加GREP_OPTS
支持的包装脚本,则使用GREP_OPTS=--color=auto
的风险与上游添加默认风险的风险完全相同(现有脚本存在写入问题)--color=auto
。因此,这种“造成的问题多于解决的问题”的说法是完全错误的:没有创建其他问题。