1: Obviously a large general purpose program that only occasionally needs to run an external program is probably going to be better in Python due to the library ecosystem alone. I'm talking about those Python programs that use primarily some combination of pathlib, os, sys, and subprocess and exist only because of the deficiencies (perceived and real) of shell.
https://lobste.rs/s/pcuppu/what_helps_people_get_comfortable...
Basically I want to be able to use all the power of Unix without remembering it all -- shell is a great tool for that.
Someone made a LSP plugin for Oils awhile back, and I expect if enough people use it, those tools will arise. They will be MUCH easier to produce for Oils than shell, because we have a principled code representation. (Some tools will be inside the project, and some outside, as usual)
On the UI side, there are also people exploring shell GUIs via the "headless shell" -- something no other shell has -- but we can use more people to help.
screenshots: https://www.oilshell.org/blog/2023/06/release-0.16.0.html#he...
i.e. Join #shell-gui on Zulip; don't assume it will get done without your input or effort ... as mentioned in this blog post, the biggest risk is that we don't have enough people helping!
The rest is typed Python (with algebraic data types), which more common and simpler than Zig or Rust.
It's not as fast as Zig or Rust, but
1. The shell is the same speed when it's running external processes (and we do measure)
2. I believe it can be as fast as bash's hand-written C, even for code that doesn't do I/O (which isn't common but exists). We're perhaps ~50% the speed now, being "hilariously unoptimized".
This release mentions a big optimization, but the bigger point is that we have leverage via metaprogramming. We can do transformations on the entire interpreter (e.g. "boxless" transformation)
3. It means we only have 40K lines of Python, compared to 142K lines of C in bash. If you add YSH, we will only have around 50K lines, compared to probably 200K lines if you wrote it by hand
So the whole program is closer to an executable spec -- there is less room for bugs to hide.
It's easier to optimize 50K lines that is known to be correct (with thousands of tests), than 200K lines of code
---
Our binary is about 1.5 MB of executable code with no dependencies other than libc and (optional) GNU readline.
On the other hand, shells in Rust seem to have a big tree of dependencies and end up at 20 - 50 MB. It's not the size I'm concerned about so much as the stability
As mentioned before, our approach is unusual, but I think the "usual" approaches haven't worked well. That said, I think if someone wrote a compatible shell from scratch in Zig or Rust (with limited dependencies), that would be also be valuable contribution
---
Oils is also aimed at the system level, and is an "exterior" shell that uses processes and file descriptors. Comparison with PowerShell, Elvish, nushell here:
https://www.oilshell.org/blog/2023/06/ysh-design.html#survey...
i.e. "shell" is a bit overloaded, and in some sense those tools are "one level higher".
https://github.com/bash-lsp/bash-language-server
that said, a language that focuses on shell scripts could be a good idea because there is not much work done yet in that space
It’s my belief that “riced out” has negative racial overtones, and isn’t an appropriate adjective to be using. Wikipedia has some history on this related term: https://en.wikipedia.org/wiki/Rice_burner
That being said it seems like Oil is polishing the shiniest turd. I never liked Unix shells or shells much in general and strongly prefer to type out commands in a script (usually Python or Perl) and then run that script. It takes longer but I actually trust the result to work and I’ll understand it two months from now. Also when you do that you get all the benefits of using your riced-out, LSP-enabled editor. Ofc I still use a terminal for apt and other such programs, but not munging data.
It seems like if you wanted to make a modern shell you would work on improving the interface and not so much the internals. Like in the SerenityOS terminal emulator, how everything is clickable. I’ve always wanted an easy way to “export” a shell session to a script, including env variables and whatnot. Maybe types in YSH will enable better terminal emulators, I don’t know.