Alt account of @Badabinski

Just a sweaty nerd interested in software, home automation, emotional issues, and polite discourse about all of the above.

  • 0 Posts
  • 26 Comments
Joined 7 months ago
cake
Cake day: June 9th, 2024

help-circle


  • I personally don’t believe there’s a case for it in the scripts I write, but I’ve spent years building the || die habit to the point where I don’t even think about it as I’m writing. I’ll probably edit my post to be a little less absolute, now that I’m awake and have some caffeine in me.

    One other benefit I forgot to mention to explicit error handling is that you get to actually log a useful error message. Being able to rg 'failed to scrozzle foo.* because service y was not available' and immediately find the exact line in the script that failed is so nice. It’s not quite a stack trace with line numbers, but it’s much nicer than what you have with bash by default or with set -e.



  • 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.


  • 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.


  • 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.




  • 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.



  • I’m just some idiot on the internet, but please, put a disclaimer of some sort on this. Polymer fume fever is shitty for people and absolutely hideously lethal for birds. I dunno what the LC50 is for birds, but anecdotally, a bird anywhere in the same building has a nonzero chance of dying. Birds in the same room will die. God knows what all those horrible fluorinated fumes will do to people over the long term, but they make you really sick in the short term.

    Trolling can be funny, but not when it’s encouraging people to do actively hazardous stuff.





  • I apologize, I was rushed and didn’t adequately explain myself. I want to restate the premise on which I made my comment. Israel has a large military and is using it to kill Palestinians right now. I absolutely agree with that. Israel is using weapons provided by the United States, and the transfer of those weapons was authorized by the current Democratic administration. No disagreements there.

    My fear is that the military of the United States will become directly involved in the Palestinian genocide. I am afraid of the much larger and better armed US military actively leveling grid squares filled with Palestinian civilians with missiles. What is happening right now is already monstrous. I want the United States to divest and cease its involvement in this genocide at the bare minimum. I want the United States to directly oppose Israel and stop the genocide, using force if necessary. I very much do not want the United States’ involvement to increase. If Donald Trump is elected, an increase in the use of force against Palestine may happen. That is my argument. I absolutely do not believe that the current administration is doing the right thing here. I hate it, and I want it to stop. I just also don’t want it to get worse.


  • So I’m going to preface this by saying how I feel about the situation. I’m furious that Biden and the Democrats aren’t just… y’know, fucking stopping this shit. I’m furious that the administration isn’t doing more to end the goddamned genocide. It makes me feel sick to think that the executive branch of my country isn’t denouncing what’s happening. The Democrats are supposed to be the party for compassionate people. I consider myself to be a compassionate person, and the Democrats are absolutely failing to represent me.

    I’m sure there’s some realpolitik going on there, but like, realpolitik can suck my asshole when my taxes are paying for bombs and missiles that are being used by a different country in an unjust war to kill innocent people in a genocide.

    Make no mistake, I want this shit to end right the fuck now. I want Israel to fuck off back to their borders. I want the hostages to be traded, I want Palestine to be a full state in the UN with defensive treaties. I want Bibi and the people who enabled him to be tried for crimes against humanity. I want Israel and the United States to pay reparations and to foot the bill for the rebuilding of Palestinian infrastructure.

    I want change. I am tired of the Democrats. Shit, I think there are a lot of people tired of the Republicans. Nobody is happy with the way out system works. I look at other countries with coalition governments and a large number of specific parties and I wish that I could have that. I would absolute love to have a party that represents my values and desires.

    With all that said, I just don’t think that we will be able to enact meaningful change in 30ish days. To enact change within the confines our current system, we would need to convince tens of millions of people to vote for a candidate that truly represents them in that timeframe. Given the constricting nature of our two-party system, I think many people wouldn’t know who that is. I certainly don’t know who would represent me. It certainly wouldn’t be Jill Stein, to provide an example of a third party candidate. I’d vote for Bernie Sanders, but he’s not running for president. His election would require tens of millions to write his name on their ballots.

    Many of the people who don’t feel represented by our government with regards to Palestine currently vote for the Democrats. If we were to all switch in unison and vote for someone who would truly stop this shit, then we could enact our change. I believe that there’s just no way to do that in a month.

    If we try to enact change right now and fail, then we will likely end up with a violent, narcissistic rapist as the head of our government who will continue to implement blatantly christo-fascist policies. Christo-fascists do not like people of the Islamic faith, and Donald Trump has promised to wipe out Palestine if he is elected. He cannot be trusted to act according to what he has previously said (which, speaking from experience, is the fashion of all malignant narcissists who are not being treated for their PD), but there is a chance that he will follow through on his word and will speed up the genocide of the people of Palestine.

    There are two primary candidates. One candidate will likely maintain the monstrous, awful, status quo. The other candidate may or may not direct the most powerful military force in the world to level Palestine and order the destruction of every man, woman, and child within its borders. The former gives the people of Palestine more time while to survive while we try to unfuck our system. It’s not a guarantee, but it’s a chance.

    Earlier, I said that realpolitik can suck my asshole, and that’s what this feels like. It’s shit and I hate it and it makes me feel gross. None of this brings back the lives of those who have already died, and my choice probably wouldn’t really be appreciated by a Palestinian who is trying to survive the bombs I’m paying for. I won’t shame anyone who cannot live with themselves if they vote for Kamala Harris. People are entitled to their beliefs, and living out of compliance with them can be very harmful. However, I feel compelled to at least present an emotional argument against a vote for a 3rd party candidate (or no vote at all) in this specific situation.


  • It very definitely was 😅 The way that company used the satellite network was cool, don’t get me wrong. They would use it to push content out to all their stores with multicast which was really efficient with bandwidth. I loved it for that, but I hated interacting with it over unicast in any way, shape, or form. Horses for courses, as they say.


  • My pain tolerance for shitty input methods has been permanently warped after experiencing psychic damage from using Teamviewer to connect to a system over a very flaky HughesNet satellite link. I was working for a vendor that supplied a hardware networking box to a stupid retail company that sells food and shit. I just wanted to ssh to our boxen on a specific network so I could troubleshoot something, but the only way I could get to it was via putty installed on an ancient Windows XP desktop on the same network as our box that could only be accessed with Teamviewer. My favorite part of that was that the locale or something was fucked up, so my qwerty keyboard inputs were, like, fucking transformed into azerty somehow?? The Windows desktop was locked down and monitored to a tremendous degree, so I couldn’t change anything. The resolution was terrible, the latency was over a second, and half of my keyboard inputs turned into gibberish on the other side.

    Oh, and I was onsite at that same company’s HQ doing a sales engineering call while I was trying to figure out what was wrong. I spent 5 days sitting in spare offices with shitty chairs, away from my family, living that fucking nightmare before I finally figured out what was wrong. God damn, what a fucking mess that was. For anyone reading this, NEVER WORK FOR GROCERY/DRUG STORE IT. They are worse than fucking banks in some ways. Fuck.

    EDIT: also, I asked ‘why Teamviewer’ and the answer was always shrugs. This was before the big TeamViewer security incidents, so maybe they thought it was more secure? Like, at least they didn’t expose RDP on the internet…


  • Having been in this situation (the only binary I could use was bash, although cd was a bash builtin for me), echo * is your friend. Even better is something like this:

    get_path_type() {
        local item
        item="$1"
        [[ -z "$item" ]] && { echo 'wrong arg count passed to get_path_type'; return 1; }
        if [[ -d "$item" ]]; then
            echo 'dir'
        elif [[ -f "$item" ]]; then
            echo 'file'
        elif [[ -h "$item" ]]; then
            echo 'link'  # not accurate, but symlink is too long
        else
            echo '????'
        fi
    }
    
    print_path_listing() {
        local path path_type
        path="$1"
        [[ -z "$path" ]] && { echo 'wrong arg count passed to print_path_listing'; return 1; }
        path_type="$(get_path_type "$path")"
        printf '%s\t%s\n' "$path_type" "$path"
    }
    
    ls() {
        local path paths item symlink_regex
        paths=("$@")
        if ((${#paths[@]} == 0)); then
            paths=("$(pwd)")
        fi
        shopt -s dotglob
        for path in "${paths[@]}"; do
            if [[ -d "$path" ]]; then
                printf '%s\n' "$path"
                for item in "$path"/*; do
                    print_path_listing "$item"
                done
            elif [[ -e "$path" ]]; then
                print_path_listing "$path"
            printf '\n'
            fi
        done
    }
    

    This is recreated from memory and will likely have several nasty bugs. I also wrote it and quickly tested it entirely on my phone which was a bit painful. It should be pure bash, so it’ll work in this type of situation.

    EDIT: I’m bored and sleep deprived and wanted to do something, hence this nonsense. I’ve taken the joke entirely too seriously.