this post was submitted on 03 May 2024
13 points (63.8% liked)

Linux

48328 readers
632 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

I know that there are ten different alternatives. Why don't we simply improve the basic stuff?

you are viewing a single comment's thread
view the rest of the comments
[–] gnuhaut@lemmy.ml 16 points 6 months ago (1 children)

As others have said, if you quote your variables, they won't get split on spaces. The Unix shell unfortunately has ton of gotchas like this, and the reason this is not changed is backwards-compatibility. Lots of shell scripts depend on this behavior, e.g. there might be something like:

flags="-a -l"
ls $flags

If you quote this (ls "$flags"), ls will see it as one argument, instead of splitting it into two arguments. You could patch the shell to not split arguments by default, and invent some other syntax for when you want this splitting behavior, but that would break a ton of existing shell scripts, and confuse users who are already familiar with the way it works right now. It would also make the shell incompatible with other shells, and violate the POSIX standard.

[–] taladar@sh.itjust.works 3 points 6 months ago (1 children)

The reason for this is not backwards compatibility, the reason is that it would be stupid. Space appears a lot more often in situations where you need a separator than in filenames so why would you make the common case harder to use to save some typing in the edge case?

[–] gnuhaut@lemmy.ml 2 points 6 months ago (1 children)

I disagree. The vast majority of the time when writing shell scripts, I quote variables, because that's almost always what I want. Splitting is basically only useful if you have a list of arguments, and you know for sure there are no spaces in any of the arguments (so no filenames).

(The workarounds in pure POSIX shell are btw super annoying if you want to pass a list arguments that may have spaces in them: You can abuse the special "$@" variable. Or you could probably also construct something with xargs.)

[–] taladar@sh.itjust.works 3 points 6 months ago* (last edited 6 months ago) (1 children)

Every single command, option and argument in the shell is split by spaces, regardless of what it contains. That is clearly the more common case. I am not talking about splitting when the space comes out of a variable but in general, as part of the syntax.

I am well aware of how quoting works to avoid accidental splitting and it is an absolute non-issue in practice once you get used to quoting things, about as annoying as the fact that you have to quote strings in every other programming language, i.e. not at all.

[–] gnuhaut@lemmy.ml 2 points 6 months ago* (last edited 6 months ago)

Ah that's your point. Yeah I agree that splitting literal a b c is convenient. It is surprising to many (like here) that this happens after variable substitution, and that's not very convenient since you almost never want that. You could define this to happen the other way around, but then you'd obviously have to invent a new syntax for explicit splitting, which would be its own kind of annoying.

Edit: YSH (oil) does that btw. See here.