Hear me out: A scripting language that compiles to bash or sh (any suggestions?)

https://lemmy.ml/post/4268738

Hear me out: A scripting language that compiles to bash or sh (any suggestions?) - Lemmy

why? Because bash feels clunky to write and work with for anything non-trivial, especially compared to other scripting languages. Why not another scripting language (no compile necessary)? Because bash and sh are installed nearly everywhere. Any other scripting language means the user is required to have that installed, and that is far less likely to be the case. If I could write my scripts in a nice syntax, but be sure my users will be able to use it effortlessly by distributing to them compiled versions, then that would make both of our lives easier! Thoughts? Are there any languges that do this?

I write a lot of bootstrapping scripts, and I have a solution. It’s not different from the soltuion you want because it’s easier, but rather its different because I believe it has to be different in order to do anything reliably.

As another person said, shells are not nearly as standardized as we need them to be. Mac uses zsh, Ubuntu uses dash, neither store a posix bash exectuable in the same place, and both have ls and grep differences that are big enough to crash common scripts. Even if you’re super strict on POSIX compliance, common things will still break.

However, you can make a single script that does it all without making any problematic assumptions. I hate JS as much as the next guy, but its possible to write a single text file that is valid bash/dash/zsh/powershell and valid JavaScript all at the same time. It sounds impossible, but there is enough overlapping syntax that actually any javascript program can be converted into a valid bash script without mangling the JS code. It might be possible to do for python as well.

From there, we can use a small amount of bash/powershell code at the top to ensure that the JS runtime you want is installed (auto install if missing). Then the script executes itself again using that runtime. It wasn’t easy but I a made a library that explains how it’s possible and gives a cli tool for doing it with the Deno runtime. github.com/jeff-hykin/deno-guillotine

From there I just recreated tools that feel like bash, but this time the tools actually were cross platform. Ex:

let argWithSpaces = "some thing" run`echo hello ${argWithSpaces}`

I picked Deno because it auto installs libraries (imports directly from URL so users don’t have to install anything)

GitHub - jeff-hykin/deno-guillotine: 💾 📦 ✅ Unversal Script Executor, zero install necessary

💾 📦 ✅ Unversal Script Executor, zero install necessary - jeff-hykin/deno-guillotine

GitHub

its possible to write a single text file that is valid bash/dash/zsh/powershell and valid JavaScript all at the same time. It sounds impossible, but there is enough overlapping syntax that actually any javascript program can be converted into a valid bash script without mangling the JS code.

I’m both impressed and horrified

It’d honestly the funniest thing I’ve read on this instance. Puts programinghumour to shame. Love it when developers finds the jankiest/unconventional way to solve problems.
It’s one of those tools that can both be used on a resume or as a diagnosis.

Agreed hahaha. I thought I’d enjoy the day my code golf skills would be used to solve a legit problem but instead it just feels kinda gross 😆

Honestly it’s really dissapointing we don’t just have an agreed-upon universal pre-installed language. And it’s beyond ironic (more like the universe is laughing at us) that JS, the web language that gets used for every not-web-thing, is also the language with a syntax that allows it to become the effectively universal no-preinstall language.

Okay at first I was pretty convinced that this was just the wrong way to accomplish what I thought your goal was. But now, after reading the StackOverflow post and your README, I think this is fascinating and frankly really awesome. What a clever and strange thing, using multiline comments that way, and string no-ops. I think just knowing this exists will cause me to find reason to use it.
Bro, make a video and put it up on peertube please then link it in the README. I need to see this shit in action. It sounds awesome, but it’s 10am and my eyes are just opening, so reading through everything and testing it isn’t happening on my phone rn.

Actually I’ve been thinking of starting a Youtube/Peertube channel for a while so this will be a good place for me to start!

I’ll come back and post a response once I’ve uploaded it! It’ll probably take a week or two.

💖 looking forward to it!
Not only do you solve the problem op is trying to solve, but you also made the most horrifying and hilariously ingenious thing at the same time.
Polyglot runtime lmao
Can this thing run complied WASM? Because compilers to WASM from other languages exists already
It can run compiled wasm! So you could write a bootstrap script in rust, compile it to wasm, embed that wasm into this deno script using deno.land/x/binaryify and then ship that as a universal executor.
[email protected] | Deno

💾 📦 ✅ bundling misc files into Javascript

Deno

Do I understand it right that what the tool does is include install scripts in all of the other languages, that simply download a portable Deno runtime and then run the rest of the file (which is the original Javascript code) as Javascript?

So, you basically still have an install step, but it was just automated to work cross-platform though what’s basically a polyglot install script. Meaning that this could probably be done with almost any other language, assuming it has a portable runtime - such as portable python and similar, is that correct?

Almost, the first part is right but the second part about “any language” isn’t quite right. The language needs a syntax that is compatible with bash/powershell. For example I abuse the multi line string and multi line comments of javascript to make it be interpreted as a do-nothing bash/powershell script.

Python specifically might be possible because of its triple-quote strings. However in general I don’t think languages, like Haskell or Elixr, can work for this just because their syntax is incompatible.

However, if you don’t care about being able to edit the script, it aould be possible to mangle other languages, like storing them in hex or some other escaped format (can’t be binary because that’s not valid bash/powershell). Then you’d to handle unpacking that hex with shell/powershell, but it could be done. Then, in that case, it would work with any portable language. (And many are more portable than Deno, which struggles to run on old stuff like Ubuntu 16.04)

If you’re interested in the hex unpacking let me know. I’m working on an offline bootstrapping script for deno, which involves embedding the runtime binaries of all OS’s as hex into the script itself. Once it build that it should be a lot easier to get this kind of thing working for other portable runtimes.

This is absolutely cursed and brilliant. Bravo!