News for hackers. Stuff that matters.
Re:Bash_unit – bash unit testing framework by disgruntledphd2 on Tuesday March 02, 2021 @07:36AM (#26314647)
The trouble is that bash is necessary to setup python. For instance, the lingua franca of Docker is bash (well sh, but you should obviously change that).

I've been resisting learning (any more) bash for a while now, but I think I'm going to have to. This looks like it could reduce some of my terror at the insanities of shell scripts (why does one even need two quote characters that do different things?)

Re:Bash_unit – bash unit testing framework by unkulunkulu on Tuesday March 02, 2021 @08:58AM (#26315341)
Ruby has two kinds of quotes as well (interpolating and non-interpolating), but that must be borrowed from sh
Re:Bash_unit – bash unit testing framework by HeckFeck on Tuesday March 02, 2021 @09:08AM (#26315440)
I'd wager Ruby borrowed from Perl, which was the original borrower from sh.
Re:Bash_unit – bash unit testing framework by wilsonrocks on Tuesday March 02, 2021 @09:51AM (#26315878)
Js has 3 quotes, of which 2 do the same, and the remaining one does two different things...
Re:Bash_unit – bash unit testing framework by disgruntledphd2 on Tuesday March 02, 2021 @12:40PM (#26317933)
And that's another language I've been avoiding learning ;)
Re:Bash_unit – bash unit testing framework by pdkl95 on Tuesday March 02, 2021 @01:35PM (#26318671)
edit: minor bugfix in example code

A couple recommendations that make bash a much saner and avoid entire classes of problems:

First, whenever you are expanding a list of args, use "$@"! That exact four character sequence expands to the properly quoted positional params ("$1" "$2" ...) with any necessary escaping included so each param expands as a single word. Almost all of the problems you've probably heard about bash "not handling spaces properly" or otherwise having problems with whitespace or strange characters in filenames are fixed by using "$@". If you're using arrays/hashes, you can get the same effect using "${somearrayorhash[@]}" (quotes included, just like "$@"). Removing the quotes or using the tradition $* is almost always a bug.

Second, always use explicit quotes/brackets! Forget that they were ever optional. Using "$@" fixes most of the whitespace-in-filename problems; expanding your variables with explicit quotes fixes the rest. Assuming these:

    showargs() { 
        echo "$# args"
        for i in "$@" ; do
            echo "arg[${i}]"
        done
    }
    declare -- name="filename with spaces\\!.txt"
    declare -A h='([a]="b c" [foo]="'\''bar'\'' \"baz\" qu*x" )'
Instead of using the traditional shortcuts (which cause problems):

    showargs $name
    # 3 args
    # arg[filename]
    # arg[with]
    # arg[spaces\!.txt]

    showargs ${h[*]}   # or ${h[@]}
    # 7 args
    # arg[b]
    # arg[c]
    # arg['bar']
    # arg["baz"]
    # arg[qu*x]
Always using quotes/brackets simply does the right thing:

    showargs "${name}"
    # 1 args
    # arg[filename with spaces\!.txt]

    showargs "${h[@]}"
    # 2 args
    # arg[b c d e]
    # arg['bar' "baz" qu*x]
Bash still has it quirks and strange historical baggage, but in my experi4nce, using these two rules (and actually taking the time to read the bash(1) manpage...) changed writings shell scripts from an annoying mess of buggy arcane incantations into an actually sane(-ish) programming language.
Re:Bash_unit – bash unit testing framework by sethammons on Tuesday March 02, 2021 @07:44AM (#26314697)
One set of quotes (double quotes) allows for interpolation of commands/variables. Try:

  $ echo ‘pwd’
  $ echo “pwd”
Re:Bash_unit – bash unit testing framework by mauvehaus on Tuesday March 02, 2021 @07:55AM (#26314786)
You're right, but it's neither of those for command interpolation. Double quotes enable variable expansion, single quotes do not. Command interpolation is back quotes, which is a carryover from sh. The more modern bash way is as follows:

   $ echo $(pwd)
Incidentally: how does one type back quotes on an iPhone?!

Edited to add: shellcheck [0] will flag the back quote usage if you're writing a bash script instead of a sh script.

[0] https://www.shellcheck.net/

Re:Bash_unit – bash unit testing framework by justusthane on Tuesday March 02, 2021 @08:01AM (#26314836)
Longpress single-quote.
Re:Bash_unit – bash unit testing framework by mauvehaus on Tuesday March 02, 2021 @08:08AM (#26314889)
That ... lacks discoverability.

`Thank you`!

Re:Bash_unit – bash unit testing framework by sethammons on Tuesday March 02, 2021 @11:10AM (#26316778)
Like most iPhone tips. How was I to discover long press space bar for cursor placement?! I like it, but discoverability...
Re:Bash_unit – bash unit testing framework by Tsiklon on Tuesday March 02, 2021 @11:36AM (#26317107)
It was much better on the 3D Touch equipped models, press “through” the keyboard to get cursor placement, press “through” again while on a word to select the whole word.
Re:Bash_unit – bash unit testing framework by bewuethr on Tuesday March 02, 2021 @01:38PM (#26318714)
ShellCheck always points out backticks as "legacy".
Re:Bash_unit – bash unit testing framework by sethammons on Tuesday March 02, 2021 @11:10AM (#26316782)
Thanks for the correction