我想要grep.
.... 但
find ... | xargs grep,因为 xargs 不评估别名。如何解决这个问题?
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的版本,默认为,如果输出到终端颜色支持,则包装脚本可以被命名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 "$@"
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\n\n请改用别名或脚本。例如,如果 grep 位于目录 \xe2\x80\x98/usr/bin\xe2\x80\x99 中,您可以将 $HOME/bin 添加到您的 PATH 中,并创建一个包含以下内容的可执行脚本 $HOME/bin/grep:
\n
#! /bin/sh\nexport PATH=/usr/bin\nexec grep --color=auto --devices=skip "$@"\nRun Code Online (Sandbox Code Playgroud)\n\n因此,如果别名对您来说不可能,则包装脚本是唯一的方法。
\n