Bash Infinity: A standard library and a boilerplate framework for Bash
github.com
github.com
Then you just ship the bash script with no dependencies. The transpiler might even be smart enough to take GNU/BSD differences into account.... ahh another project idea that I do not have time to implement :(
EDIT: Apparently there is one and it is even the language I would have problem implemented the compiler in (OCaml) [1] . It is shame though it doesn't seem to have much functionality other than checking if files exist and string manipulation. If they had just focused exclusively on Bash/coreutils (and Powershell for windows) they could probably add a lot more features.... Windows seems to be holding them back.
You're not constrained by the browser only supporting JavaScript here.
Some even constrain the scripts to sh, so that even bash isn't a dependency and you can run on e.g. OpenWRT.
Real shame, something like this is incredibly useful.
[0] https://www.gnu.org/software/autoconf/manual/autoconf-2.62/h...
Anytime I find myself wishing I had arrays, or real data types, or real functions, I stop using shell languages immediately. Shell scripts are really only suitable for the exact same sorts of things I would type myself at a Unix prompt...and since those sorts of things are rarely more than a few lines long, shell scripts shouldn't be longer than that either.
The nice thing about shell languages (like sh and to some extent bash) is they run everywhere with minimum dependancies. This makes them great for things like build environment configuration. Those scripts can easily get very complex and it's nice to have some built-in tools to help keep it under control.
$ time { . lib/oo-bootstrap.sh ; for f in `find lib/ -type f -name '*.sh' -not -name oo-bootstrap.sh` ; do echo $f && source $f ; done ; }
lib/Array/Contains.sh
lib/Array/List.sh
lib/Array/Reverse.sh
lib/String/GetSpaces.sh
lib/String/IsNumber.sh
lib/String/SanitizeForVariable.sh
lib/String/SlashReplacement.sh
lib/String/UUID.sh
lib/TypePrimitives/array.sh
lib/TypePrimitives/boolean.sh
lib/TypePrimitives/integer.sh
lib/TypePrimitives/map.sh
lib/TypePrimitives/string.sh
lib/UI/Color.sh
lib/UI/Console.sh
lib/UI/Cursor.sh
lib/util/bash4.sh
lib/util/class.sh
lib/util/command.sh
lib/util/exception.sh
lib/util/log.sh
lib/util/namedParameters.sh
lib/util/pipe.sh
lib/util/test.sh
lib/util/tryCatch.sh
lib/util/type.sh
lib/util/variable.sh
real 0m2.490s
user 0m1.240s
sys 0m0.834s
Sadly it broke my already installed bash completion: $ ls # + <TAB>
x UNCAUGHT EXCEPTION: quoted
gsed: -e expression #1, char 2: invalid usage of line address 0
|} [bash_completion:0]
|} * _filedir [bash_completion:1196]
|} x COMPREPLY=( $( compgen -P "$prefix" -W "${COMPREPLY[@]}" ) ) [bash_completion:1196]
! Press [CTRL+C] to exit or [Return] to continue execution.
I don't understand why somebody would use Bash in this way though, maybe just for fun?"The aim of Bash Infinity is to maximize readability of bash scripts, minimize the amount of code repeat and create a central repository for well-written, and a well-tested standard library for bash."
Bash does leave a lot to be desired when it comes to data structures and error handling, but in some cases it makes the most sense. In those cases, better to have some semblance of sanity via a common lib like bash-infinity or bash-booster.
The semantics are advanced enough and different enough, that if I needed them, I would probably write the code in my favorite "scripting" language such as Python or NodeJS.
If Bash Infinity became ubiquitous, would it displace that "scripting" sweet spot that has been pretty constant with Perl/Python/Ruby for two decades? Or are you better of with a dedicated scripting language?
Of course you can write "shell scripts" in Haskell (or insert your favorite lang), but the tooling and rigor pushes you into "programming" territory.