Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
(Changes to grep) Time To Stop Using egrep and fgrep Commands, Per GNU grep 3.8 (phoronix.com)
37 points by anotherevan on Sept 10, 2022 | hide | past | favorite | 25 comments


I feel like this is a pretty silly thing to deprecate. What is the harm in keeping around egrep and fgrep?


Why should GNU maintain 3 different command profiles on their own? If is really necessary or useful distros can easily shim them to a grep wrapper if they want to


On their own it's probably trivial. I suspect over time it becomes a large tasks/maintenance question.

Depending on the number of additional commands on similar removal paths it may have performance/memory improvement implications for minimum supported specs.


I don't think that's why, on my Arch Linux box they're just shell scripts that pass the -E/-F argument to regular Grep.

  $ cat /usr/bin/egrep
  #!/bin/sh
  exec grep -E "$@"

  $ cat /usr/bin/fgrep
  #!/bin/sh
  exec grep -F "$@"


interesting, on openbsd they are the same inode and it uses it uses arg0 to figure out what to do.

  ls -li /usr/bin/grep /usr/bin/egrep /usr/bin/fgrep                                                                                                                                                          
  285407 -r-xr-xr-x  6 root  bin  31896 Aug 14 15:23 /usr/bin/egrep
  285407 -r-xr-xr-x  6 root  bin  31896 Aug 14 15:23 /usr/bin/fgrep
  285407 -r-xr-xr-x  6 root  bin  31896 Aug 14 15:23 /usr/bin/grep


GNU has flip-flopped on it.

- Based on the NEWS file, it sounds like pre-v2.0 (1993) versions had totally separate implementations for each program and didn't have -E, -F, or -G flags (but only history back to 1998 has been imported to Git, and I don't feel like digging up old tarballs to verify)

- In the first revision checked in to Git (1998), it's argv[0]-inspecting, but the program is compiled identically 3 times, rather than being hardlinked or symlinked. https://git.savannah.gnu.org/cgit/grep.git/commit/?id=06b9f7...

- In v2.2c (1998) it changed to be 3 separate binaries https://git.savannah.gnu.org/cgit/grep.git/commit/?id=f76209...

- In v2.5 (2002) it changed to be argv[0]-inspecting hardlinks https://git.savannah.gnu.org/cgit/grep.git/commit/?id=f620c9...

- In v2.5.1 (2002) it changed to be shell scripts https://git.savannah.gnu.org/cgit/grep.git/commit/?id=5cb71b... <---- (this is a spicy commit message)

- In v2.5.2 (2005) it changed to be 3 separate binaries (the `fgrep` binary being a lot smaller than the `grep` binary) https://git.savannah.gnu.org/cgit/grep.git/commit/?id=d25beb...

- In v2.19 (2014) it changed back to shell scripts https://git.savannah.gnu.org/cgit/grep.git/commit/?id=b63964...


Thanks for the lineup! Seems quite the waste that this would change every five years. So removing seems a good option.

I didn't like the arg0 magic, so I'm happy that is gone. Funny to think I had to be in the right time window to even notice that.


What is your objection to argv[0]?

Gzip and its successors have used this technique for decades, and busybox wouldn't exist without it.

On Android, take a look at /system/bin, to find this approach still very much used.


After A bit of thought it does not bother me.

But I can see why it could bother people, the idea that a function changes based on it's name is weird, after all the name is just a symbolic identifier, it should not matter if the name is "search" or "grep" it should do the same thing.

But I decided it does not matter, mainly because names are really important, so important that changing the name effectively changes the function, for example if you took the sin() and renamed it destroy_universe() there would be so much uncertainty about both the new name and the lack of the old, that it does not matter that the code is the same, you have to now treat them different, so having code that does different things based on the name is fine.


Android uses toybox, because the license is more permissive.

https://landley.net/toybox/about.html

Here is the output from my phone (notice the applets for egrep and fgrep):

127|:/ $ toybox

