$ ls -l /bin/*grep
lrwxrwxrwx 1 root root 4 2010-06-09 02:56 /bin/egrep -> grep
lrwxrwxrwx 1 root root 4 2010-06-09 02:56 /bin/fgrep -> grep
-rwxr-xr-x 1 root root 85060 2007-01-23 02:00 /bin/grep
$ echo 'hello' | grep -q 'l{2}' && echo YES || echo NO
NO
$ echo 'hello' | egrep -q 'l{2}' && echo YES || echo NO
YES在我的系统中,egrep是到grep的符号链接,但它们的行为不同。为什么?
发布于 2012-03-12 13:54:29
grep将通过查看argv[0]来检查其调用。
下面是一个简短的演示程序:
> cat someprogram.cpp
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Shall behave as " << argv[0] << "." << std::endl;
}内部版本:
> make someprogram
g++ someprogram.cpp -o someprogram创建符号链接:
> ln -s someprogram some_other_program运行一次:
> ./someprogram
Shall behave as ./someprogram.运行两次:
> ./some_other_program
Shall behave as ./some_other_program.Gnu grep是free和开源软件,因此您可以自由地检查the source。
发布于 2012-03-12 13:39:48
因为可执行文件检查argv[0]的值并相应地调整其行为。
发布于 2012-03-12 14:05:57
因为POSIX认为egrep等同于grep -E而不是普通的grep,而fgrep等同于grep -F而不是普通的grep。如果希望grep的行为与egrep相同,请使用grep -E,依此类推。还有大约40年的先例问题。
https://stackoverflow.com/questions/9662209
复制相似问题