this post was submitted on 15 Jan 2025
641 points (98.2% liked)

linuxmemes

23930 readers
230 users here now

Hint: :q!


Sister communities:


Community rules (click to expand)

1. Follow the site-wide rules

2. Be civil
  • Understand the difference between a joke and an insult.
  • Do not harrass or attack users for any reason. This includes using blanket terms, like "every user of thing".
  • Don't get baited into back-and-forth insults. We are not animals.
  • Leave remarks of "peasantry" to the PCMR community. If you dislike an OS/service/application, attack the thing you dislike, not the individuals who use it. Some people may not have a choice.
  • Bigotry will not be tolerated.
  • 3. Post Linux-related content
  • Including Unix and BSD.
  • Non-Linux content is acceptable as long as it makes a reference to Linux. For example, the poorly made mockery of sudo in Windows.
  • No porn. Even if you watch it on a Linux machine.
  • 4. No recent reposts
  • Everybody uses Arch btw, can't quit Vim, <loves/tolerates/hates> systemd, and wants to interject for a moment. You can stop now.
  • 5. πŸ‡¬πŸ‡§ Language/язык/Sprache
  • This is primarily an English-speaking community. πŸ‡¬πŸ‡§πŸ‡¦πŸ‡ΊπŸ‡ΊπŸ‡Έ
  • Comments written in other languages are allowed.
  • The substance of a post should be comprehensible for people who only speak English.
  • Titles and post bodies written in other languages will be allowed, but only as long as the above rule is observed.
  • 6. (NEW!) Regarding public figuresWe all have our opinions, and certain public figures can be divisive. Keep in mind that this is a community for memes and light-hearted fun, not for airing grievances or leveling accusations.
  • Keep discussions polite and free of disparagement.
  • We are never in possession of all of the facts. Defamatory comments will not be tolerated.
  • Discussions that get too heated will be locked and offending comments removed.
  •  

    Please report posts and comments that break these rules!


    Important: never execute code or follow advice that you don't understand or can't verify, especially here. The word of the day is credibility. This is a meme community -- even the most helpful comments might just be shitposts that can damage your system. Be aware, be smart, don't remove France.

    founded 2 years ago
    MODERATORS
     

    Explanation for newbies:

    • Shell is the programming language that you use when you open a terminal on linux or mac os. Well, actually "shell" is a family of languages with many different implementations (bash, dash, ash, zsh, ksh, fish, ....)

    • Writing programs in shell (called "shell scripts") is a harrowing experience because the language is optimized for interactive use at a terminal, not writing extensive applications

    • The two lines in the meme change the shell's behavior to be slightly less headache-inducing for the programmer:

      • set -euo pipefail is the short form of the following three commands:
        • set -e: exit on the first command that fails, rather than plowing through ignoring all errors
        • set -u: treat references to undefined variables as errors
        • set -o pipefail: If a command piped into another command fails, treat that as an error
      • export LC_ALL=C tells other programs to not do weird things depending on locale. For example, it forces seq to output numbers with a period as the decimal separator, even on systems where coma is the default decimal separator (russian, dutch, etc.).
    • The title text references "posix", which is a document that standardizes, among other things, what features a shell must have. Posix does not require a shell to implement pipefail, so if you want your script to run on as many different platforms as possible, then you cannot use that feature.

    (page 2) 47 comments
    sorted by: hot top controversial new old
    [–] lemming741@lemmy.world 33 points 2 months ago (2 children)
    [–] Badabinski@kbin.earth 8 points 2 months ago

    Lol, I love that someone made this. What if your input has newlines tho, gotta use that NUL terminator!

    God, I wish more tools had nice NUL-separated output. Looking at you, jq. I dunno why this issue has been open for so long, but it hurts me. Like, they've gone back and forth on this so many times...

    load more comments (1 replies)
    [–] Integrate777@discuss.online -2 points 2 months ago (2 children)
    [–] renzev@lemmy.world 13 points 2 months ago* (last edited 2 months ago) (1 children)

    No, sorry. I'm a python dev and I love python, but there's no way I'm using it for scripting. Trying to use python as a shell language just has you passing data across Popen calls with a sea of .decode and .encode. You're doing the same stuff you would be doing in shell, but with a less concise syntax. Literally all of python's benefits (classes, types, lists) are negated because all of the tools you're using when writing scripts are processing raw text anyway. Not to mention the version incompatibility thing. You use an f-string in a spicy way once, and suddenly your "script" is incompatible with half of all python installations out there, which is made worse by the fact that almost every distro has a very narrow selection of python versions available on their package manager. With shell you have the least common denominator of posix sh. With Python, some distros rush ahead to the latest release, while other hang on to ancient versions. Even print("hello world") isn't guaranteed to work, since some LTS ubuntu versions still have python pointing to python2.

    The quickest cure for thinking that Python "solves" the problems of shell is to first learn good practices of shell, and then trying to port an existing shell script to python. That'll change your opinion quickly enough.

    load more comments (1 replies)
    load more comments (1 replies)
    [–] 30p87@feddit.org 11 points 2 months ago (2 children)

    I didn't know the locale part...

    [–] mrvictory1@lemmy.world 4 points 2 months ago

    I had os-prober fail if locale was Turkish, the seperator thing could explain that.

    [–] renzev@lemmy.world 12 points 2 months ago

    I learned about it the hard way lol. seq used to generate a csv file in a script. My polish friend runs said script, and suddenly there's an extra column in the csv...

    [–] Phoenix3875@lemmy.world 9 points 2 months ago (1 children)

    A lot of people call set -euo pipefail the "strict mode" for bash programming, as a reference to "use strict"; in JavaScript.

    In other words, always add this if you want to stay sane unless you're a shellcheck user.

    [–] Badabinski@kbin.earth 9 points 2 months ago

    People call set -euo pipefail strict mode but, it's just another footgun in a language full of footguns. Shellcheck is a fucking blessing from heaven though. I wish I could forcibly install it on every developer's system.

    [–] Badabinski@kbin.earth 93 points 2 months ago (6 children)

    set -euo pipefail is, in my opinion, an antipattern. This page does a really good job of explaining why. pipefail is occasionally useful, but should be toggled on and off as needed, not left on. IMO, people should just write shell the way they write go, handling every command that could fail individually. it's easy if you write a die function like this:

    die () {
      message="$1"; shift
      return_code="${1:-1}"
      printf '%s\n' "$message" 1>&2
      exit "$return_code"
    }
    
    # we should exit if, say, cd fails
    cd /tmp || die "Failed to cd /tmp while attempting to scrozzle foo $foo"
    # downloading something? handle the error. Don't like ternary syntax? use if
    if ! wget https://someheinousbullshit.com/"$foo"; then
      die "failed to get unscrozzled foo $foo"
    fi
    

    It only takes a little bit of extra effort to handle the errors individually, and you get much more reliable shell scripts. To replace -u, just use shellcheck with your editor when writing scripts. I'd also highly recommend https://mywiki.wooledge.org/ as a resource for all things POSIX shell or Bash.

    [–] Aquila@sh.itjust.works 15 points 2 months ago* (last edited 2 months ago) (1 children)

    Putting or die β€œblah blah” after every line in your script seems much less elegant than op’s solution

    [–] Badabinski@kbin.earth 13 points 2 months ago (4 children)

    The issue with set -e is that it's hideously broken and inconsistent. Let me copy the examples from the wiki I linked.


    Or, "so you think set -e is OK, huh?"

    Exercise 1: why doesn't this example print anything?

    #!/usr/bin/env bash
    set -e
    i=0
    let i++
    echo "i is $i"
    

    Exercise 2: why does this one sometimes appear to work? In which versions of bash does it work, and in which versions does it fail?

    #!/usr/bin/env bash
    set -e
    i=0
    ((i++))
    echo "i is $i"
    

    Exercise 3: why aren't these two scripts identical?

    #!/usr/bin/env bash
    set -e
    test -d nosuchdir && echo no dir
    echo survived 
    
    #!/usr/bin/env bash
    set -e
    f() { test -d nosuchdir && echo no dir; }
    f
    echo survived
    

    Exercise 4: why aren't these two scripts identical?

    set -e
    f() { test -d nosuchdir && echo no dir; }
    f
    echo survived
    
    set -e
    f() { if test -d nosuchdir; then echo no dir; fi; }
    f
    echo survived
    

    Exercise 5: under what conditions will this fail?

    set -e
    read -r foo < configfile
    

    And now, back to your regularly scheduled comment reply.

    set -e would absolutely be more elegant if it worked in a way that was easy to understand. I would be shouting its praises from my rooftop if it could make Bash into less of a pile of flaming plop. Unfortunately , set -e is, by necessity, a labyrinthian mess of fucked up hacks.

    Let me leave you with a allegory about set -e copied directly from that same wiki page. It's too long for me to post it in this comment, so I'll respond to myself.

    [–] Badabinski@kbin.earth 9 points 2 months ago (1 children)

    From https://mywiki.wooledge.org/BashFAQ/105

    Once upon a time, a man with a dirty lab coat and long, uncombed hair showed up at the town police station, demanding to see the chief of police. "I've done it!" he exclaimed. "I've built the perfect criminal-catching robot!"

    The police chief was skeptical, but decided that it might be worth the time to see what the man had invented. Also, he secretly thought, it might be a somewhat unwise move to completely alienate the mad scientist and his army of hunter robots.

    So, the man explained to the police chief how his invention could tell the difference between a criminal and law-abiding citizen using a series of heuristics. "It's especially good at spotting recently escaped prisoners!" he said. "Guaranteed non-lethal restraints!"

    Frowning and increasingly skeptical, the police chief nevertheless allowed the man to demonstrate one robot for a week. They decided that the robot should patrol around the jail. Sure enough, there was a jailbreak a few days later, and an inmate digging up through the ground outside of the prison facility was grabbed by the robot and carried back inside the prison.

    The surprised police chief allowed the robot to patrol a wider area. The next day, the chief received an angry call from the zookeeper. It seems the robot had cut through the bars of one of the animal cages, grabbed the animal, and delivered it to the prison.

    The chief confronted the robot's inventor, who asked what animal it was. "A zebra," replied the police chief. The man slapped his head and exclaimed, "Curses! It was fooled by the black and white stripes! I shall have to recalibrate!" And so the man set about rewriting the robot's code. Black and white stripes would indicate an escaped inmate UNLESS the inmate had more than two legs. Then it should be left alone.

    The robot was redeployed with the updated code, and seemed to be operating well enough for a few days. Then on Saturday, a mob of children in soccer clothing, followed by their parents, descended on the police station. After the chaos subsided, the chief was told that the robot had absconded with the referee right in the middle of a soccer game.

    Scowling, the chief reported this to the scientist, who performed a second calibration. Black and white stripes would indicate an escaped inmate UNLESS the inmate had more than two legs OR had a whistle on a necklace.

    Despite the second calibration, the police chief declared that the robot would no longer be allowed to operate in his town. However, the news of the robot had spread, and requests from many larger cities were pouring in. The inventor made dozens more robots, and shipped them off to eager police stations around the nation. Every time a robot grabbed something that wasn't an escaped inmate, the scientist was consulted, and the robot was recalibrated.

    Unfortunately, the inventor was just one man, and he didn't have the time or the resources to recalibrate EVERY robot whenever one of them went awry. The robot in Shangri-La was recalibrated not to grab a grave-digger working on a cold winter night while wearing a ski mask, and the robot in Xanadu was recalibrated not to capture a black and white television set that showed a movie about a prison break, and so on. But the robot in Xanadu would still grab grave-diggers with ski masks (which it turns out was not common due to Xanadu's warmer climate), and the robot in Shangri-La was still a menace to old televisions (of which there were very few, the people of Shangri-La being on the average more wealthy than those of Xanadu).

    So, after a few years, there were different revisions of the criminal-catching robot in most of the major cities. In some places, a clever criminal could avoid capture by wearing a whistle on a string around the neck. In others, one would be well-advised not to wear orange clothing in certain rural areas, no matter how close to the Harvest Festival it was, unless one also wore the traditional black triangular eye-paint of the Pumpkin King.

    Many people thought, "This is lunacy!" But others thought the robots did more good than harm, all things considered, and so in some places the robots are used, while in other places they are shunned.

    The end.

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

    This is great and thanks for taking the time to enlighten us πŸ˜„

    load more comments (1 replies)
    load more comments (3 replies)
    [–] fmstrat@lemmy.nowsci.com 3 points 2 months ago (1 children)

    Yup, and set -e can be used as a try/catch in a pinch (but your way is cleaner)

    [–] Badabinski@kbin.earth 7 points 2 months ago (1 children)

    I was tempted for years to use it as an occasional try/catch, but learning Go made me realize that exceptions are amazing and I miss them, but that it is possible (but occasionally hideously tedious) to write software without them. Like, I feel like anyone who has written Go competently (i.e. they handle every returned err on an individual or aggregated basis) should be able to write relatively error-handled shell. There are still the billion other footguns built directly into bash that will destroy hopes and dreams, but handling errors isn't too bad if you just have a little die function and the determination to use it.

    [–] MajorHavoc@programming.dev 4 points 2 months ago (1 children)

    "There are still the billion other footguns built directly into bash that will destroy hopes and dreams, but"

    That's well put. I might put that at the start of all of my future comments about bash in the future.

    load more comments (1 replies)
    [–] renzev@lemmy.world 31 points 2 months ago

    I've been meaning to learn how to avoid using pipefail, thanks for the info!

    load more comments (3 replies)
    [–] LordPassionFruit@lemm.ee 5 points 2 months ago (2 children)

    I have written 5 shell scripts ever, and only 1 of them has been more complex than "I want to alias this single command"

    I can't imagine being an actual shell dev

    [–] marcos@lemmy.world 4 points 2 months ago (1 children)

    only 1 of them has been more complex than β€œI want to alias this single command”

    I have some literal shell aliases that took me hours to debug...

    [–] LordPassionFruit@lemm.ee 1 points 2 months ago (1 children)
    load more comments (1 replies)
    load more comments (1 replies)
    [–] smeg@feddit.uk 22 points 2 months ago (6 children)

    Shell is great, but if you're using it as a programming language then you're going to have a bad time. It's great for scripting, but if you find yourself actually programming in it then save yourself the headache and use an actual language!

    [–] dohpaz42@lemmy.world 22 points 2 months ago (1 children)
    [–] smeg@feddit.uk 17 points 2 months ago (1 children)

    Your scientists were so preoccupied with whether they could, they didn’t stop to think if they should

    [–] Badabinski@kbin.earth 10 points 2 months ago

    Honestly, the fact that bash exposes low level networking primitives like a TCP socket via /dev/TCP is such a godsend. I've written an HTTP client in Bash before when I needed to get some data off of a box that had a fucked up filesystem and only had an emergency shell. I would have been totally fucked without /dev/tcp, so I'm glad things like it exist.

    EDIT: oh, the article author is just using netcat, not doing it all in pure bash. That's a more practical choice, although it's way less fun and cursed.

    EDIT: here's a webserver written entirely in bash. No netcat, just the /bin/bash binary https://github.com/dzove855/Bash-web-server

    [–] xintrik@lemm.ee 9 points 2 months ago (1 children)

    The few times I've used shell for programming it was in strict work environments where anything compiled was not allowed without a ton of red tape.

    [–] smeg@feddit.uk 5 points 2 months ago (1 children)

    Wouldn't something interpreted like python be a better solution?

    [–] Gork@lemm.ee 4 points 2 months ago (1 children)

    For more complicated input/output file handling, certainly.

    Little shell scripts do great though if all you need to do is concatenate files by piping them.

    It's like the Internet, it's not one big truck but a series of tubes.

    [–] smeg@feddit.uk 4 points 2 months ago (1 children)

    Yep, in my mind piping together other commands is scripting not programming, exactly what shell scripts are for!

    load more comments (1 replies)
    [–] renzev@lemmy.world 10 points 2 months ago* (last edited 2 months ago) (1 children)

    Alpine linux, one of the most popular distros to use inside docker containers (and arguably good for desktop, servers, and embedded) is held together by shell scripts, and it's doing just fine. The installer, helper commands, and init scripts are all written for busybox sh. But I guess that falls under "scripting" by your definition.

    [–] Petter1@lemm.ee 5 points 2 months ago (1 children)

    Aka busybox in disguise πŸ₯Έ

    load more comments (2 replies)
    [–] vk6flab@lemmy.radio 334 points 2 months ago (2 children)

    Gotta love a meme that comes with a man page!

    [–] ryedaft@sh.itjust.works 36 points 2 months ago (1 children)

    This is much better than a man page. Like, have you seen those things?

    [–] marcos@lemmy.world 12 points 2 months ago (3 children)

    I really recommend that if you haven't, that you look at the Bash's man page.

    It's just amazing.

    [–] felbane@lemmy.world 8 points 2 months ago

    I think you mean amanzing.

    I'll see myself out.

    load more comments (2 replies)
    [–] driving_crooner@lemmy.eco.br 113 points 2 months ago (1 children)

    People say that if you have to explain the joke then it's not funny. Not here, here the explanation is part of the joke.

    load more comments (1 replies)
    load more comments