[ acpi base64 basename blkdiscard blkid blockdev cal cat chattr chcon chgrp chmod chown chroot chrt cksum clear cmp comm cp cpio cut date dd devmem df diff dirname dmesg dos2unix du echo egrep env expand expr fallocate false fgrep file find flock fmt free freeramdisk fsfreeze fsync getconf getenforce getfattr getopt grep groups gunzip gzip head help hostname hwclock i2cdetect i2cdump i2cget i2cset iconv id ifconfig inotifyd insmod install ionice iorenice iotop kill killall ln load_policy log logname losetup ls lsattr lsmod lsof lspci lsusb makedevs md5sum microcom mkdir mkfifo mknod mkswap mktemp modinfo modprobe more mount mountpoint mv nbd-client nc netcat netstat nice nl nohup nproc nsenter od partprobe paste patch pgrep pidof ping ping6 pivot_root pkill pmap printenv printf prlimit ps pwd pwdx readelf readlink realpath renice restorecon rev rfkill rm rmdir rmmod rtcwake runcon sed sendevent seq setenforce setfattr setsid sha1sum sha224sum sha256sum sha384sum sha512sum sleep sort split stat strings stty swapoff swapon sync sysctl tac tail tar taskset tee test time timeout top touch tr traceroute traceroute6 true truncate tty tunctl ulimit umount uname uniq unix2dos unlink unshare uptime usleep uudecode uuencode uuidgen vconfig vi vmstat watch wc which whoami xargs xxd yes zcat


Hm, I just dislike magic like that. It tends to go wrong in weird ways. If I'd compile it and symlink to it as fgrep-gnu for example. But of course, the wrappers would be even more confusing, executing the system grep, not the compiled grep. So removing the wrappers is fine.


I hadn’t realized the bsd’s implemented egrep and fgrep. Even more reason not to depreciate the interface.


Those are not provided by GNU grep, they are an Arch thing (could exist on other distros as well, I'm not sure). The scripts are hand-written for keeping the support with older scripts.

I imagine Arch is not using GNU's egrep and fgrep anymore because of the deprecation.

This also answer the question on why is not necessary to GNU to maintain those different commands. Distros can easily shim them to grep if they want to, similar to how a lot of them already link /bin/sh to bash


> Those are not provided by GNU grep, they are an Arch thing

No, they're a GNU grep thing.

GNU grep 3.7: https://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh...

GNU grep 3.8 (with the warning): https://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh...

And you can see that the Arch package isn't doing anything special to add it: https://github.com/archlinux/svntogit-packages/blob/packages...

In general, Arch avoids doing Arch-specific things and prefers to provide vanilla upstream packages, a lot more than other distros avoid doing distro-specific things.


Does it though? I mean we’re really talking about a teeny tiny little startup code to read arg0 and use it to do the equivalent of passing -E or -P.


Even simpler than that! GNU grep hasn't done arg0-inspection since 2002; since then `fgrep` and `egrep` have been short[1] shell scripts.

[1]: 11 lines at the longest, 2 lines at the shortest; currently 4 lines

https://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh...


What's the rational for keeping them around in new installs?

How have others handled command deprecation on the past?

May this also serve as a warning about adding functionality and being very careful about removing it.


I have numerous scripts in production that rely on fgrep. Not sure about egrep. So I'm happy there's a warning before these commands are eventually removed.


An alias also seems like it'd work.

alias egrep='grep -E'

alias fgrep='grep -F'


POSIX requires that aliases be observed in the context of a shell script, but there is a trap here.

When bash is called as /bin/sh, it will be in POSIX mode, and will honor those aliases.

When called as anything else or when otherwise not in POSIX mode, those aliases will fail.

Bash was around for a decade before the POSIX shell standard was defined, so there is legacy baggage.


I'm shocked - neither egrep nor fgrep are POSIX standards!

I had every expectation that they would be.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/g...

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/


What does "$@@" do? I have used just "$@" for what the script at the end is trying to accomplish, is there some edge case where that fails?


I think that's just the markup for a single @-sign.


Yeah, GNU TeXinfo uses @ as its meta-character, so a source file needs @@ to produce @ in the output.


The main addendum is that fgrep without a file list is -F, and egrep is -E.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: