grep/fgrep/egrep

きむら 『をー。わたしの記憶が古かったのかもしれません。
GNU grep も自分の名前が grep/egrep/fgrep のどれなのかで動作が変わっていたのですが、
これは今でもそうだったかな?』 (2006/12/31 13:15)

これまた、自分もそう思っていたんですが、最近は微妙に違うようです。
自分の使っている Ubuntu に入っている GNU grep 2.5.1 の場合、make の最後でこんなのが実行されます。

echo '#!/bin/sh' >egrep
echo 'exec grep -E ${1+"$@"}' >>egrep
chmod a+x egrep
echo '#!/bin/sh' >fgrep
echo 'exec grep -F ${1+"$@"}' >>fgrep
chmod a+x fgrep

が、grep.c 自体には以下のコードがあるので、自身の名前を見て判別もするようです。

  program_name = argv[0];
  if (program_name && strrchr (program_name, '/'))
    program_name = strrchr (program_name, '/') + 1;

  if (!strcmp(program_name, "egrep"))
    setmatcher ("egrep");
  if (!strcmp(program_name, "fgrep"))
    setmatcher ("fgrep");

で、実際 Ubuntu の場合 egrep / fgrep は単なる shell script。
FreeBSD の場合は、hard link になっていて、zgrep とか bzgrep なんかも hard link のようです。