 Now, if you're a Linux user, and first off, of course, you know that it's GNU slash Linux, but if you're a GNU slash Linux user, you probably know that Linux is the kernel, and GNU is the set of utilities and other things that go into the operating system, the programs like LS, Cat, Grep, SED, AUK, all those programs are GNU programs. Now, of course, there are, those programs are actually just UNIX programs generally that the GNU project rewrote for the GNU slash Linux operating system. But why do I bring this up? I bring this up because once you really get into scripting, it's important to realize that GNU's version of SED or GNU's version of AUK or Grep or anything else are not exactly the same as SED or AUK or those other programs on other computers. And this is something that has bitten me in the butt a couple of times recently, so I'm going to show you some examples of this and we'll talk about it. So first off, I actually have this page pulled up on my computer here. It's CatV. I don't know if you're familiar with it. This is the site from which the SED 11Q meme comes from. But one of the things here, they list out things they consider harmful. One of those is the GNU core utils. And they recommend you should use plan nine from user space, which frankly I don't do, I use the GNU core utils. But why do they recommend against the GNU core utils? Okay, and again, we're just talking about typical commands like LS and CAT and AUK and SED and stuff like that. Which of course you can read the manuals for if you want, but I expect if you've done scripting, you've at least dealt with some of these programs. Okay, so basically to put it in simple terms, GNU when they wrote all these programs, they added in a bunch of stuff that is not strictly part of the POSIX compliant UNIX operating system. So they added in a bunch of other options. Nearly everything that has, actually, I think, pretty much literally everything that has two hyphens in front of it is a GNU option. And they also changed a lot of stuff about different commands. Let me give you one example. I'm in the manual for SED now. I'm gonna give you an example with SED. So I'm gonna open up just a blank file. I'm gonna say this is a file and among other files, okay? That's gonna be all that's in this file. I'm gonna save that and quit. So SED, of course, is a stream editor and we can give it commands to change some kind of stream be that a file or standard input or something. So I'm gonna give a SED command. I'm gonna say substitute the sequence file with capital file, okay? And I'm gonna give it this file as the input, the file that I just created. Now, when I do that, you'll see that it prints out this is a file among other files, now file has been capitalized. That's all the SED command did. Now, of course, if we look at the output of file again, we see that the file itself didn't change. It was only said that changed the output. That's how SED works in every operating system. But if you're a GNU user, if you use GNU Linux or the GNU Core Utils, you know that there's a nice little option in GNU. Let's say I want to actually change this file. Well, there's a nice convenient little option where we can take SED and we can give it the I option. And if I run it, you'll see that there is no output whatsoever. Nothing seemed to have happened. But if we actually show the file contents, again, we see that the file has actually been modified. We see that instead of outputting that stream, it's changed the file that went into it. So that's what the I option does. Now, if you're a GNU user and you use SED, you have probably used this a million times. But the thing is this particular option is totally different on other operating systems. If you go to BSD and you take one of your scripts with this in it and put it on a BSD machine, it's not going to work. Or, you know, probably realistically more importantly, I've had a bunch of scripts that Mac users have used. Mac, of course, does not have this exact same option. So it's not going to work. So what you do on other, let's take the example of BSD, which BSD Core Utils, they actually have some additions as well. I'll go ahead and say, actually I think I have pulled up on another window, yeah. So if you go to the, this is like the Plan 9 Unix Utilities. If you actually look at their manuals, they are much more restricted in the kind of things that they actually have. So if I want to, oops, let me open up the SED here. If I open up this manual for their SED, you'll see there's actually no I option. You can search for it. It's not there. The only options you have here, I mean, these are just SED commands there, but the only options you have are E, F, and GLN. OK, and those do different things. So the Strictly POSIX compliant tools are a subset of the GNU stuff or the BSD stuff. And GNU usually has way more than anything else. So just hypothetically speaking, let's take this example that we have. Again, we've changed this file. Let's say I want to change capital file back. How would I do this on BSD? So on BSD, you actually do have the I option, but it works very differently. You don't just modify something in place. That's not what it does on BSD. What it does there is you basically have to say, well, first off, let me change this command so it changes capital file to lowercase file. What you have to do is you have to specify something like this. I'm going to say BU at the end of that. You could put any kind of strings just as long as it's after I. And if you run that, you will see, in fact, that your file has changed back to normal. But what it's done here specifically is that it has created a file. It's created a file called File BU. And this BU actually comes from the BU here. So on, well, let's go ahead and open it up. And you'll see, oops, that's file. I'll open up File BU. And you'll see that it is sort of a backup file. Basically what it does is it copies a backup file. Again, we gave it the characters BU. And it starts from that, and it overwrites the other file. So that's what you have to do in BSD. But when you're looking at narrowly POSIX compliant utilities like on Plan 9, you don't have this option at all. So if you want to do it, you basically have to, I mean, there might be someone who's more familiar with these utilities, might know a more elegant way. But I suppose the way you do it is you have to take the said command without an option, output it to a file, and then rewrite the original file or move it or something like that. I'm not exactly sure the most efficient way to do it. But this is actually something in particular that's bothered me recently. When I put out my mutt wizard, I had said I commands all over the place, not said I BU or something like that. But I had said commands all over the place. And if you're using GNU utilities, or well, since you're working with GNU utilities, on other operating systems, that just is not going to work. So you have to do some. And the annoying thing, the thing that is most annoying about this, is that they don't really say in the GNU said manual or any other ones that an option is different in a different operating system or is a little bit more than POSIX or something like that. You just sort of have to figure it out now. Of course, aside from this, this is one practical reason. So this is one practical reason why GNU is bloat. And of course, I use GNU. I'm going to continue to use GNU so long as I use GNU Linux. But realistically speaking, when you're writing scripts, you have to be mindful. You have to be running them on other machines with other utilities. Or for example, downloading plan nine utilities and running your scripts with that. If you plan on them being portable, if you plan on them being able to function on macOS or BSD, you should probably either know what is special about GNU or just be able to test them on there. Because again, they don't say. And actually, come to think of it. Cat V. I don't think I mentioned before Cat V this site. It actually comes from the fact that the cat command. I think narrowly POSIX compliant cat does not have any kind of options whatsoever. Why does it keep doing that? I've got to fix my LF. It does not have any kind of options at all, looks like. Yeah. But in GNU cat or in other versions of cat, what you can do is let me give you an example of this. So I'm going to output a file that has a bunch of emojis in it with cat. So that prints it all to your screen. But cat has this option cat V. And that, basically, it prevents characters from messing up your terminal if they're not compatible. So you'll see that they actually are all the emoji characters or font awesome characters are actually replaced with some other sequences. Now, of course, one of the reasons, you might be like, OK, what's wrong with having this extra feature? Oh, maybe it's more source code. In fact, GNU utilities are always bigger in terms of source code than any other kind of utilities. But what's so bad about this? And for them, of course, I'm not endorsing this viewpoint. But for them, at least, the purpose of cat, for example, weirdly enough nowadays, you think of cat as being the program that outputs a file to your terminal when you want to look at it. But technically speaking, cat is really supposed to concatenate files. Like you give it five different files and it prints the output of all those files as if they were one. And you can do something with that. So cat being used for showing things visually or look at all the GNU cat options. Again, the POSIX compliant cat has basically nothing or literally no options itself. But GNU cat has all these different options. And of course, if you are writing a script that has any of these options for your GNU Linux system, as soon as you go anywhere else, everything's going to break down. So you have to be careful about it. Or sometimes it's like the said I thing. And it works differently. If you run just said I without anything after it on BSD without anything right after it, I'm pretty sure it just gives an error or something like that. But it's just not going to work. But either way, so this is what I wanted to throw out there. This is an addendum to my video last week about bash being bloated. So when you need to write something that is portable, just be a little mindful about what is a GNUism and what isn't. But anyway, that's about it. And I'll see you guys next time.