[HN Gopher] We are stuck with egrep and fgrep (unless you like b... ___________________________________________________________________ We are stuck with egrep and fgrep (unless you like beating people) Author : yakubin Score : 256 points Date : 2022-10-13 11:08 UTC (11 hours ago) (HTM) web link (utcc.utoronto.ca) (TXT) w3m dump (utcc.utoronto.ca) | cryptonector wrote: | > What's special about GNU Grep 3.8 is that its version of egrep | and fgrep now print an extra message when you run them. | Specifically, these messages 'warn' (ie nag) you to stop using | them and use 'grep -E' and 'grep -F' instead. | | Can we please stop with the make-work nonsense?? | | Please stop making us change scripts just because you've decided | that some command shouldn't have existed that does exist. Stop | it. Just stop. | | See `which` deperecation. Please, no more. | [deleted] | javier_e06 wrote: | scripts will be break. Strange outputs will appear. Devops will | rip the gowns and douse ashes on their heads. Patches will arrive | and a years later someone will make a joke about fgrep like the | jokes about ed, the GNU ed line editor. | rgoulter wrote: | Hopefully Devops will be able to make use of nice tooling like | linters (e.g. shellcheck for bash) which can hope to catch such | problems. | kristjank wrote: | GNU Grep manpage says: | | 7th Edition Unix had commands egrep and fgrep that were the | counterparts of the modern 'grep -E' and 'grep -F'. Although | breaking up grep into three programs was perhaps useful on the | small computers of the 1970s, egrep and fgrep were not | standardized by POSIX and are no longer needed. In the current | GNU implementation, egrep and fgrep issue a warning and then act | like their modern counterparts; eventually, they are planned to | be removed entirely. | | Considering how drastically GNU departs from the bare POSIX | interface in some of their tools, I find it strangely pedantic | how the maintainers hold up the standard in this specific case. | Considering the Linux mantra of "Never Break Userspace", I can't | find a good reason to drop the binaries (or the script | equivalents of calling grep -E/-F) besides uprooting a historical | choice that never hurt anybody (with little benefit and a | plethora of potential consequences) in the name of better-late- | than-never correctness. | javier_e06 wrote: | GNU: GNU is Not Unix. Or Linux for that matter. | froh wrote: | somehow the opengroup removed egrep and fgrep from POSIX in | 2018 | https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu... | | chroot, usefull for poor man's containment of 'stuff' also went | out. | | and they replaced tar with pax --- which uses a tar file format | | one of the things I love in Unix is the slow pace of evolution | in systems tools. relevant know how doesn't rot as fast as in | other environments. | teddyh wrote: | The GNU tools and programs are, theoretically, created for the | GNU system, which has evidently chosen to (eventually) not | provide fgrep and egrep, as they are not part of the POSIX | standard. This is the GNU project's choice to do. Other operating | system projects, like Debian GNU/Linux, who use the GNU tools to | provide _their_ operating system, might choose otherwise and | (separately) provide the fgrep and egrep tools. This would then | be their choice (and one that I personally expect them to make). | | I.e. if you don't run straight GNU as your OS, don't complain | about this; instead object if _your_ operating system which you | actually use or depend on choose to break behavior and interfaces | which your programs rely on. | radford-neal wrote: | I use fgrep all the time. Why should I spend time converting | scripts, and retraining my fingers, and forever after taking | longer to type grep -F? This is a breaking change that has no | upside, only downside. It is idiocy. | | Just to elaborate, there must be many thousands (hundreds of | thousands? millions?) of shell scripts out there that use fgrep. | For no reason at all (whatever maintenance burden fgrep | represents must be far outweighed by the time wasted debating | this issue), these scripts will no longer work. There is no | guarantee that defining an alias somewhere is going to fix all | your usages of fgrep. And even if it did, the cost for _every | single installation that is affected_ of someone realizing there | is a problem, finding the source of the problem, figuring out | that an alias will fix it, making sure that that alias gets | preserved after updates, and testing that everything now works | will exceed the benefit to the maintainers of grep (which is | actually negative, as explained above). So looked at from a | community-wide perspective, the cost is many thousands of times | greater than any possible (but actually non-existent) benefit. | | And as the post mentions, there are also all the books, and all | the stackoverflow answers, that use fgrep, and which will now | have non-working code. | | As for the argument that this is open-source software maintained | by volunteers, who can therefore do whatever they wish - if you | are a maintainer of widely-used open-source software, and decide | that you personally are not interested in working in a manner | that benefits the community of users, then you should resign and | let someone else take over. | Cthulhu_ wrote: | I mean they could just make it an alias that calls the | appropriate grep function, and mention fgrep/egrep are just | aliases in all the documentation. Tools like ShellCheck could | warn on use of fgrep/egrep in scripts in favor of grep if it | wants things to be pure. | | But the cost of keeping an alias around for decades is | negligible I think. It's cheaper than breaking every existing | usage in any case. | [deleted] | barrkel wrote: | There's a certain type of person who gets pleasure from | following rules exactly, particularly when other people don't | follow those rules. A kind of smug moral superiority. | | If they get into a position of power, they can make life worse | for other people, without much regard for the actual cost of | breaking such rules. | | Removing egrep and fgrep is desperately petty stuff. | paulmd wrote: | > There's a certain type of person who gets pleasure from | following rules exactly, particularly when other people don't | follow those rules. A kind of smug moral superiority. | | HN commenters in a nutshell. | | Not you in particular, but _oh my god_ , the rules-lawyering | and lecturing on this site is unbearable at times. | gnfargbl wrote: | If you look at the POSIX standard that removes fgrep & egrep | [1], then you can see that most of the utilities being | removed there really are quite obscure things. | | In light of that, then another (perhaps more charitable) way | to look at it is that the maintainers are keen to clean up | stuff that they perceive as old cruft, and perhaps don't | realise quite how ingrained these particular pieces of | "cruft" are into the ecosystem. | | (On the other hand: the same POSIX link specifies the removal | of _cpio_ and, uh, _tar_. I 'm not sure I see that last one | flying.) | | [1] https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_ | xcu... | wnissen wrote: | No `tar`? BURN. IT. ALL. DOWN. | | Dear God, what could they possibly be thinking? People are | capable of making changes, I think we've all switched from | `more` to `less`, *csh to more modern shells, etc., and if | `pax` is really all that I'm happy to switch. But removing | tar is insane. | jws wrote: | _"removal of cpio and, uh, tar"_ | | They've finally figured out how to make people use _pax_. | PaulHoule wrote: | It's a show of how free software partisans are often out of | touch. | | The cost of egrep and fgrep is just two symbolic links. Some | people though would rather talk about 'libre' and 'free as in | speech' and 'free as in beer' than talk at all about the user | experience. And they wonder why most people just run windows | or macOS, but they'll never understand. | pbhjpbhj wrote: | Aside: | | What do you mean by "use a symbolic link" (I'm familiar | with `ln -s` fwiw) the alias carries the command switch, | how do you do that with a link? # example | alias egrep='grep -E' | | ?? | PaulHoule wrote: | A program like "grep" gets the path to the binary in | argv[0], if it sees that argv[0] is something like | /some/path/fgrep | | it adds the -E flag. A hard link works OK too, as done | copying the whole binary. | anamexis wrote: | This is not the case for GNU grep. It appears only some | BSDs do this. | mananaysiempre wrote: | Currently, egrep and fgrep are shell scripts (the too- | simple version of this idea would be | #!/bin/sh exec /usr/bin/grep -E "$@" | | but that would mess up help messages and probably also | needs disaster handling in case exec fails). Another | traditional way, however, is to symlink everything to a | single binary, which uses argv[0] or getprogname() to see | which name the user called it under and acts accordingly. | In the extreme case, you get the "multi-call binaries" | Busybox or Toybox, which contain an entire set of Unix | utilities in a single (not-too-slim) executable image. | GNU grep also used that technique at some point in its | history, but it was discarded for a reason I don't | recall. | smellf wrote: | Actually it turns out that, at least in debian 11, you | were right on the money: cat `which | egrep` #!/bin/sh exec grep -E "$@" | | But I agree that it would be cleaner and trivial to | implement this behavior by depending on argv[0], GNU | style guide be damned. | vlovich123 wrote: | You use argv0 to check the program name. The utility has | to support it in code which GNU apparently dislikes as | someone mentioned elsewhere in the thread. | gumby wrote: | > The cost of egrep and fgrep is just two symbolic links. | | A cost that needs to be paid every time you invoke them (a | double lookup in the filesystem). Just use a regular link. | | (I felt a pedantic response would be in the spirit of this | change by the GNU project). | Maursault wrote: | > > The cost of egrep and fgrep is just two symbolic | links. | | > A cost that needs to be paid every time you invoke them | (a double lookup in the filesystem). Just use a regular | link. | | I'm having a bit of trouble understanding the outrage. | Can't all egrep/fgrep in all scripts be fixed once in one | or two commands and remain fixed? $ | sed -i 's/fgrep/grep\ -F/' *.sh | | (or something) | | I see it as getting accustomed to bells and whistles on | some modern shell (like tab completion on zsh and | others), then having to use a shell on another system | without them (some ragged old korn) and getting tripped | up... and the ultimate solution is to be conscious that | these things don't work everywhere, so don't be too | reliant on them. | gumby wrote: | How would you find _every_ script given that people | download all sorts of scripts all the time? What about | docker images? | | And that doesn't even open the can of worms relating to | quoting... | Maursault wrote: | If we don't know where our scripts are, we have much | deeper issues, but still not insurmountable. | $ sed -i 's/fgrep/grep\ -F/' $(grep -rw '/' -e 'fgrep') | | (or something) | | I don't manage docker images, but surely there must be a | way to do something as simple as replace a file in one | image,[1] and if that can be done, doing so in all images | is just one clever step away. | | [1] https://stackoverflow.com/questions/40895859/how-can- | i-overw... | cryptonector wrote: | We've seen a lot of this in recent years. | MichaelCollins wrote: | The worst is when the rule they cite isn't a real rule at | all, like Lennart Poettering's defense of systemd breaking on | usernames starting with a digit, which is completely valid as | far as the Linux kernel is concerned but he decided such | names were _ackshully_ against the rules and therefore | systemd wasn 't broken, bug report closed not-a-bug. | pfortuny wrote: | This is exactly why Torvalds is so radical on not regressing: | it is costly for him (I am sure there are many things hr would | have done differently now) but ensures the users' security. | thomastjeffery wrote: | I find it amusing that someone who uses fgrep all the time - | and is presumably familiar with alias and sed - would be | worried about the inconvenience of updating their shell | scripts... | | I think the larger issue is that people generally don't do | dependency management for their scripts. Scripts are programs, | and they are dependent on the shell environments they are | written for. | radford-neal wrote: | I think you're not grasping the point that the cost of using | 'alias' or updating scripts, though not huge, is paid by | _every single user_ , and often over and over again, every | time they switch to using a different system. Against this | cost for every user, one weighs the benefits of this change - | which are _zero_. Indeed, the benefits are negative, since | the maintainers must surely be wasting more time debating the | change than they will ever save from it. | | Of course, scripts are dependent on their environment. That's | why changing the environment for no reason is such a bad | idea. Nobody manages their shell scripts to account for the | possibility that 'true' might cease to exist some day... | thomastjeffery wrote: | > the cost of using 'alias' or updating scripts, though not | huge, is paid by every single user, and often over and over | again | | The cost of a change that effects N users is paid by N | users. user*N - change*N = user - change | | The amount of work each person must do is not increased by | the amount of work _everyone else_ most do. | | > Against this cost for every user, one weighs the benefits | of this change - which are zero. | | That point specifically I am not arguing with. I agree this | change doesn't seem to have merit. Remember: I am not the | one imposing it on you. | | Deprecating fgrep in a grep package distribution is just | like deprecating a function in a library. The only reason | it would be more difficult to handle that change is if you | don't have a straightforward way of managing changes in | your scripts and/or shell environments. | | And that's the point I was making: it's very common for | shell scripts to exist in unmanaged - and frankly brittle - | environments. That's a problem that is not unique to this | situation. | | --- | | Here's an example: | | If someone deprecated the printf() function in gcc version | 127.4, replacing it with print(format=False,...), then | anyone using gcc 127.4 would have to make a straightforward | change to their code. Would it be annoying and pointless? | Yes, that's the criteria for this hypothetical situation. | Would it be difficult to manage? No, not really. You would | just update your gcc dependency version, find and replace | printf, sanity check, commit, done. | | The reason deprecating fgrep is scary is that people tend | to manage shell scripts more liberally. In other words, | they likely aren't managed at all. Are they in a git repo? | Who is running it? On what machine? What user? Critically, | there probably isn't a clear way to predict what version of | grep is going to be installed in what environment, and | when. | | This isn't a new problem. Package maintainers diverge all | the time on what binary names and aliases they provide. | Tell me, if you opened a shell on any random GNU/Linux | system you have access to, and typed "python", would it be | version 2 or version 3? Would python3 be in the path? | | It's valuable to be able to manage these things. That's why | projects like Nix are so popular. | kazinator wrote: | If your reason for using fgrep is that grep -F is more | characters longer, the logical thing would be to have your own | function or alias which is called just _f_ or _fg_. | | I stopped using egrep and fgrep in scripts ~25 years ago when I | found out they weren't in the standard. | | grep -F is only useful when the pattern contains regex | characters that should be treated literally, and since the | default regex language of grep is BRE, those characters are | few. | | If only one special character occurs you break even on | character count if you use a backslash escape: | fgrep 'a*c' grep 'a\*c' | hinkley wrote: | > decide that you personally are not interested in working in a | manner that benefits the community of users, then you should | resign and let someone else take over. | | As walled gardens begin to reassert themselves, I think this | advice above will be the big argument in open source over the | next ten years and needs to be written on every vertical | surface. Either we will have social contracts in open source, | or we will have commercial contracts. There will be diminishing | examples of "both" and people will continue clutching their | pearls about co-opting until something changes. | | "Be grateful you get anything" is good advice for people | struggling to find their own peace of mind, but when it comes | up in an argument that's just abuse. | L1fescape wrote: | GNU Grep: "Am I so out of touch? No, it's the users who are | wrong" | midislack wrote: | rrwo wrote: | I've started to wean myself off of `fgrep`, but only because I am | using `zgrep -F` as I'm often searching through logs, which may | or may not be gzipped. | | But this is a stupid change. | chriswarbo wrote: | I get the annoyance, for both the GNU maintainers and distro | maintainers/sysadmins. I'm not too wedded to either outcome, but | my take is that we should avoid global mutable state: | | - If you're relying on random globals (like the path | /usr/bin/egrep) to (a) exist and (b) behave in a certain way, | then don't mutate them. Stick with known-good versions, and treat | updates like any other code change (review, test, etc.). This is | the usual case for legacy systems. In other words, don't blindly | run `apt-get -y upgrade` on systems which are meant to be stable. | | - Alternatively, don't use globals: install grep in its own | directory (e.g. via the `--prefix` argument of `./configure; or | using a sledgehammer like chroot), and treat that location as a | capability (as per capability-security). Programs/scripts which | need that grep must be given its location explicitly (either for | direct calls, or by having it prepended to their $PATH). If you | want to use an updated version elsewhere, just install that to a | different location; no need to touch the existing setup. | | (Shout-out to Nix for doing this via ./configure and $PATH. | Runner-up prizes for chroots/jails/zones/containers/VMs/etc.) | AshamedCaptain wrote: | Both of your suggestions are basically equivalent to "think | before you upgrade" and/or "don't upgrade". This is the second | elephant in the room with all these distros that "don't use | globals" and/or statically link everything (or do an analogue | to that, like nix). There's very little benefit for desktops. | So the upgrade to dependency X breaks component Y, and you are | forced not to update X, or at least, Y's copy of X. Great. What | do you do now? Swim away from upstream? Stay on outdated | components? The situation is as unatenable long-term as it is | on a regular distro... | | The first elephant in the room is that generally you _do_ want | most dependencies to be global state. Is a situation where | every program is using its own version of the graphics toolkit, | with different theming issues or even different themes | altogether, really ideal for a desktop situation? What about | libevent -- so that your mouse's wheel has one acceleration | curve in some programs and some other speed in some other | programs ? Or what about ibus, where generally having different | client versions running simultaneously means your entire input | system stops working ? | | Even grep is likely something that you'd prefer to be global | state, lest the grep exec() by a Python interpreter have | different features than the one launched by your main shell. | eptcyka wrote: | Yes, but Nix just solves this nicely enough. | rgoulter wrote: | > The situation is as unatenable long-term as it is on a | regular distro. | | I may be misremembering, but isn't this pretty much the | default user experience on rolling distributions like Arch | Linux? -- You consult the wiki to see what changes you need | to make are (or maybe see what breaks after an update), make | the change, and get on with your desktop experience. | tgv wrote: | Idk, but Arch Linux is a bad model, in my experience. I had | inherited a system that ran Arch Linux, but hadn't been | updated in a while. Imagine my surprise when I needed to | update something, and couldn't. A part of the upgrade path | (or whatever you want to call it) had been removed. So now | I have an Arch Linux system that hasn't been updated for | way too long, and we need to consider abandoning the | product that runs on that machine, or invest in porting it | to some modern environment. It's hidden behind a firewall | with access for only 2 IP addresses, so it's unlikely to | get hacked, but it's most undesirable. | | If you like that model, fine, but don't force it onto the | whole world, unless you can commit more resources to it | than to Arch Linux, and basically keep all upgrade paths | alive forever. | sillysaurusx wrote: | (I want to love Nix, but it's so foreign. I do hope it becomes | more of a standard. It's just hard to learn and hard to use | until you learn.) | rgoulter wrote: | I'd prefer to qualify that a bit: | | When you can get Nix to do what you want, it's wonderful. | | When you hit a barrier (e.g. a program you want isn't | packaged), that's when Nix is very hard to use, and requires | learning. | ilc wrote: | I went over to Nix cold turkey for my new work laptop. Took | about a week or two, to get it where I wanted it. The real | issue I hit is that Nix is so alien to working with "normal" | unix stuff... like stuff that assumes /usr/bin/grep exists | etc, I had issues, with the existing code-base I was hired to | work on. | | So, I went back to Fedora. But I'd goto Nix again in a | heartbeat. It is a great system, and if you start a company | with it day 1... there will be a bit of heartburn as you | start, but I can't see regretting it. | deeblering4 wrote: | Or... | | And I'm going out on a limb here... | | Don't support user hostile maintainers who force breaking | changes to a decades old API just because they felt like it. | thomascgalvin wrote: | > If you're relying on random globals (like the path | /usr/bin/egrep) to (a) exist and (b) behave in a certain way, | then don't mutate them. | | It's a bit old now, but one of the principles of Twelve Factor | Applications is to vendor-in all of your dependencies.[1] | | > A twelve-factor app never relies on implicit existence of | system-wide packages. It declares all dependencies, completely | and exactly, via a dependency declaration manifest. | Furthermore, it uses a dependency isolation tool during | execution to ensure that no implicit dependencies "leak in" | from the surrounding system. The full and explicit dependency | specification is applied uniformly to both production and | development. | | This scenario, with `fgrep` and `egrep` releasing a potentially | breaking change, is exactly why this principle exists. If your | software depends on "whatever fgrep happens to be lying around | at the moment", your application might break the next time you | build and deploy a new image. If you're pinned to a specific | version, however, you're protected. | | [1] https://12factor.net/dependencies | mcv wrote: | You're protected, but it also means you can never upgrade | anything. An application can never know what future versions | of a dependency it can work with (because a new version might | contain a breaking change), so it will always require | versions that existed at the time of its own creation. | | But those versions might contain vulnerabilities, and the new | version might fix those while being fully compatible in every | other way, in which case you really do want the upgrade. | | Those dependencies should really declare when they change | existing behaviour of the previous versions, and only then | should your application refuse the upgrade. | | No idea if there is a system that works that way; I can | imagine it could get hideously complex. | chriswarbo wrote: | > You're protected, but it also means you can never upgrade | anything. | | No, it just means that: | | - Upgrading a dependency is a change, which should be | treated like a code change (review, testing, etc.). I | stated as much above. | | - If, for some reason, you're stuck using an old version, | that _only_ affects the relevant part of the system. For | example, scripts which rely on some old behaviour can | remain pinned to that version; whilst other parts of the | system can use an upgraded dependency. Also, just as | importantly, parts of the system which don 't need | something (like grep) have no access to _any_ version of | it. | joshuacc wrote: | Isn't that essentially semantic versioning plus version | ranges ala npm? | thomascgalvin wrote: | > You're protected, but it also means you can never upgrade | anything. | | You're protected, and it means you have to test your system | _before_ upgrading. | | Also, I think I'm working with a much broader definition of | what "a dependency" is than you are. I consider `Alpine | Linux 3.16.2` to be an atomic thing; I don't try to track | the state of every single binary that comes along for the | ride. | | But if I depend on something to be executable from my | application, like `ffmpeg 5.1.2` or whatever, I _would_ | version lock that, and install it myself as part of the | build script. | | Then, when `Alpine 3.17` or `ffmpeg 5.2` comes out, I can | bump to those versions, run our integration tests, and | verify nothing broke. | cestith wrote: | " there's a difference between avoiding fossilization and the | kind of minimal, mathematical purity that we see GNU Grep trying | to impose here. Unix has long since passed the point where it had | that sort of minimalism in the standard commands. Modern Unix has | all sorts of duplications and flourishes that aren't strictly | necessary, and for good reasons." | | Well, really, the type of purity many of the original Unix hands | desired was that each tool did one thing well, not that one tool | did everything well. Some folks would say that putting the -E and | -F flags in GNU grep in the first place instead of using egrep | and fgrep was the wrong direction. Now GNU is wanting to further | consolidate the hydra. | koprulusector wrote: | I've been using grep -E for a long time, I thought I remember it | being from a warning from egrep or something.. can't really | remember for sure, though. | | Either way, I don't see what the big deal is, just add an | alias egrep='grep -E' | | If you're worried about your non-interactive shell scripts, | shopt -s expand_aliases; alias egrep='grep -E' | | and you can move on with your life. | | EDIT: I must've been warned by shellcheck | | EDIT2: here's another one liner with one caveat being updates | (also needs to be run as root) # unalias grep | && unalias egrep && cp "$(command -v grep)" "$(dirname "$(command | -v grep)")/egrep" | | EDIT3: just realized for most this will only ever come up in | scripts because many distros already add alias egrep='grep -E' to | your shell aliases (~/.bash_aliases, ~/.zshrc, etc). Thus you may | only need the shopt -s expand_aliases. | 3pt14159 wrote: | The problem is that we don't just live on our own machines. We | hop around to different boxes and just being able to type what | you are used to matters. My dotfiles and other tools don't go | or even work everywhere. | | We shouldn't change the oldest parts of our OSes without a | really good reason. | acdha wrote: | I find this reasoning interesting since it's why I _stopped_ | using egrep/fgrep around the turn of the century: because | those aren't standard, it wasn't uncommon to find that you | depended on some behaviour which wasn't available in the | version installed on some random server but it worked when | you used grep. | 3pt14159 wrote: | I switched to just grep, but it's still part of the same | line of thinking. I really, really, really dislike it when | something that used to be reliable changes or is removed. I | understand and accept that things change, but when it's as | simple as a symlink or what have you I really do not see | the cost-benefit tradeoff for sunsetting something. | markstos wrote: | I don't remember why I stopped using the shorter `egrep` | and only use `grep -E`, but I suspect this was the reason. | I used to work on a variety of BSD and Linux servers. | | I'm fine with this clean-up and simplification. Eventually, | there will be more future users of `grep` than past users. | acdha wrote: | Yeah, I worked with enough older systems (SunOS, Solaris, | AIX, HPUX, FreeBSD/NetBSD/OpenBSD, etc.) that I don't | remember which ones caused me to do that, either. I'm | really glad it's no longer common to have things like | hand-compiled installs of GNU utilities, especially since | not every sysadmin was diligent about updating all of | them. | ComputerGuru wrote: | It's a matter of principle. If you wrote a script yesterday (or | a year ago) and didn't include that line, you need to re- | release it today. That's stupid. | | Also, you're being very sanctimonious about this but what if | you didn't see this HN story. Would you know to do that for the | next script you distribute? | [deleted] | kazinator wrote: | fgrep and egrep have been indicated as obsolescent by the | Single Unix Specification and POSIX since the late 1980's. | | The man page for GNU grep says: In addition, | the variant programs egrep, fgrep and rgrep are the same | as grep -E, grep -F, and grep -r, respectively. These | variants are deprecated, but are provided for backward | compatibility. | | "Deprecated" should be read as "maybe ain't gonna be around | one day". "Use interactively, or in your personal setup, but | don't put into shipping code". | | So if you wrote a script yesterday with these things, you're | just one of those people who don't look into specs or man | pages. | | The scripts of coders who don't read documentation are going | to tend not to be portable or reliable anyway. That doesn't | mean we should break things left and right to trip people up, | but in this case the writing has been on the wall for a very | long time. | koprulusector wrote: | Frankly I can count on two hands the number of times I've | used egrep in my life (same for grep -E). As long as I can | remember I've relied on sed, awk, or find -regex for | filtering output with regex. I only say this because I can't | relate to those that are upset about the change. | | That said, to answer your questions directly: hopefully you | aren't auto updating anywhere in production or important, so | this won't effect anything until the box has grep 3.8. Ubuntu | 20.04 uses grep 3.4, for example. | | And the warning prints to stderr, so honestly, I'm having a | difficult time seeing this being an actual problem for more | than 0.1% of users. | | I'm not unsympathetic to those that it adversely affects, but | I genuinely haven't seen anyone point out any severe | consequences of the change. I'm not saying it's impossible, | if someone has a real example (sorry, saying you might get a | page on the weekend for a warning printed to stderr is a | stretch), I'm all ears. | ur-whale wrote: | > Frankly I can count on two hands | | Emphasis on "I", which says strictly nothing of the rest of | CLI users out there. | | We're very glad to learn that it is not a problem for _you_ | , but it brings very little to the conversation. | koprulusector wrote: | But neither does this comment.. do you have an example to | share in response to my questions above? | strenholme wrote: | Everyone has their own story, and one's person's | experience can be very different from another person's | experience. I used egrep a whole lot, dozens of times for | the automated test setup I have for my open source | project. I had to spend most of an hour this morning | updating that code to no longer use egrep--a non-trivial | task. Here's the amount of hassle breaking egrep has | given me: | | https://github.com/samboy/MaraDNS/commit/afc9d1800f3a641b | df1... | | This is just one open source project. I've seen fgrep in | use for well over 25 years, back on the SunOS boxes we | used at the time. egrep apparently has been around for a | very long time too. Just because it didn't get enshrined | in a Posix document--OK, according to Paul Eggert it was | made obsolete by Posix in 1992, but apparently no one got | the telegram and it's been a part of Linux since the | beginning and is also a part of busybox--doesn't mean | it's something which should be removed. | | I'm just glad I caught this thread and was able to | "update" my code. | robertlagrant wrote: | > We're very glad to learn that it is not a problem for | you | | Worth reading the guidelines [0]. | | [0] https://news.ycombinator.com/newsguidelines.html | tyingq wrote: | I don't think aliases help in one common case listed in the | article. That is, scripts run out of cron, that don't read | initialization files. And that case will email on unexpected | stderr writes. | ngvrnd wrote: | I like beating people in concept but not in practice. | nickcw wrote: | If you want modern regexp syntax then forget egrep/grep -E and | use grep -P for Perl Compatible Regular Expressions. PCRE is the | most commonly used regex syntax for modern programming languages, | eg Python, Go (mostly) etc and grep -P will save lots of | annoyance if you use one of these! | tolciho wrote: | The -P is not for portability. $ grep -P foo | grep: unknown option -- P | kentonv wrote: | Some context: egrep and fgrap are implemented as wrapper scripts | that look like this: #!/bin/sh exec | grep -E "$@" | | 28 bytes. | | Now consider the cost/benefit between two options: | | 1. Maintain these wrapper scripts forever. | | 2. Update all scripts in the world that use these to use the | flags instead, eventually removing the wrappers. | | What is the cost of option 1? It's essentially zero. No changes | means no engineering work. Some hard drive space is wasted, but | TBH you can probably buy a single hard drive with enough capacity | to store all copies of these files that will ever exist. Perhaps | some people's sense of cleanliness will be offended by the | continued existence of non-standard commands but it's hard to | demonstrate any actual cost from that. | | What is the cost of option 2? Many thousands of hours of | engineering labor, just to update scripts. But that's just the | beginning: There will likely be production outages when the | script are finally removed, since inevitably some uses will be | missed. That will cost money. It will also lead to a general | increase in fear of software updates, leading even more people to | run outdated installations that are vulnerable to security flaws. | Security breaches will cost more money. | | It seems clear this change will cost millions of dollars, whereas | keeping things as they were would have trivial cost. Therefore, | this change should not have been made, and should be reverted. | | Reasoning like this is why widely-used platforms simply never | remove "deprecated" APIs: | | * Java still contains APIs deprecated 25 years ago in version | 1.1. | | * Linux's ABI is famously stable, with Linus verbally abusing | anyone who even suggests a backwards-incompatible change. (I | don't approve of the abuse part.) | | * The web platform is backwards-compatible even with objectively | bad JavaScript design decisions made by Netscape in the 90's. | | * C libraries still include `gets()` even though any use of it | implies a security vulnerability. (Though we hope any remaining | users are not running in security-sensitive use cases...) | | * The Windows API is full of trash but you can still run | executables built in the 90's. | | "Deprecated" was never supposed to mean "will go away". It was | always supposed to mean only "there's a better way to do this". | jeroenhd wrote: | If the GNU folks want to remove the wrapper scripts, they can. | It's their software and they write the best practices for it. | | Distro maintainers can still ship these scripts. They can add | aliases to the user profile to do the same thing without having | to launch a sh instance. Maybe they'll add a second package, | grep-utils, that just contains the wrapper scripts so you can | choose between GNU's position and the "I don't like change" | position. | | Microsoft has deprecated and removed tons of stuff and so did | browsers. Vista crashed so often because Microsoft did away | with their entire driver model and vendors wrote quick wrappers | around their old, crappy drivers and shipped those. Many | remaining browser features are reasons why web development | sucks so much ("quirks mode" for one) and Java not breaking | compatibility has given it many problems that dotnet solved by | breaking compat once. Java also has removed several deprecated | packages and moved them to libraries instead (like Nashorn). | | Deprecated means "if we see a reason to remove this, we may | remove this in the future". It's no guarantee for removal but | it's no guarantee for being kept around either. | kentonv wrote: | > If the GNU folks want to remove the wrapper scripts, they | can. It's their software and they write the best practices | for it. | | I'm not making any argument about the maintainer's rights. I | am making an argument about whether it was a good technical | decision. | | > [people can work around it] | | That doesn't make it a good idea, though. | | > Microsoft has deprecated and removed tons of stuff and so | did browsers. | | Only when there was a real benefit deemed greater than the | cost. | | In this case there is essentially no benefit whatsoever to | the change, except some abstract notion of cleanliness or | pedantic spec compliance. | mugwort13 wrote: | TacticalCoder wrote: | Does the warning go to stdout or somewhere else? | Beltalowda wrote: | stderr | ur-whale wrote: | > stderr | | For now. | Beltalowda wrote: | Clearly that will never be done. Outputting this to stdout | would be ridiculous and break everyone and everything using | it. Might as well just outright remove egrep and fgrep. | Ridiculous comment. | lizardactivist wrote: | Happy to have left the mess that is grep, awk, bash, zsh, fish, | etc. behind and just use Python for scripting. | dahart wrote: | Hehe, wasn't the Python 2 to 3 incompatibility debacle a | thousand times worse than [fe]grep? Python2 is still lingering | in places even after Python 2 was removed. | salawat wrote: | Python has it's own problems. Not the least of which being it | being hundreds of times slower than coreutils. | | I'll take learning Shell and a handful of coreutils, over | praying the sysadmin has successfully navigated/allowed me to | navigate all the Python footguns. | | Also, good luck doing anything embedded where space is at a | premium. Not all base systems have/need Python. Everything | needs a shell, however. | 42e6e8c8-f7b8-4 wrote: | I like hand saws and I like circular saws/Skil-saws. I use them | for different things. | hnlmorg wrote: | There seems to be a lot of confusion in this discussion about | what the change is and how egrep and fgrep work. These are not | symlinks like some have suggested but rather shell scripts. You | can see the exact commit diff here: | | https://git.savannah.gnu.org/gitweb/?p=grep.git;a=blobdiff;f... | | I remember around ~10 years ago being told "you should never use | `egrep` because it is slower than `grep -E`." precisely because | the former requires extra forks() compared to the latter. However | I'd counter that advice saying "if you're concerned about the | performance of forks() then why are you running your code as a | shell script to begin with?"... and I stand by that assessment | now. In fact it would probably take me longer to type `-E` than | it would for any modern system to run fork() (and I'm sure as | hell not planning on using `grep` inside any hot loops!) | | I think what will likely happen here is that distro maintainers | will either remove that warning themselves or take ownership of | the `egrep` and `fgrep` shell scripts. I'd be surprised if that | warning made its way to the mainstream distros. I also wouldn't | be surprised if the GNU grep maintainers did a u-turn on this | change -- though it has already been committed to git for more | than a year now and this is the first I've heard people complain | about the change. | brundolf wrote: | Why wouldn't they just convert them to aliases instead of | adding the warnings? | hnlmorg wrote: | aliases aren't a global state. They're shell and profile | specific (as there are plenty of instances where a profile | isn't loaded). | | With `egrep` defined as a shell script, any process (even | callers who are not shells) will have the same behavior. | | That doesn't mean the shell script is the best solution | though. Personally I'd rather they be a symlink to `grep` and | have grep check the name it's been invoked as, and if it's | "egrep" (or "e" if you're just checking the first byte) then | implicitly enable the -E flag. This is how FreeBSD works and | it feels like a more elegant solution in my opinion. | brundolf wrote: | Sure, makes sense- so then I guess I'd amend my question to | that: I can't see why they'd add the warning instead of | just redirecting the command | jomar wrote: | I too was surprised to see these were shell scripts. I was | expecting the grep/fgrep/egrep names to be hard links to the | same executable that would check `argv[0]`, as the BSD | implementation does. | | More interesting than the commit diff is the brief discussion | on the bug report from when this all happened a year ago, as | referenced in the commit message: | https://debbugs.gnu.org/cgi/bugreport.cgi?bug=49996 | | Sigh. Time to retrain the old fingers again... | hnlmorg wrote: | Thanks for sharing that. It was an interesting read. | Particularly this comment: | | > The irony... that one of our own tests used fgrep! | | If ever there was an argument for fgrep becoming a pseudo- | standard that should remain, that would have been it. | tannhaeuser wrote: | When it comes to avoiding forks, the question is why do egrep, | fgrep have to be shell scripts rather than interpret the | invocation name (argv[0]) for switching behavior. Also, I find | the original POSIX spec to lump everything into a single grep | binary questionable since egrep, fgrep developed as extension | and restriction, resp. of grep under a classic regexp discourse | and it isn't clear at all that automaton construction for | powerful egrep support has to live in the same binary as fgrep | which isn't using automaton construction at all. | ratmice wrote: | The gnu coding standards has this to say: | https://www.gnu.org/prep/standards/standards.html#index- | beha... | | Please don't make the behavior of a utility depend on the | name used to invoke it. It is useful sometimes to make a link | to a utility with a different name, and that should not | change what it does. | | The next section provides some reasoning: | | Providing valid information in argv[0] is a convention, not | guaranteed. Well-behaved programs that launch other programs, | such as shells, follow the convention; your code should | follow it too, when launching other programs. But it is | always possible to launch the program and give a nonsensical | value in argv[0]. | lamontcg wrote: | So if you symlink grep to something else then you have to | use `-E` for that, for the 99.999999% use case of the rest | of the world egrep being a hardlink to grep would have | worked just fine. | tannhaeuser wrote: | Thanks for the link, but I find that reasoning entirely | unconvincing: | | The ability to interpret argv[0] as a way to avoid exec is | traded for hypothetical linking - but wherever linking is | used (such as for idk a mail filter or other configurable | executable) _that 's_ the place where a wrapper shell | script could be used instead. And avoiding improper | launching of egrep/fgrep from a program that doesn't bother | to build argv[0] properly is also an (unlikely) non-use | case that's better handled by fixing that offending | program. | mike_hock wrote: | I find the reasoning convincing. It's the principle of | least surprise. And a bunch of other principles. I don't | want a program to care what it's executable name is, if | it's being invoked with a relative path, absolute path, | through a symlink or hardlink or anything else. | | Of course, there are exceptions to the rule, like | busybox. The point is to have uniform, predictable | behavior across the ecosystem and not have every other | program have its own weird idiosyncrasies. | | That being said, the egrep/fgrep legacy is precisely such | a case where it makes sense to make an exception. It's a | decades-old legacy and grep isn't just any program, it's | part of Using the Shell 101. | raverbashing wrote: | > But it is always possible to launch the program and give | a nonsensical value in argv[0]. | | Well, if you're being a smart@ss and doing that, don't | expect it not to break later. | | Putting a weird value there and hoping it won't break is as | stupid as calling the program with wrong options and hoping | it will work. | cryptonector wrote: | Exactly. | naikrovek wrote: | the name of an executable is like a global variable the | instant it is used as data; it can be changed at any time | by someone else and then behavior changes. | | names are not data. don't make them data. | | names are names. | hinkley wrote: | Different behavior based on argv[0] was first brought to my | attention when I discovered that /bin/sh was a symlink on | some Linux systems. Bash has a Bourne shell compatibility | mode. | chasil wrote: | Bash actually has a POSIX compatibility mode. | | There is a great deal in POSIX that was not in Bourne, | native arithmetic expressions being the first to come to | mind, then new-style command substitution. | | https://pubs.opengroup.org/onlinepubs/9699919799/utilitie | s/V... | | All of the POSIX utility standards, including the grep | variants, can be found in the URL's parent directory: | | https://pubs.opengroup.org/onlinepubs/9699919799/utilitie | s/ | | If this new GNU grep functionality becomes widely | distasteful, I think that OpenBSD's grep tries to emulate | GNU in a few ways, and could supplant it, becoming the | system grep while "gnugrep" is relegated to the shadows. | | It is also _extremely_ expensive on Windows for a version | of grep to be implemented as a shell script. Launched by | xargs, the penalty will be severe. | | The commercial platforms based upon GNU are in a marriage | of convenience, and can easily pick and choose. | chasil wrote: | I just checked OpenBSD, and I find that there are 6 total | links in /usr/bin: egrep, fgrep, grep, zegrep, zfgrep, | and zgrep. | | The OpenBSD package is superior. | | The GNU gzip package includes a zgrep shell script that | is adapted from work by "Charles Levert | <charles@comm.polymtl.ca>" - this is similarly adapted | for bzgrep and xzgrep. | | The OpenBSD implementation will have superior performance | for zgrep, because it is native C. rebel$ | ls -li /usr/bin/*grep 466612 -r-xr-xr-x 6 root | bin 31520 Apr 11 2022 /usr/bin/egrep 466612 | -r-xr-xr-x 6 root bin 31520 Apr 11 2022 | /usr/bin/fgrep 466612 -r-xr-xr-x 6 root bin | 31520 Apr 11 2022 /usr/bin/grep 466711 -r-xr-xr-x | 2 root bin 15288 Apr 11 2022 /usr/bin/pgrep | 466612 -r-xr-xr-x 6 root bin 31520 Apr 11 2022 | /usr/bin/zegrep 466612 -r-xr-xr-x 6 root bin | 31520 Apr 11 2022 /usr/bin/zfgrep 466612 -r-xr- | xr-x 6 root bin 31520 Apr 11 2022 /usr/bin/zgrep | kps wrote: | > Bash actually has a POSIX compatibility mode. | | It's partial. A short example is `date&>FILE`. | | [edited typo] | | On a POSIX shell, `date` will run in the background and | the date will be written to stdout (`date&`) and `FILE` | will be created or truncated (`>FILE`). Using `bash | --posix`, the date will be written to `FILE`, since the | incompatible bashism `&>` still takes priority. | chasil wrote: | I agree that is ambiguous. | | If I were writing such a script where I wanted to launch | a background process, and then create/truncate a file, I | myself would separate them: date & | >FILE | | Bash wouldn't mistake that, but a lot of shell scripts | look like line noise and there are situations where bad | form is required (quoted in an ssh, for example). | | Obviously, people wanting the bash functionality in POSIX | would: date > file 2>&1 | | Bash discourages the latter form in my man page, but | anyone interested in portability knows how profoundly bad | that advice is. | 1vuio0pswjnm7 wrote: | Yikes. This is why I do not use bash. Too complicated. | | For Linux, I added tab autocomplete to dash and use that | for interactive shell instead. | | Saves keystrokes for non-interactive, too. No need to | keep typing "#!/bin/sh". | Taywee wrote: | Busybox is the forefront example of this in my mind. | Busybox is a single binary that provides a ton of POSIX | utilities (including sh, awk, ls, cp, nc, rm, gzip, and | about 300 other common ones), and these can be invoked | with `busybox $command`, or a symlink may be made from | the command name to the `busybox` binary to automatically | do the same. Many embedded Linux systems just use busybox | and a ton of symlinks to act as the majority of the | userland. | samus wrote: | GNU does it their way, and Busybox does their own way | too. Both have valid reasons for how things are set up. | For users friendlinesr it's important then that they are | as consistent as possible with it. | hnlmorg wrote: | > _When it comes to avoiding forks, the question is why do | egrep, fgrep have to be shell scripts rather than interpret | the invocation name (argv[0]) for switching behavior._ | | I don't know. I'd have taken the argv[0] approach personally. | And it's the approach some other grep implementations have | taken too (eg https://github.com/freebsd/freebsd- | src/blob/main/usr.bin/gre...). | | The argv[0] approach (to me) feels like a right kind of | compromise. | cryptonector wrote: | Switching behavior according to argv[0] been used in Unix | for decades. mv(1)/ln(1)/cp(1) historically are the same | program, hardlinked. | hnlmorg wrote: | Wasn't rm also the same? | | I vaguely recall it being little more than 'mv $1 | /dev/null' under the hood. But this might be something | I'm misremembering. | cryptonector wrote: | Yes. I made a mistake, I think cp(1) was separate. | mike_hock wrote: | What's the problem? Just make egrep and fgrep shell aliases in | the default /etc/profile (if you're a distro maintainer). | | Also, where's the extra fork? #!/bin/sh | exec grep -E "$@" | fnordpiglet wrote: | I am not sure I agree with the logic. On an absolute | instruction count scale grep will often dwarf the instructions | necessary for the higher level logic captured in the shell | script. Insert appeal to andahls law here. Writing in some more | optimal language often requires considerably more work, and if | the marginal benefit of reducing a few forks is minuscule | compared to grep performance, why would you do this? | hnlmorg wrote: | It depends on where your hot path is. If you're writing the | kind of performance critical code where the different between | 'egrep' and 'grep -E' matters, then you shouldn't be writing | it in $SHELL to begin with. Not just because of the expense | fork()ing, but because Bash is interpreted, because each exec | requires loading new code into your L1 cache, and so on. It's | just never going to be as quick as something written in most | other languages with a mature regex library. | | I'm not saying this as a criticism against shell scripting | (I'm an author of an alternative $SHELL and shell scripting | language, so do have a love for shell scripting). I'm saying | it as a criticism against people who try to optimise against | the wrong things. | | I guess in a way we are "violently agreeing" (as some say) | because your point about the engineering effort mattering | more than micro-optimisations is an example of the right kind | of optimisations. Which is what I'm also, albeit badly, | trying to describe. | gatonegro wrote: | > _I 'd be surprised if that warning made its way to the | mainstream distros._ | | This is the first time I'm hearing about the warning, but I | thought I'd run `egrep` and `fgrep` on my Arch system. Sure | enough, both result in warnings: `egrep: warning: egrep/fgrep | is obsolescent; using grep -E/-F` | | So it's made its way into Arch, at least. Though, like I said, | this is the first time I'm hearing about this. | thayne wrote: | I use arch, and I had an alias for grep to expand to `egrep | --color=always` in my interactive shell. I noticed real fast. | Fortunately it's an easy fix to `grep -E --color=always`. | | sidenote: I wish that grep would allow running `grep -E -F`, | and have the `-F` flag override the `-E` flag, rather than | giving an error about conflicting options, so that I could | have an alias like this to make extended regex the default, | but allow me to change it with a flag. | NegativeLatency wrote: | You could write a little function that does that | thebeardisred wrote: | For me, that's the biggest takeaway: | | Nothing is stopping users from maintaining the behavior | they had previously. | | It's being made explicit that the burden of maintaining | that behavior is changing. | MobiusHorizons wrote: | What exactly do you think the burden of _not_ changing a | shell script is? | TillE wrote: | Yeah, this is a good point. This is basically just GNU | saying that those old aliases are not something they want | within the scope of grep itself. | tomn wrote: | the overhead isn't even an extra fork, as it uses exec | txutxu wrote: | On most context involving "using grep", shell scripts, | interactive shell, etc, it's nothing. | | 81 Vs 128 system calls on my laptop (just printing --version) | $ strace -fc grep -E --version 2>&1 | tail -1 100.00 | 0.000000 0 81 3 total $ | strace -fc egrep --version 2>&1 | tail -1 100.00 | 0.000000 0 128 6 total | | Measured with "time" 0m0.002s Vs 0m0.003s, always, testing 4 | times each option. | | Most situations where it could be being used, probably are | surrounded by much bigger optimizations to work on. | hnlmorg wrote: | Good point. Though invoking $SHELL and parsing the script (as | short as it is) can't be cheap either. Academically speaking | of course; I'm not trying to justify the change on | performance grounds. | chaxor wrote: | > "if concerned with performance why are you running code as a | shell script" | | Rewrite grep in python before running - got it. :P | hnlmorg wrote: | That's not what I suggested. I was saying if you're writing | performance sensitive code with a hot loop calling `egrep` | then a smarter approach might be to use a language better | tuned for performance which supports regex libraries. | | Shell scripts have their place and can out perform most | languages if you're writing simple logic that can run across | large datasets in parallel, such as cat very- | large-file | grep "do not want" | sed -r 's/foo/bar/' > very- | large-file-refactored | | (please excuse the useless use of `cat`, it's there to | illustrate the direction of data flow) | | But in those types of scenarios the cost of $SHELL | interpretation and fork() is massively outweighed by the | savings of stream processing. | | So my point was: if you're writing a function which $SHELL | interpretation and/or fork() create enough of a performance | impact where you're looking to optimize _how_ you exec `grep | -E`, then maybe it 's time to investigate whether $SHELL is | the right language to write your function in. | jraph wrote: | > please excuse the useless use of `cat`, it's there to | illustrate the direction of data flow | | Note that you can write < very-large-file | | Instead of cat very-large-file | | | To avoid a useless use of cat and keep the direction. Not | that I care very much though. Using cat is less surprising | to most people. | hnlmorg wrote: | > _Using cat is less surprising to most people._ | | Exactly :) | | STDIN redirection is a neat trick though so definitely | worth highlighting. But it wouldn't have helped with | readability in my particular example. | cryptonector wrote: | The maintainers' fears about using argv[0] to select behavior | are unfounded. | | Anyone exec()'ing grep with an alternate argv[0] can just use | (or not use) the -E/-F options to get the behavior they want. | | It's very simple. There is just no good reason for egrep or | fgrep to be shell scripts or wrapper programs of any kind. Even | if the were a good reason for having a wrapper program, the | wrapper program could be a very tiny C (or even assembly) | program that just exec()s grep with -E or -F added, thus | avoiding any additional fork() calls (though there would still | be one additional exec() call). | | But, really, argv[0] dispatching is plenty good enough. | | This warning, however, is much too annoying. | | Plus, argv[0] dispatching has worked for every other Unix and | Unix-like OS of note for 4+ decades! What's so special about | GNU in this regard? The answer is clearly: nothing. | kps wrote: | > I remember around ~10 years ago being told "you should never | use `egrep` because it is slower than `grep -E`." | | I remember around 30 years ago reading that egrep was faster | (the UNIX versions were entirely separate implementations, | egrep of course being newer) and have used it ever since. | lamontcg wrote: | exactly the same here. | | although i'm using ripgrep more now, proving that you can | teach an old dog new tricks. | vlovich123 wrote: | > though it has already been committed to git for more than a | year now and this is the first I've heard people complain about | the change. | | This reasoning is flawed. I only noticed it a few months back | on Arch. So between the time it takes the project to make a new | release and it hitting Linux distros (Debian is slower and | Ubuntu even moreso), don't expect a flood of complaints to be | time correlated with the change. | hnlmorg wrote: | > _This reasoning is flawed._ | | I wasn't making any reasoning. I was just making the | observation that this change has been staged for a while now | and that I'm surprised there hasn't been more noise about it | before now. | | > _don't expect a flood of complaints to be time correlated | with the change._ | | I expect complaints to be correlated with whenever a | blog/tweet/whatever moaning about the change happens to | trend. I don't think it has much to do with when distros pick | up the change because, as I also said, I expect distros to | backport the old behavior. So I think the timing of any | backlash is entirely dependent on the mood of the internet | hive mind. | paulmd wrote: | > I was just making the observation that this change has | been staged for a while now | | "There's no point in acting surprised about it. All the | planning charts and demolition orders have been on display | at your local planning department in Alpha Centauri for 50 | of your Earth years, so you've had plenty of time to lodge | any formal complaint and it's far too late to start making | a fuss about it now. ... What do you mean you've never been | to Alpha Centauri? Oh, for heaven's sake, mankind, it's | only four light years away, you know. I'm sorry, but if you | can't be bothered to take an interest in local affairs, | that's your own lookout. Energize the demolition beams." | | Again, you're completely missing the point of the comment | you're replying to: _average users don 't pay attention to | what's being staged upstream_. You're only going to get the | _real_ flood of complaints when it actually gets pushed out | and people 's houses start getting demolished. | hnlmorg wrote: | > _Again, you 're completely missing the point of the | comment you're replying to_ | | Actually you and the GP are the ones missing my point by | obsessing over a throwaway comment about this commit | being over a year old. I was literally making zero | conclusions from that observation. You guys are reading | far far far too much into that comment. You seem to be | projecting your annoyance about this change onto me as if | I'm defending and supporting this change, yet literally | nothing I've posted has supported that claim. | | > _average users don 't pay attention to what's being | staged upstream._ | | I'm going to assume that you skipped over my point about | how any outrage will come from blog/Twitter/etc posts | going viral. | | This has already landed on some distros and most people, | rightly or wrongly, went "meh". If that last 30 years of | the internet has taught me anything, it's that people get | outraged by posts, not by software. And the fact that | youre arguing over a meta-point like when people will get | annoyed, rather than discussing the technology itself, | really just confirms my 3 decades of observations. | | In fact the only reason we are discussing this now is | because someone blogged about it and it hasn't even hit | the distro they're using; they know about it because they | read another news article who found out about it from the | release notes posted on the mailing list and the authors | then went back and checked the commits! Literally nothing | in that chain of discovery was via experiencing the | change itself in their chosen distros. | | So to be clear: | | I am NOT suggesting that the commit being > 1 year old | means GNU have a free pass to make a breaking change. Any | conclusion like that you derive from my posts are a | misinterpretation and not worth arguing over. | | Now, can we move on to more interesting things? | usefulcat wrote: | This reminds me of the last time daylight savings time was | changed (in the US). A bunch of hassle and software breakage.. | for what? Just to get back to the same place we already were | (working software)? What a waste. | xani_ wrote: | grep -P is only true way | gjvc wrote: | grep --perl-regexp --only-matching pattern some/where/file/name | | aka grep -Po pattern some/where/file/name | richard_todd wrote: | It's interesting to think about the way these things evolved. | Imagine if, over time, the `compress` utility got -gz, -bz2, | -lzma, etc. flags, and `gzip`/`bzip2` were all converted to | deprecated shell scripts. When is the right time to consolidate | variants under one program (and deprecate the variants), and when | is it better to let small utilities keep doing one thing | well(TM)? | | I see people talking about removing the compatibility scripts | being driven by a sense of purity, but wasn't it that same sense | of purity driving someone to collapse `fgrep` and `egrep` into | `grep` in the first place? The sense that these are all just | variants of the same goal, and thus should be flags to the same | program? Why bother combining them if not to ultimately remove | the "extra" programs one day? | | I'm not sure what the right answer is. On one hand, I like the | idea of a smaller namespace of programs with a larger set of | well-documented switches. The alternate universe where `compress` | covers the widely-used variants of compression and the variant | utilities fell away over time sounds kind of nice. Or imagine if | early UNIX had arrived at a "plugin" model, where top-level | programs like grep should have pluggable regex engines which can | be provided by independent projects? The culture we have, of tiny | independent projects, will always make consolidation and | deprecation messy events. | mirker wrote: | As someone who learned about regular expressions before | extensively using grep, I found grep to be quite unintuitive, | since extended grep is what I am conceptually thinking about | from a "theory" point if view. One difference between grep and | compression is that grep is bounded by regular languages, but | compression is more free form. It's conceivable to therefore | view grep as mature enough of a technology to be finished once | and for all, but compression will continue branching into many | disparate algorithms. | richard_todd wrote: | Consider the popularity of ffmpeg and imagemagick. Putting | the mainstream algorithms together under one interface seems | to be an appealing model to a lot of people, even though new | algorithms are constantly being developed in those areas. | | Personally, for audio encoding, I'm much happier just | installing ffmpeg than I would be gathering and learning a | bunch of flac/ogg/opus/mp3/etc encoders. | mirker wrote: | Yes, those are quite different. But you also can't pipe | lossy compression data willy-nilly without compounding data | loss, so it's hard to imagine an alternative with unix- | style tools. | | The difference may also stem from those being application- | focused rather than command line, so they don't have a | burden of maintaining legacy applications forever. | MatthiasPortzel wrote: | The original UNIX design philosophy was very much one-command | for one-thing. | | => http://harmful.cat-v.org/cat-v/ UNIX Style, or cat -v | Considered Harmful | | But that argument is an argument against pretty much all | command-line flags. Rob Pike argues `ls` shouldn't have an | option to split the output into columns, you should pipe ls | into a column-splitting program. | | So the pure version of that philosophy is long-gone. It makes | this current effort seem rather arbitrary and meaningless. | radford-neal wrote: | Beyond the inadvisability of making a breaking change for no | reason, it's worth noting that deprecating fgrep is actually | positively undesirable. Use of fgrep should be _encouraged_. | | The reason is that many times people want to match a literal | string. This is best done with, for example, "fgrep [a] <file". | Note that this is not the same as "grep [a] <file", since '[' has | special meaning in regular expressions. Of course, you can write | "grep \\\\[a] <file", but not everyone has the set of special | characters used for regular expressions at the top of their mind. | | Of course, one could get in the habit of using grep -F when | intending the pattern to be just a literal string. Or one could | write one's own fgrep shell file. But both of these options | require more effort than just using fgrep. One aim of good design | should be to make it _easy_ to do things in the reliable way. | That way it 's more likely to be done. | teddyh wrote: | If we are talking about _interactive_ use, you could always use | an alias. | | But if we are talking about _scripts_ , you should _at least_ | use "fgrep -- [a] < file". And if you're adding an option | anyway, you might as well use "grep -F -- [a] < file". | Personally, I prefer using options, specifically long options, | in scripts; meaning "grep --fixed-strings --regexp=[a] < file". | | If you _don't_ do this, the script will fail spectacularly the | day when the string happens to start with a hyphen (-). | romeoblade wrote: | I thought I was the only one who perfected long options! Are | you me? | | I've had coworkers call me out (not rude, just "hey you know | you just use -l... instead of --longopt") on calls because I | always use long options when available. I use the hyphen | explanation all the time as I've ran into it a few times. | | I also prefer CLI applications that are designed to use the | "=" for arguments with long options. Applications which don't | use "=" or respect it, irk me because the it's ambiguous... | "Is that argument an argument or sub command" when looking | through history. | cies wrote: | I'm on ripgrep (Rust, very fast). Thanks BurntSushi! | adren67 wrote: | I completely agree that rg/ripgrep is a _way better | alternative_ to most grep implementations including GNU grep | not only in terms of feature | | check https://beyondgrep.com/feature-comparison/ for a detailed | comparison | | but also in terms of speed, including the fact that ripgrep | allows greping by default in compress files, many different | encoding and more! | | This software is really a must-have for anyone who spends some | time on the CLI | Communitivity wrote: | I also use ripgrep, and swear by it. It has many of the | features previously only found in ag or git grep | (parallelism, respect .ignore files, search hidden files, | etc). | | It's old, but here'd a feature comparison of ag, git grep, | ripgrep and others: | | https://beyondgrep.com/feature-comparison/ | jagtesh wrote: | What's wrong with removing the commands and adding shell aliases | instead? That sounds perfectly reasonable to me. | | eg. In bash, they can be expressed as: | | alias fgrep=grep -F | | alias egrep=egrep -E | | This sounds like a push for purity - similar to what happened in | Python 3 with the move from print "xyz" (special keyword) to | print("xyz") (standard function). | | The new function requires three additional keystrokes every time | it is used. | zorked wrote: | It breaks my script that calls /usr/bin/fgrep | c7b wrote: | > typing 'grep -F' is two more characters, one of them shifted | | Adding in more special characters is also hostile to users who | aren't based in a single English-speaking country and regularly | have to deal with different keyboard layouts. | jmclnx wrote: | Here is what I gave for 'fgrep' on Slackware 15: | | cat /bin/egrep | | #!/bin/sh | | exec grep -E "$@" | | Is that really hard to maintain :) I was expecting to see a link, | but instead it is a shell script GNU is asking is to create. I do | not know why GNU says that is hard to maintain going forward. | BTW, this is grep v3.7 | [deleted] | henearkr wrote: | They (the maintainer) should make the behavior of `grep` | depending on the name of the executable. | | Then one could simply do a `ln -s grep egrep` and be done with | it. | barrkel wrote: | That's exactly what it does already. The maintainers are | objecting to the existence of the links. | henearkr wrote: | Yep. Almost (it uses a wrapper script instead of a symlink), | but it ends up being such a silly situation all the same... | | Thanks for pointing it out though, I was not aware! | henearkr wrote: | I cannot edit anymore, so I add this: This is the case in a | distribution (Arch) that has effectively taken the | maintainer's advice into account, not the reverse. | ziml77 wrote: | I think it's a bit silly to get rid of such established aliases. | Surely they aren't a real maintenance burden. | | Though I can't say I entirely hate it, for the (admittedly | absurd) reason that egrep = grep -E, fgrep = grep -F, but pgrep | != grep -P! It's an awkward incongruity that's easy to get | tripped up on occasionally. | kevincox wrote: | What problem is this warning trying to solve? Are these two | symlinks too much maintenance burden? Or is the check in the code | hurting the code quality? Is the extra check at startup ruining | performance? | | I'm usually in favour of having one way to do things but in this | case, with this much legacy it just doesn't seem worth it. | barrkel wrote: | The problem is people being wrong, and the upside is feeling | good about punishing them. IMO. | tgv wrote: | Unfortunately, this seems symptomatic of GNU's attitude: we've | come up with something silly and it's going to screw some | people over badly in the least agreeable moment, but we're too | stubborn and proud to admit it. Take it, or buy a Windows 11 | license. | saalweachter wrote: | At a guess, it isn't actually the symlinks, it's the argument | parsing they're trying to simplify. | | Old programs have stupidly complex argument parsing. If you can | pass your arguments as "cmd foo bar path", "cmd -f bar path", | "cmd -fbar path", "cmd path --foo=bar" or "fcmd bar path" and | "cmdf path bar", it can be really convenient for users who can | structure their commands in the way that makes the most sense | for them. | | But it can be really frustrating to maintainers who are | maintaining -- and testing! -- a thousand lines of bespoke | argument parsing for a ten line function. | | It's really, really tempting to define a simple syntax for | argument parsing, turn it into a library, and reduce your pile | of shell commands to a few lines of argument configuration and | a function call. | masklinn wrote: | > At a guess, it isn't actually the symlinks, it's the | argument parsing they're trying to simplify. | | There's no parsing. GNU's egrep and fgrep are trivial shell | scripts: #!/bin/sh exec grep -E | "$@" | saalweachter wrote: | Then that's a real jerk-ass move. | roenxi wrote: | This is free software. It is legitimate to consider convenience | for the maintainers. If they don't want to maintain two | symlinks then they are empowered to make that call. | | If anyone thinks it is a big enough problem that they want to | fork the software they can, or the distros can maintain their | own symlinks. But I think in this case the simple answer is if | the maintainer doesn't want it in the source tarball then it | isn't going to be there and that is more than sufficient a | justification. | | Complaining is probably more reasonable than asking for a | justification here. | colonwqbang wrote: | It can't be that much work to maintain a symlink. The idea | that it could be _less_ work to remove a standard feature | that has been part of Unix for several decades, has no | connection with reality. | | There is no reasonable explanation for this decision except | that somebody thought that having both egrep and grep -E was | "ugly" according to their own personal sensibilities. | AshamedCaptain wrote: | And this is what I hate from the argument "you can't expect | the maintainers to always support the feature". No, I | don't. But I do expect them NOT to regularly remove/break | the features I have contributed! | | E.g. I can't count the number of times I have submitted | _the_ _same_ _GUI_ _fixes_ to certain popular browser over | the decades. Because apparently "they" have to rewrite the | chrome of the mobile version from scratch every handful of | years. "They" is in quotes because it's, in fairness, never | the same person or even the same group of people. It's a | CADT. | | And in this case, to remove what apparently are two small | shell scripts which for sure cost more to remove than to | preserve.... | layer8 wrote: | Cascade of Attention-Deficit Teenagers? | fleddr wrote: | What 'maintenance' goes into symlinks that already exist? The | only thing one needs to do is nothing at all. It is in fact | more 'maintenance' to delete them. | MobiusHorizons wrote: | What exactly do you imagine the maintenance being? egrep and | fgrep are already shell scripts, and those scripts haven't | been edited since 2015. If not needing to change something | for 7 years counts as a maintenance burden, sign me up. | _jal wrote: | > It is legitimate to consider convenience for the | maintainers | | In which case, time to fork it. | | I don't fucking care who you are, you do not break grep and | keep a privileged position on my machine. | iso1631 wrote: | Nobody is stopping you from forking it. | _jal wrote: | That's the plan. I haven't built a new package in a | while, time to remember how `fpm` works. | | Conflicts: grep | | Provides: grep | raverbashing wrote: | > It is legitimate to consider convenience for the | maintainers. | | Yes, but the convenience of... creating 2 symlinks and adding | the flag based on argv[0]? | | Sorry, I don't buy it. Wanting to die on such a tiny hill has | GNU written all over it though | Ensorceled wrote: | I don't know when society in general just said "Fuck It" to | the idea of stewardship; but we now have it ingrained that | people in positions of trust and power (whether volunteered, | elected or appointed) are not morally or ethically beholden | or responsible to the communities they have taken it upon | themselves to represent. | | At least we used to pay lip service to that ideal. | [deleted] | asoneth wrote: | > At least we used to pay lip service to that ideal. | | When was that? For as long as I can recall, a core mantra | of free/libre software has been that it was provided "AS | IS" without warranty of any kind. Decades ago the dominant | response I recall was one of gratitude and a little | amazement that ad-hoc communities of volunteers were making | real software that wasn't just academic but on par with | commercial offerings. Some of those communities chose to | adopt a user-friendly posture because they wanted people to | like them but plenty did not and just did their own thing. | As long as they could attract contributors they kept going. | | Personally what concerns me is this growing expectation | that volunteering to maintain an open source project also | means you are "morally or ethically beholden or | responsible" to anyone who uses it. In practice that seems | to mean maintainers must respond to user requests or end up | on the receiving end of a great deal of vitriol. It's no | wonder so many volunteer maintainers who have internalized | this responsibility are burning out, and how many more | potential maintainers are dissuaded by seeing what is | happening to the current maintainers. | Ensorceled wrote: | Well, concurrent with this decline in stewardship has | been a decline in graciousness towards volunteers, so I | see your point. | | I remember when I was younger, every volunteering | experience I had was a delight; people thanking me for my | time, getting me free coffee "just because", etc. Some of | my more recent volunteering experiences have been less | pleasant. | __s wrote: | Are you suggesting that a 15 year deprecation path is a | fuck it attitude towards stewardship? | | Distros are free to've replaced the symlinks with wrapper | scripts in the meantime. Granted, I expect Arch will go | ahead & let the symlinks disappear. But I can't imagine | what you think of Arch's stewardship | | I expect this should have about as little impact as the usr | merge many distros have gone through | Ensorceled wrote: | I'm replying to the attitude in the comment I'm replying | to, if I meant this as a comment on GNU's approach to | fgrep/egrep, it would have been top level. | | The original deprecation seems ... petty? Not sure why | it's a priority, but whatever. | | I know there are scripts still in use that I wrote more | than a decade ago that might do weird things now and I | wish the maintainers best of luck. | phailhaus wrote: | This is "back in my day"-levels of lazy armchair criticism. | Nothing has changed. People will always make decisions that | you disagree with, and they are more likely than not doing | it in a good faith attempt to benefit the community. These | sorts of inflammatory and hyperbolic comments help nobody, | and are just childishly over-the-top. egrep going away is | not evidence of moral or ethical bankruptcy, just wow. | SkyBelow wrote: | One major issue with humans is that sacrifice begins to be | expected and often is not rewarded. When a job not only | becomes thankless, or near enough, but also expected as the | default, it becomes hurtful to continue doing it. | | Are the stewards being provided fair compensation? How do | we even talk about what is fair compensation when non- | monetary compensation has become difficult to even discuss | (often due to past instances being extreme disproportionate | or of a form that is no longer tolerable). | | The simplest way to put it is that if you can't find a | steward you aren't paying enough and trying to use appeals | to morals or ethics to get people to accept lower pay no | longer holds as much weight when being moral or ethical no | longer provides the same level of non-monetary benefits. | Ensorceled wrote: | > One major issue with humans is that sacrifice begins to | be expected and often is not rewarded. When a job not | only becomes thankless, or near enough, but also expected | as the default, it becomes hurtful to continue doing it. | | Oh, most definitely. The anger and vitriol I see directed | towards maintainers, or volunteers of any type, who are | "stepping back for personal reasons" is horrifying. | | My father was a very active volunteer in his community | ... the number of people who were mad at him when he | stepped away after his heart problems was startling. | Conversely, the number of people who volunteered to help | him and my mother with shopping etc. when COVID hit was | heart warming. | Beltalowda wrote: | They didn't necessarily "choose communities to represent". | As the maintainer and author of various open source | libraries and tools that are used by many thousands, in | most cases it's just that ... I'm one of the few willing to | spend the time on it, and it's usually useful for myself as | well. I don't really "represent" any community or anyone. | | That said, I certainly wouldn't have put in this change | myself, because I wouldn't like to inconvenience anyone. | But that's just basic good manners that you should have in | every-day life to random strangers. | midislack wrote: | Beltalowda wrote: | Well, if I write some software for my own use, put it on | the internet "because why not?", and lots of people start | using then that's nice. But ... I don't think putting | anything on the internet automatically imparts any kind | of responsibility towards "the community", which usually | means "people who download and use your software, the | overwhelming majority never give anything back in the | form of code, bug reports, money, or anything else". | | But like I already said in my previous comment, I | wouldn't have made this change myself. I actually | strongly disagree with it. But I can _also_ accept that | other people have a different attitude, and that 's okay | too, even if I personally don't really care much for the | particular attitude. | | Funny you mention OpenBSD, because OpenBSD is very much | "by the developers, for the developers" and has a fairly | decent "fuck off" attitude once people start making | demands (which I don't think is a negative per se). | Ensorceled wrote: | That's a very different thing than joining GNU. If your | package gets adopted by thousands of peoples that's | having this community thrust upon you. | | I still feel you have an obligation to transfer to | someone willing to shoulder the responsibility if this | happens, an obligation incurred by publishing it in the | first place. | | Though, I don't feel too strongly about this. | Beltalowda wrote: | Jim Meyering made the change, who has been maintaining | these things from before half the people here were born. | | Even when taking over maintainership for popular packages | later on, people often aren't exactly breaking down the | door for it. So my philosophy is simple: "if you do the | work, you get to decide". I may like or dislike these | decisions, and at times I may even rant about how stupid | a certain decision is, but in the end ... the people | doing the work get to decide. The alternative of being | beholden to a vaguely defined "community" of armchair | quarterbacks is much worse, IMO. | gjvc wrote: | see also: which | | being deprecated, replaced by: command -v | xt00 wrote: | I guess they backed out the "which" change before this so you | wouldn't see something silly like: | | which egrep | | And it would print | | You should use command -v | | egrep is being deprecated | | /usr/.. | | Like jeez.. | Forge36 wrote: | Why aren't these split into separate packages? If a distro wants | to drop them, they can still be installed. If some distro wants | to include them with a warning that's also fair game. | forgotpwd16 wrote: | >Why aren't these split into separate packages? | | Because they're the same thing. What all is about are the | `xgrep` commands being symlinks to `grep`. Though I guess you | can have packages that just add the symlink. | | >If some distro wants to include them with a warning that's | also fair game. | | Some distros already do what is recommended in release notes. | Rather being symlinks they're wrapper scripts. E.g. in Nix the | `fgrep` and `egrep` are just `exec ${nixpkgs.gnugrep}/bin/grep | -F "$@"` and `-E` respectively. | ksherlock wrote: | GNU egrep and fgrep are wrapper scripts (and have been for 10 | years for more). Wrapper scripts that now warn you not to use | them. | | https://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh | forgotpwd16 wrote: | True, the symlink part is wrong. Guess I should've checked | the code. But in similar vein, a distro can just have | packages adding the scripts. | | edit: But was not always wrong. Just terribly outdated. | Searching the log I found the commit [5cb71b0] with the | message: Add patch from Paul Eggert | <> to comply with ridiculous guidelines (don't act | differently if invoked as egrep or fgrep) | | which made the change from creating symlinks to creating | scripts. The code continued to adjust behavior according | filename (in contrast to what someone would expect based on | the commit message). Then few years afterwards in [d25bebd] | the scripts and the symlink behavior were dropped for | actual binaries, with in-source comment: /* | We build specialized legacy "egrep" and "fgrep" programs. | No program adjusts its behavior according to its argv[0]. | No scripts are provided as an alternative. Distributors | are free to do otherwise, but it is their burden to do so. | */ | | It also funnily added the following prints, quite similar | to what they're doing now: Invocation as | `egrep' is deprecated; use `grep -E' instead. | Invocation as `fgrep' is deprecated; use `grep -F' instead. | | The scripts returned about a decade later (or else few | years ago) in [b639643]. The commit message mentioned the | reasoning: Although egrep's and fgrep's | switch from shell scripts to executables may have | made sense in 2005, it complicated maintenance and | recently has caused subtle performance bugs. Go back | to the old way of doing things, as it's simpler and more | easily separated from the mainstream implementation. This | should be good enough nowadays, as POSIX has | withdrawn egrep/fgrep and portable applications | should be using -E/-F anyway. | | [5cb71b0]: https://git.savannah.gnu.org/cgit/grep.git/commi | t/?id=5cb71b... | | [d25bebd]: https://git.savannah.gnu.org/cgit/grep.git/commi | t/?id=d25beb... | | [b639643]: https://git.savannah.gnu.org/cgit/grep.git/commi | t/?id=b63964... | henearkr wrote: | This should be the top comment lol. | | Such an insanity... | | They are wrapper scripts that precisely enable to obey to | the advice the warning is giving, yet the warning ends up | advising not using the wrapper... | Pxtl wrote: | I do wish that there was a standard pipeline for warnings, so | stuff like this didn't have to go into error (bad) or output | (worse). Powershell has such a feature but of course since it's | not at the OS/Posix level then support is spotty. | bitofhope wrote: | You can technically pipe to streams other than &1 and &2, so | you could use printf "WARNING: %s" "$warn_msg" | >&3 | | But of course, nonstandard. | int_19h wrote: | Why is it bad for it to go stderr? It's supposed to be used for | all kinds of app meta-output, not just errors. If you want to | actually check if the command failed, that's what exit codes | are for. | | I did run into some Node.js code that assumed that _anything_ | printed out to stderr is a fatal error - but that 's just | people making wrong assumptions, not using the interface as | intended. | thepawn1 wrote: | alias fgrep='grep -F' | VWWHFSfQ wrote: | the issue is that programs rely on the existence of fgrep in | its PATH. your shell alias doesn't fix that. | jonas-w wrote: | It is a bit hacky but you could put "grep -F" in a script | file in your path. | forgotpwd16 wrote: | That's what GNU grep recommends: https://www.gnu.org/softwa | re/grep/manual/html_node/Usage.htm... | emptyparadise wrote: | #!/bin/sh exec grep -E "$@" | henearkr wrote: | The current contents (not joking): (this is why the | situation is crazy) #!/bin/sh | cmd=${0##\*/} echo "$cmd: warning: $cmd is | obsolescent; using grep -E" >&2 exec grep -E "$@" | henearkr wrote: | I cannot edit anymore, so I add this: | | This is the case in a distribution (Arch) that has | effectively taken the maintainer's advice into account, | not the reverse. | Beltalowda wrote: | Of course it can be solved; no one claimed you can't. The | choice here is: | | - Thousands of users have to update their scripts, habits, | shell configs; or | | - The GNU Grep maintainers spend essentially zero minutes | "maintaining" a few lines of code to automatically use -E | or -F based on argv[0]. | | It seems to me the second is _obviously_ the better option. | koprulusector wrote: | # unalias grep && unalias egrep && cp "$(command -v | grep)" "$(dirname "$(command -v grep)")/egrep" | | 1 line. Fixed. Done. Btw needs to be run as root ( as | signified by # prompt above) | | EDIT: see other comment in this thread from FreeBSD user | that on FreeBSD grep, egrep, and fgrep are all separate | but identical (copies) of the same file. So this isn't | quite such a silly solution as some might think. | salawat wrote: | So. Thought experiment. | | Which has lower cognitive load if _everyone_ starts doing | it? | | Explicitly specifying switches, or argv magic? I'd argue, | the switches are. In the abscence of the symlinking, that | is how the tool functionality would have to be driven | anyway. | | Argv magic now runs into a problem if another program | sharing the name ever comes into existence on the path. | It's also completely unergonomic in a sense, because | short of looking at the source, you have no way of | knowing what argv transforms implementations support are, | and in order to use them, you must explicitly pollute the | Symbol namespace with a denormalized util. Also, the argv | magic does require one extra shell to do the transform | from !grep to grep -!, Which is technically more | overhead. On the other hand, fgrep and egrep are | ironically easier to grep/sed for as opposed to grep/ | -[F|E] | | One tool, one manual, one name, one argv0. | | I am not the Grand Poobah of the Internet, however, even | if their hat is in my possession, so I understand that it | is likely that the fgrep/egrep convention is probably | deeply entrenched, and likely to spawn a new holy war on | par with Emacs/Vim. Tabs/spaces, etc... | Beltalowda wrote: | I don't think grep does any argv-stuff; I took a quick | look and I don't see it. | | As far as I can tell this is the entire maintenance | burden: $ cat =egrep =fgrep | #!/bin/sh exec grep -E "$@" #!/bin/sh | exec grep -F "$@" | yubiox wrote: | what shell does this? | forgotpwd16 wrote: | Apparently zsh replaces =cmd with cmd's absolute path. | TIL. | Beltalowda wrote: | Yes, very useful to bypass aliases if need be, quickly | edit a script ("vi =my-script"), etc. I don't think bash | has it; you need to use | where/whence/which/command/whatever (I can never | remember, why are there so many?!) | btdmaster wrote: | Hack: \command instead of command is very unlikely to be | aliased, so should work fine. | markhahn wrote: | preach! | Asooka wrote: | It's probably time for the Linux world to distance itself from | the trash fire that is GNU, as they keep breaking backwards | compatibility. This isn't 1970, it's 2022, people! You do not | just break the world for no good reason. | | GNU has served its purpose, it's time to stop relying on them. It | would be a lot easier to convince the BSD people to support the | few GNU specific flags in user land utilities and to add GNU libc | compatibility, than it would be to convince the GNU maintainers | to write good software. | indigodaddy wrote: | If they change this, when might we see it bubble into RHEL? 10? | dahart wrote: | The article and very few comments acknowledge that this is being | done to facilitate removal of these binaries. Assuming the | binaries are going away, is it better to add a warning, or to | surprise people be just removing them? | | In general, there's a good, legitimate, hard question here about | how to handle removing things from our software. It needs to be | done, probably more often than we do it, and it's hard enough for | software writers and maintainers to bring themselves to remove | things. Are there better strategies? What more can we do to make | removing features less painful, beyond publishing the deprecation | schedule, adding a warning in advance, and then removing them | after the schedule and the warning have been out for a while? | kevincox wrote: | I don't think most of the comments are worrying about the | difference between warning or removal. Most of the comments are | about what is wrong with egrep continuing to work perfectly | well as it has for a decade without warning or being removed. | xpressvideoz wrote: | > The egrep and fgrep commands have been deprecated since 2007. | | Isn't 15 years more than enough time to handle the deprecation? | loloquwowndueo wrote: | Sure now that I've finished rebuilding all my dependencies to | use 64-but time_t and migrated all my services to IPv6 I can | finally take some time to finish the great *grep deprecation :) | | I'm just joking :) | ht85 wrote: | To be fair, the pain of migrating time_t is nothing next to | what I will feel trying not to type `fgrep` every time. | Beltalowda wrote: | I betcha most people didn't even know they were considered | "deprecated". | gw99 wrote: | Yes. This is the first I've heard of it and I've got a ton of | scripts that are probably going to break. | LinuxBender wrote: | I learned about the deprecation from ShellCheck [1] that | warns if using egrep instead of `grep -E`. That tool | deprogrammed many of my bad habits. I had never seen any | discussions about it otherwise. | | [1] - https://www.shellcheck.net/ | tmtvl wrote: | That's a cool tool, it's neat seeing Haskell in the wild. | | Unfortunately (or not?) I tend to use actual programming | languages to make my tools rather than doing shell | scripting, so I don't have anything interesting to put in | there, but I'll keep a bookmark of it around. | dspillett wrote: | I for one didn't know they were properly deprecated. | | Though I've not used either since uni over two decades ago1 | on a somewhat off-standard Unix a few of the machines ran, so | until this thread I can't say I was remembering that they | existed at all. | | ---- | | [1] using grep -E when needed since2 | | [2] and presumably grep -F too though I don't remember ever | actually doing that | ozim wrote: | There is so much outdated info on the internet in various | forms that it is hard even to realize what is "proper modern | way" of doing things unless you really are into Linux \ | config stuff. | | I am casual user so I can get around system but modern ways | always surprise me when I finally find out about it. | Beltalowda wrote: | And for all you know "grep -E" isn't supported on some | system people use. This is not really a concern if you're | just writing script for yourself (which are really >90% of | scripts; portability often isn't really a concern), but | knowing it will work on all systems - new and old - is | pretty hard, and sometimes it _does_ matter. Does it work | on NetBSD? HP-UX? Solaris? Last year autoconf changed the | `..` command substitution syntax to the "new" $(..) syntax | and someone complained it broke on their ancient Solaris | system. | | So ... people will stick with what works, like "egrep". | vultour wrote: | Most people shouldn't have been using this in the first | place. If you've been taught to use these in the last ~10 | years then someone, somewhere, has failed horribly. | kibwen wrote: | And now they do, so perhaps it's working as intended. :P | angry_octet wrote: | No. Make install a grep compatibility library if necessary, but | don't change output syntax. | ajross wrote: | Not when the command in question has been a standard part of | all Unix shell environments since 1977, no. Is that a serious | question? | | https://medium.com/@rualthanzauva/grep-was-a-private-command... | | What actually happened here is that POSIX skipped it. It never | entered a standard, even though it was (literally!) in every OS | and available to everyone. But no one cared that it wasn't in | some arbitrary standard, because it was always there. For half | a century! | | I dare say that "fgrep" and "egrep" have more active users | (both interactive and scripted) than "awk" or "ed" or "od" or | "bc", all of which are still around. | shmerl wrote: | ripgrep (rg) is an option. I switched to it for all my grepping | needs. | blacklight wrote: | While I hated the decision of adding warnings without much notice | (which, in the case of such widely used CLI tools, is the | equivalent of a breaking change), I also found an easy solution | that would prevent my scripts from spitting out lots of unneeded | warnings. | | alias egrep='grep -E' alias fgrep='grep -F' | | Now GNU developers can keep doing whatever they're doing, and I | can keep doing whatever I used to do. | acdha wrote: | > While I hated the decision of adding warnings without much | notice (which, in the case of such widely used CLI tools, is | the equivalent of a breaking change) | | 15 years isn't "much notice"? I had already stopped using those | back then because, as noted in the article, they weren't | standardized and so you had to work about portability across | Unix installations. | | It's also worth noting that this is only a breaking change if | you are using the non-standard names in a context where you are | trapping output. For the vast majority of people using a shell | script which doesn't use the common name, they will at some | point upgrade, see the warning, spend 30 seconds making the | change, and never think about it again. If you're that | sensitive to the extra work, presumably you also do some | testing before installing new upstream releases. | | EDIT: it was actually 17 years ago that the warning was added | about egrep/fgrep: | | https://git.savannah.gnu.org/cgit/grep.git/commit/?id=0b4859... | misnome wrote: | Your scripts expand aliases? | koprulusector wrote: | shopt -s expand_aliases | nyuszika7h wrote: | You still have to define the aliases or source your aliases | file in every script though. | superkuh wrote: | Old software remains stable and usable. Updates break software, | remove features, and introduce new exploits. I'll stick with the | old reliable. | kwhitefoot wrote: | Sounds like a non-story to me. fgrep and egrep have been | deprecated for nearly fifteen years and anyone who wants the old | behaviour has only to create a couple of simple script files. | | Any distro that wants to can easily maintain such things. | dncornholio wrote: | Unnecessary potentially breaking change. I'll rest my case. | forty wrote: | While we are discussing common command aliases, could we decide | to make ll (= ls -l) a standard one? I have a hard time using a | shell without it, and it's annoying to create the alias on all | the machines I ssh to ^^ | netfl0 wrote: | Please put it back. | chrismarlow9 wrote: | I started to get really passionately angry about this because I | am an fgrep user. Then I realized I can avoid my blood pressure | spiking by just running a one liner and making a few edits. The | muscle memory might take a while to fix but I'll be better for it | and avoid my day starting off with anger about trivial things. | | sudo grep -rF 'fgrep' / 2>fgrep.rip.stderr.log | tee | fgrep.rip.log | | Goodbye old friend... | drewg123 wrote: | I got this obnoxious whine from egrep on FreeBSD after my latest | update. This post made me look, and I had gnu grep install as a | dependency for something. Once I removed it, sanity is back and | the built-in BSD egrep doesn't whine. | | On FreeBSD, they are all the same: | | $ ls -li /usr/bin/egrep /usr/bin/fgrep /usr/bin/grep | /usr/bin/rgrep | | 281835 -r-xr-xr-x 4 root wheel 30736 Sep 26 14:37 /usr/bin/egrep | | 281835 -r-xr-xr-x 4 root wheel 30736 Sep 26 14:37 /usr/bin/fgrep | | 281835 -r-xr-xr-x 4 root wheel 30736 Sep 26 14:37 /usr/bin/grep | | 281835 -r-xr-xr-x 4 root wheel 30736 Sep 26 14:37 /usr/bin/rgrep | kevans91 wrote: | FWIW, I have no interest in making a similar change to bsdgrep | and I can't imagine anyone else would be compelled to bother, | either. I just don't see the value in removing these historical | names that makes the hassle worth it. | koprulusector wrote: | Thanks for sharing. I feel less silly for suggesting this now | (as root): unalias grep && unalias egrep && | cp "$(command -v grep)" "$(dirname "$(command -v grep)")/egrep | froh wrote: | why no hard link? | Izkata wrote: | I didn't check where they came from, but on Ubuntu 18.04: | egrep, fgrep, and rgrep are shell scripts that call grep with | -E, -F, and -r | drewg123 wrote: | On FreeBSD, it checks the first character of the program name | and modifies behavior based on that. See | https://github.com/freebsd/freebsd- | src/blob/main/usr.bin/gre... | ufo wrote: | The blog makes two main points: 1) adding new error messages | causes compatibility problems; 2) some people are used to typing | "egrep". | | On the first point the author only gives hypothetical examples. I | feel the argument might have been more compelling if we could see | some concrete examples of things that break with GNU Grep 3.8. | | As for the second point, I find it less convincing than the first | one. If it's just the muscle memory then an alias would be an | acceptable workaround. And I doubt that "everyone in the world" | would want such an alias, as the author suggests. | mannykannot wrote: | With regard to the first point, the examples may be | hypothetical, but they are also very plausible. | | When a change has little or no objective benefit, I feel the | burden of demonstrating that it is harmless falls on those | making the change. | | As has been pointed out elsewhere, this is free software and | the maintainers are free to do whatever they like. That does | not stop others having an opinion about it, especially when it | is in the form of constructive criticism. | ufo wrote: | Sure, but it would still be nice to have at least _one_ such | example. Looking at the rest of the discussion thread here on | HN as of now it 's still only hypotheticals. | cestith wrote: | Here's one example. This is in code my team inherited a | long time ago, and there are many more like it. | databases=`find /var/lib/mysql -type d | sed | 's/\/var\/lib\/mysql\///g' | egrep -v | 'mysql|test|performance|schema'` | TillE wrote: | That doesn't do anything with stderr, so it doesn't | break. | [deleted] | cestith wrote: | It does output to STDERR an extra warning. | int_19h wrote: | But that doesn't actually break your script, because | backticks only capture stdout. | cestith wrote: | But it changes the behavior of the script in the UI. It | can cause things like cron to send mail. It can cause | other things wrapped around the script that are capturing | both STDOUT and STDERR from the script to capture extra | content. Any tool that's monitoring STDERR and expecting | it to be empty may consider that an erroneous run, which | may impact other scripted decisions. It's a breaking | change in multiple circumstances, even if you don't | consider extraneous warnings shown to a user manually | running a script a breaking change. | | Does that code look like something you'd log into a | system and manually run on a regular basis? Does it maybe | instead look like one layer of a legacy automation stack | absorbed into other tools? | mannykannot wrote: | It would be even nicer to see convincing evidence that it | is not going to be a problem. | teddyh wrote: | You can't prove a negative. | mannykannot wrote: | There is no largest prime. | teddyh wrote: | Using that model, we can prove conclusively that, since a | behavior has changed (a warning printed), it _might_ | cause problems. Therefore, we _cannot_ prove that it | _cannot_ cause problems. What we would really like, | though, is an _actual_ problem shown to exist. Just like | in mathematics; it's one thing to prove that it's | impossible to prove something could not exist, but | another thing entirely to _show it existing_. | airza wrote: | It seems pretty simple, piping bash commands into other bash | commands and other text stream juggling is a pretty typical use | of these commands and so changing what stream is output can | change the behavior of consumers of the output of these | functions. | | I haven't done anything with fgrep and egrep before but piping | grep into another grep for more complex classes of text search | is something i use a lot. | tuetuopay wrote: | It's more than likely the warning will be printed to stderr, | not out, so there will be no impact on the actual work done. | mannykannot wrote: | Automatically monitoring the stderr from cron jobs for | unusual outputs is a prudent measure, and its plausible | that this change will increase the burden of false | positives (it certainly will not reduce it.) | loloquwowndueo wrote: | But if you're monitoring the output it usually means you | are in a position to fix problems which means you can | likely update the script in question to use the new | warning-less invocation. | mannykannot wrote: | If I had been woken up in the middle of the night or had | a vacation interrupted on account of this, I would not be | entertaining warm and grateful thoughts toward whoever | thought it was a good idea. | ziml77 wrote: | Wouldn't you test before upgrading packages in | production? And usually you'd want to schedule any | upgrades so that the next day or two has coverage from | someone who can deal with any issues that arise. | 0x0 wrote: | What if a cron.monthly or cron.weekly script calls egrep? | Congrats now you get a lot of noise from cron stderr | emails in the distant future. | bad416f1f5a2 wrote: | I have yet to work at a place that didn't have systems | running mission-critical shell scripts with little to no | SDLC on boxes that got periodic "yum update -y"s. There | seems to be a difference in oversight of software we | write & "the operating system". | | Should we do better? Absolutely! Will this burn people if | vendors don't take care? Also absolutely! | guhidalg wrote: | I don't know if I have sympathy for this argument. | | Your script ostensibly handles (at least logs) errors and | warnings right? Do you exhaustively handle every single | error and warning in a unique and different way or do you | have a catchall "If non-0 return code then fail"? How | does introducing new output to stderr affect that? | P5fRxh5kUvp2th wrote: | If you're being woken in the middle of the night over | this then your testing infrastructure is crap. | | This is something that should be caught before it gets to | that point SPECIFICALLY so you aren't getting woken up in | the middle of the night. | mannykannot wrote: | All the replies so far are missing the point: it is | prudent to monitor for unusual events, including | previously-unseen messages, over and above the explicit | handling of specific errors. It is also prudent to not | wait until morning to investigate. | | Your infrastructure probably _is_ crap, as very few | people get to build it themselves from scratch. That does | not mean one should cheerfully accept additional | unnecessary or pedantic complications. | | It would also be prudent to investigate each and every | change to any of the software you use, in order to | anticipate problems, but unnecessary and pedantic changes | increase the burden there, as well. | tuetuopay wrote: | hence why I wrote "actual work done". | | your scripts will continue to produce the expected | output. the side effects, otoh, will change indeed. | carapace wrote: | The simple fact that you have to wonder about that question | _is the failure._ | | Everything about this, even this comment I'm writing right | now, is a waste of time. | koprulusector wrote: | Can confirm: $ egrep '.' < <(grep | --version) > /dev/null egrep: warning: egrep is | obsolescent; using grep -E | cesarb wrote: | It's not unusual in shell scripts to combine stderr with | stdout by using "2>&1" or similar. | int_19h wrote: | It is, however, very unusual to do so and then try to | parse the output. Aside from compilers, what other CLI | tools make any guarantees wrt what they print to stderr? | cestith wrote: | The shell happens to be a programming tool and not just an | interactive command interpreter. There are whole books on how | to write shell scripts portably across various Unix-y | platforms. Many of the examples in those books will now throw | warnings on systems using the GNU tools. | bitofhope wrote: | If a book on writing portable shell scripts across *nix | platforms depends on commands not specified by POSIX, I don't | think those books are doing their job very well. | ajross wrote: | > On the first point the author only gives hypothetical | examples | | I have scripts _everywhere_ , some of them 20 years old or | more, that use fgrep. For years and years it was a "best | practice" thing if you were checking for a fixed string (so | that you didn't accidentally match on a "." or whatever by | forgetting it was a regex). | teddyh wrote: | You have two options: The first option is to simply replace | "fgrep" with "grep -F" everywhere in all your scripts, which | is correct but is more work than your other option, which is | to add your own "fgrep" script somewhere in your path. | | Any of these options seem reasonable to me. | ajross wrote: | OK, are you going to call up all my former employers to | tell them to audit the scripts I wrote for them in the late | 90's? | | I really don't think people understand the impact here. | It's not it's just a bunch of angry geriatric graybeards | yelling at the modern world. It's that there is decades of | uncounted, unrecognized, untraceable software written using | these old conventions that are suddenly changing. | | It's just a terrible idea. Linux cares about conforming to | syscall interfaces for binaries compiled 20 years ago, but | somehow you think it's OK to break scripts that have worked | fine for 50 (fifty!) years? | teddyh wrote: | Either a system is frozen and static, in which case it | will not receive this version of GNU grep, and there is | no problem. On the other hand, if a system receives | updates, the system needs both minor and major changes | _all the time_ , to keep up with its ever-changing | environment. This is the jungle in which we live. Linux | syscalls are important to keep, since it's hard to change | a compiled binary. But it's easy to change a shell | script. | | And don't exaggerate. This won't, in all likelihood, | "break" your scripts. | simoncion wrote: | > This won't, in all likelihood, "break" your scripts. | | Previously: | | > The first option is to simply replace "fgrep" with | "grep -F" everywhere in all your scripts, which is | correct but is more work than your other option, which is | to add your own "fgrep" script somewhere in your path. | script.sh: line 100: fgrep: command not found | | seems like evidence of a broken script to me. The fact | that it can be fixed doesn't make it not broken. | teddyh wrote: | We were discussing _the warning_ printed by fgrep and | egrep, not their removal. I was suggesting that you put a | version of fgrep /egrep in your path which does not show | the warning. | ajross wrote: | That wasn't my take. I thought we were discussing the | deprecation itself. It's true that nothing is broken | yet[1]. But it's clear that "broken" is where we're | going, and I don't think you or the GNU maintainers have | thought through the implications correctly. | | [1] At least, nothing that isn't sensitive to junk on | stderr -- bourne scripts are not always as tolerant as | you'd like. | teddyh wrote: | We were explicitly discussing GNU grep 3.8, which does | not remove anything, only add warnings. And the remote | possibility of breakage due to warnings is why I | qualified my assertion with "in all likelihood". | kcexn wrote: | I'm so confused by this change. fgrep and egrep are already just | shell scripts that are almost just like aliasing grep -E and grep | -F. Why is the GNU team suddenly so worried about these shell | scripts? | | If the maintenance of these scripts is so hard. They could just | deprecate them entirely. It's pretty unlikely that they would | stop working or become insecure anytime soon. And sysadmins would | just source in the aliases into their shell environments | anyway.... | Poiesis wrote: | As a software developer, I have long-since ingrained the behavior | of looking up the documentation before I assume something works | in a particular way. Perhaps doubly so when shell scripting, | where I have to verify if I can rely on a particular package | being present, or the minimum version of something I can expect, | or what the output is guaranteed to be. | | When I was considering using fgrep, I looked it up; lo and | behold, it's not part of the POSIX standard. So I used the option | instead, and have since. | | I'm a little puzzled why people have problems with these little | things when it feels like it's pretty common for tools to change | given enough time (for example, ifconfig and netstat to ip and | ss). It's just essentially an API that gradually refines over | time. | barrkel wrote: | It's not that common for tools that have been around for | decades, and don't have system dependencies (like your network | configuration examples do) to change. | | egrep and fgrep are used on ad hoc command lines daily, and | option alternatives are less convenient to use. I personally | use 'egrep -o' and 'fgrep -f <(...)' all the time. I already | find it tedious to have to type 'sed -r' and am half- | considering wrapping it in an 'esed' variant. | | Eliminating egrep and fgrep is change for the sake of change. | Removing a couple of hard links from a few bin directories | would be the total positive achievement, at the cost of years | of work removing the utilities from scripts - or more likely, | adding the links back, or variants thereof, like shell scripts | which add -E / -F as required. | waffletower wrote: | It is depressing, even sickening how common such exercises in | tunnel-vision vigilantism occur among software engineers. The | same lack of understanding of downstream impacts is found in | library maintainers that use auto-updating transitive | dependencies, for example. | bitofhope wrote: | >I'm definitely not in favor of fossilizing Unix, but there's a | difference between avoiding fossilization and the kind of | minimal, mathematical purity that we see GNU Grep trying to | impose here. | | I can't really see the difference. Adding a deprecation warning | to stderr in a non-POSIX command 15 years after deprecation | notice is among the smallest possible changes to [GNU's Not] Unix | I can think of. Even then, the change is trivially silenced by | deleting a single line in a shell script or two[1] and seems that | some distros already do that for you[2]. | | Yes, this will break something for someone[3] and I might well be | that someone. You truly have my sympathies. But if you want to | run a system for a decade and a half without ever needing | changes, stick to POSIX. You can't have your fossils and eat them | too. | | [1] | https://git.savannah.gnu.org/cgit/grep.git/commit/src/egrep.... | [2] https://github.com/void-linux/void-packages/pull/39340 [3] | https://xkcd.com/1172/ | acdha wrote: | > But if you want to run a system for a decade and a half | without ever needing changes, stick to POSIX. You can't have | your fossils and eat them too. | | ... and test before making major system upgrades. For most | users this won't be arriving until the next major distribution | release and it seems unlikely that this will be the only | visible change in such a move. If it's that big a deal, you | should have a test environment, change management, dedicated | admins, etc. | aftbit wrote: | On my system, egrep and fgrep are _already_ shell scripts, just | changed to add the stupid warning: $ cat =egrep | =fgrep #!/bin/sh cmd=${0##*/} echo "$cmd: | warning: $cmd is obsolescent; using grep -E" >&2 exec | grep -E "$@" #!/bin/sh cmd=${0##*/} echo | "$cmd: warning: $cmd is obsolescent; using grep -F" >&2 | exec grep -F "$@" | | Looking at src/egrep.sh in the git repo[1], I see that before | this warning was added in 2021, the last change was back in 2015. | In fact, since the git repo history began in 1998, there have | been a total of 4 changes to this file. Clearly the maintenance | burden of these scripts is not sufficient to require the | maintainers to drop them. My guess... this is being done out of | some weird sense of purity over practicality. Bad call by Paul | Eggert IMO[2]. | | 1: https://savannah.gnu.org/git/?group=grep | | 2: commit a9515624709865d480e3142fd959bccd1c9372d1 added the | warnings | yjftsjthsd-h wrote: | > cat =egrep =fgrep | | What is that? I can't seem to find it by searching for " =" in | `man bash` | sprremix wrote: | It's a zsh thing. | | 14.7.3 '=' expansion | | If a word begins with an unquoted '=' and the EQUALS option | is set, the remainder of the word is taken as the name of a | command. If a command exists by that name, the word is | replaced by the full pathname of the command. | | From: https://zsh.sourceforge.io/Doc/Release/Expansion.html#g | _t_00... | [deleted] | pwagland wrote: | This is a zsh thing, it's shorthand for: | | cat "$(which egrep)" "$(which fgrep)" | [deleted] | professoretc wrote: | In ZSH `=executable` expands to the full path of | `executable`. | kccqzy wrote: | If you have interacted with Paul Eggert in real life (I have; | he's a professor at UCLA), you would've known that he is a man | that values purity over practicality. Not surprising at all. | Phelinofist wrote: | Is it the same guy that maintains tzdb? | https://lwn.net/Articles/870478/ | kccqzy wrote: | Yes he is. He's a maintainer for a lot of GNU software | including Emacs, sort, etc. | | Running fgrep -U -l -r "Paul Eggert" | /usr/bin | | should turn up quite a few results. (That's of course an | undercount because he doesn't always put his name into | everything he touches.) | ourmandave wrote: | Tangentially, I'm _still_ searching for a grep for Windows you | can run from file explorer. | | I've resorted to right-clicking a command window and using | findstr. =( | | I'm sure there's also a powershell equiv but I haven't taken the | time to walk the PS object tree to find it. | richard_todd wrote: | powershell has `sls` which expands to `Select-String` | im3w1l wrote: | Yet another reason why shellscripts are bad huh. | grnmamba wrote: | How does the article lead to this conclusion? | im3w1l wrote: | People are upset that changing literally anything on the | system like adding a deprecation warning to stderr will break | their fragile shellscript setup. | manv1 wrote: | It's ironic that GNU is using POSIX as a justification for a | decision. | | From RMS: | | Following a standard is important to the extent it serves users. | We do not treat a standard as an authority, but rather as a guide | that may be useful to follow. Thus, we talk about following | standards rather than "complying" with them. See the section Non- | GNU Standards in the GNU Coding Standards. | | We strive to be compatible with standards on most issues because, | on most issues, that serves users best. But there are occasional | exceptions. | | For instance, POSIX specifies that some utilities measure disk | space in units of 512 bytes. I asked the committee to change this | to 1K, but it refused, saying that a bureaucratic rule compelled | the choice of 512. I don't recall much attempt to argue that | users would be pleased with that decision. | | Since GNU's second priority, after users' freedom, is users' | convenience, we made GNU programs measure disk space in blocks of | 1K by default. | | https://opensource.com/article/19/7/what-posix-richard-stall... | bravetraveler wrote: | Just, why? Change for the sake of being noticed? Not getting | enough attention at home? | | Countless tools have figured out how to argv[0] or whatever - the | path of the binary changing the behavior | manv1 wrote: | This only affects linux. All the old AIX/SunOS/Solaris/HP-UX | boxes will never get this update, so luckily it should have 0 | effect on older platforms. | | That makes me feel better, that all the old crap that I've | forgotten about that might be running in production somewhere | will be fine. | | That said, this is a ridiculous move. The only practical effect | of this change is to potentially break millions of scripts, all | for an ideal that, to be frank, nobody gives a shit about. | liveoneggs wrote: | I use egrep and fgrep regularly. I guess I am just getting too | old for GNU. | chubot wrote: | BTW I ONLY use egrep and fgrep !!! | | - egrep means [0-9]+ works like in Perl/Python/JS/PCRE/every | language, not [0-9]\\+ like GNU grep. | | - egrep syntax is consistent with bash [[ $x =~ $pat ]], awk, and | sed -regexp-extended (GNU extension) | | - These are POSIX extended regular expressions. Awk uses them | too. | | - `fgrep` is useful when I want to search for source code | containing operators, without worrying about escaping | | This style makes regular expressions and grep a lot easier to | remember! I want to remember 2 regex syntaxes (shell and every | language), not 3 (grep, awk, every language) ! | | This change should be reverted; there is no point to needless | breakage | | Again you wouldn't remove grep -long-flags because it's not POSIX | throwaway67743 wrote: | Funny, I've never ever used egrep or fgrep in the 20 odd years | I've been operating systems, always preferred explicit flags to | aliases or argv[0] evil. | mrybczyn wrote: | Tool devs should get to decide on functionality - and then it's | up to the distro maintainers to make aliases and organize well | into their distros. Here it seems that the former are encroaching | on the latter, for historical reasons? | | By the way: ~$ bgrep Command 'bgrep' | not found, but there are 20 similar ones. | | There's not many [a-z]grep's left in the alphabet, reserve yours | now :-) | p4bl0 wrote: | I see the problem for scripts, but for people it's just a matter | of setting an alias command, isn't it? | robertlagrant wrote: | > (I'm definitely not in favor of fossilizing Unix, but there's a | difference between avoiding fossilization and the kind of | minimal, mathematical purity that we see GNU Grep trying to | impose here. | | I'm not sure this can be reconciled with "printing a deprecation | warning is a breaking change". | throw10920 wrote: | Hmmm, perhaps "a program's output is part of its interface" | wasn't such a good idea after all... | | If programs communicated with each other using structured | interfaces and not "plain text" (already a misnomer), this would | be a non-issue. ___________________________________________________________________ (page generated 2022-10-13 23:00 UTC)