Amber the programming language compiled to Bash/Ksh/Zsh
68 points
4 days ago
| 14 comments
| amber-lang.com
| HN
awinter-py
1 hour ago
[-]
I tried this or something similar a while ago and really wanted a better argument parsing experience

https://docs.amber-lang.com/0.6.0-alpha/basic_syntax/importi...

it seems like automatic `--help` + named args is still not a thing? if it were, I'd be all over this

reply
ivanjermakov
6 hours ago
[-]
Any language is a shell script if you're brave enough: https://en.wikipedia.org/wiki/Shebang_%28Unix%29
reply
b-kf
4 hours ago
[-]
Exactly

  #!/usr/bin/tcc -run
  
  #include <stdio.h>
  
  int main(int argc, char **argv)
  {
      printf("Hello from C!\n");
  
      for (int i = 1; i < argc; ++i)
          printf("argument %d: %s\n", i, argv[i]);
  
      return 0;
  }
And ready is your cscript :)

  $ chmod u+x cscript && ./cscript hello world
  Hello from C!
  argument 1: hello
  argument 2: world
(I can't even articulate why I love it so much that this works)
reply
xixixao
4 hours ago
[-]
Can you change the current working directory? If not, it's not a shell script.
reply
b-kf
3 hours ago
[-]
Obviously it's not a shell script, it's still C. It's fun though and being able to freely specify an interpreter/execution path using a shebang has led me to write some useful little command line utilities in unlikely programming languages over the years. That said, not sure why changing the working directory would be the litmus test. A C program can change its own working directory just as easily as an ordinarily executed bash script?

  $ cat bscript.sh && echo "---" && ./bscript.sh 
  #!/usr/bin/bash
  cd testdir/
  ls
  ---
  dummyfile
in C you can change dir easily via `chdir()`[1]

  $ cat cscript && echo "---" && ./cscript 
  #!/usr/bin/tcc -run
    
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
    
  int main(void)
  {
      if (chdir("testdir") == -1) {
          perror("chdir");
          return EXIT_FAILURE;
      }
    
      execlp("ls", "ls", (char *)NULL);
      perror("execlp");
      return EXIT_FAILURE;
  }
  ---
  dummyfile
[1] https://www.man7.org/linux/man-pages/man2/chdir.2.html

If you meant somehow changing the parent shell's directory an ordinary bash script doesn't do that either

reply
ivanjermakov
1 hour ago
[-]
Of course you can. How do you think `cd` utility is implemented?
reply
zbentley
3 hours ago
[-]
Presumably you can call chdir(2) from the C code?

Or did you mean change the directory of the calling shell (in which case, executable shell scripts written in Bash and friends can’t do that either).

reply
wavemode
3 hours ago
[-]
Well, you can "source" a script, so its effects persist in your current shell session. That's a feature of the script and your shell sharing the same language.
reply
freehorse
57 minutes ago
[-]
Then it seems that what you want is running a repl of your chosen language rather than shell/"executable" scripts.
reply
zbentley
1 hour ago
[-]
Sure, but “shell scripts” as an (admittedly imprecise) term usually imply separate executable files, not shell libraries/functions that are sourced.
reply
BadBadJellyBean
5 hours ago
[-]
This looks great. We have a lot of bash tools because it's the only stable interpreter that we have readily available on all our systems. But bash is a pain to write so this might actually make things easier.
reply
rpdillon
58 minutes ago
[-]
I had a small project that embedded the Lua interpreter in scripts as base64, which allowed me to write shell scripts in Lua, since it carried the interpreter with it. About 270k of bloat to make it work, though.
reply
RodgerTheGreat
5 hours ago
[-]
How many places do you have Bash, but not AWK?
reply
bananamogul
3 hours ago
[-]
Or Perl. Or Python. How many environments have only bash and not awk, perl, or python?
reply
xixixao
4 hours ago
[-]
1. From the docs: "In the the project it is production ready because it is already used in this context because the shell code generated is tested and confirmed that works, the language is evolving with the tooling set."

Hmm...

2. Support Fish too. Having one language that can generate zsh (macOS default), Fish (power users default), and bash would be really nice!

reply
gdevenyi
6 hours ago
[-]
> Typescript to bash

Literally the worst of both worlds.

reply
classified
6 hours ago
[-]
Bash is great for orchestrating other Unix tools into an automated workflow. Only when that workflow requires stuff that Bash doesn't have is it time to break out Python. Integrate Shellcheck into your editor, and you get automated help for writing more reliable Bash.
reply
lokar
1 hour ago
[-]
Great compared to what? It was great in the ‘90s, not today.
reply
artemonster
3 hours ago
[-]
bash bashing i can understand. whats wrong with ts tho?
reply
lokar
1 hour ago
[-]
Everything related to JavaScript is terrible.
reply
onlyrealcuzzo
6 hours ago
[-]
Just wanted to say that I think you did a great job with your examples showing why someone might be interested in this language.
reply
karma_daemon
5 hours ago
[-]
unclear use case imo - this sacrifices the ergonomics of actual bash scripting, and hides it behind another language

If your script is complex enough to need a higher level language you might as well just switch to python

reply
jeremyjh
1 hour ago
[-]
The only thing I can think of is if you have an existing system you are integrating with thats implemented in shell script already - for example a packaging or build pack system; but I can’t really see how this could be justified even there because this could easily be a toy that becomes abandoned.
reply
ekidd
6 minutes ago
[-]
A really common use case is install/bootstrap/setup scripts. You know, those sketchy curl-to-bash things, or cloud-init scripts, or whatever you run to set up your actual higher level tools like Python.
reply
paultopia
3 hours ago
[-]
bash scripting has ergonomics?
reply
jeremyjh
1 hour ago
[-]
Regardless of where it’s deployed I can edit it and run it without any additional tools.
reply
ktimespi
2 hours ago
[-]
I'm a fan of this project. Great work!
reply
wg0
6 hours ago
[-]
Much needed. I have hard time understanding bash.
reply
jeremyjh
1 hour ago
[-]
It’s not like you have to anymore. If you are going to take on a dependency to generate bash for you, why would it not be a coding agent?
reply
codingjoe
3 hours ago
[-]
Hm... But why not use Python
reply
lobofta
3 hours ago
[-]
Because it's not preinstalled on every machine. Bash is a good target for portability reasons, but it's a shitty language to write in. If ever I get in the position again to have to write some bash, like for an installer or so, I'm going to be looking into Amber again.
reply
throawayonthe
29 minutes ago
[-]
portability but not posix shell? tsk tsk
reply
xyst
3 hours ago
[-]
I’ll give it a shot.

Side note: the image of project founder cosplaying as Steve Jobs on front page had me dying.

reply
bbkane
3 hours ago
[-]
I clicked the link to see this image and wasn't disappointed. It's fantastic!
reply
Hammershaft
6 hours ago
[-]
Another alternative for writing Bash is Babashka, which is a Clojure dialect.
reply
serious_angel
6 hours ago
[-]
Thank you, but... why not just write in Bash, or the shell you prefer? Why learn a yet another opinionated wrapper?

Yes, Bash or any shell is a very complex and utterly environment dependent language to approach with all due care for security and compatibility, yet hence the lack of wrapper that may not even be aware of these crucial cases at all.

reply
threatofrain
6 hours ago
[-]
Your argument is down to the weights.

There are other communities where movement in the language came from outside tooling that built extensions on top of the language, such as Sass or TypeScript.

reply
nicce
6 hours ago
[-]
It always comes to be a social problem. Sort of. I want to use X instead of Y, but maybe everyone does not want the same, or adaption of X is harder in technology wise. So I use wrapper Z that compiles to Y, and avoid some problems, but bring new problems. Maybe these problems are smaller ones than just keeping to use Y directly.
reply
KerrAvon
6 hours ago
[-]
bash is really painful to use for anything beyond the most rudimentary logic. Bourne and Mashey were terrible language designers. (By contrast, Thompson's V6 shell is very elegant, if limited.)

That said, this should just be a shell itself and not something that generates into other shell dialects. Otherwise, why not use Ruby or something like it that has actual expressive power?

reply
deathanatos
5 hours ago
[-]
> That said, this should just be a shell itself and not something that generates into other shell dialects. Otherwise, why not use Ruby or something like it that has actual expressive power?

I'm guessing the advantage here would be that the compiled "bytecode" (the resulting bash) can be distributed to systems that would then not need to have Amber installed. (And vs. a real binary from, e.g., Go/Rust/etc., it isn't tied to the platform, either.)

Vs. a Ruby script would require Ruby as a run-time dependency; Amber here is effectively a compile-time dependency.

Python 3 is available basically everywhere these days though, so I think there's still a lot of merit to just using a higher level language like you suggest. Even Ruby, while not available out of the box, is not exactly hard to get on most OSes.

reply
ClikeX
3 hours ago
[-]
Hot take, but Powershell is quite an elegant shell language. It's actually a lot easier to write than Bash.

It took my quite a while to get used to all the verbose method names, but it actually makes it pretty readable by default.

reply
greekrich92
6 hours ago
[-]
If you don't want to use it, don't use it
reply
namegulf
5 hours ago
[-]
In a world where AI can generate any code for any environment, is there a need for another language?

On the other hand, we're at a point for a binary language (or standard / framework) that one AI/LLM creates and another one validates.

What are we missing?

reply
namegulf
39 minutes ago
[-]
You guys can stop down voting.

This is not something we're advocating, instead talking the reality from observing across the industry.

reply
heresie-dabord
1 hour ago
[-]
> is there a need for another language?

If you know of a language that is perfect for all our needs today and tomorrow, please guide us to it.

> What are we missing?

Major concerns would be i) trust in the tooling, ii) quality and accountability, iii) future investment in competent engineering.

reply
namegulf
1 hour ago
[-]
True, There isn't one, there will be never one. Isn't that how we end up so many and it never ends.
reply
lobofta
3 hours ago
[-]
Do we really want to stop evolving the space of languages (and libraries and frameworks while we're at it) just because we have LLM's writing code now? If LLM's were truly smart, they'd argue with us that we should stop asking them to write bash code, because it's a shitty error-prone language. True intelligence should be skeptical of itself and not take any request as a requirement.
reply
namegulf
1 hour ago
[-]
Agreed, not our choice but isn't that the reality now?
reply
AlecSchueler
5 hours ago
[-]
We're missing AI that doesn't still its hand held every step of the way.
reply