Unix shell programming: the next 50 years
dl.acm.org
dl.acm.org
I still have python scripts from 10 years ago that happily do their job. I just had to swap print foo for print(foo) at one point when I changed from python 2 to 3 everywhere
It starts in libraries that you depend on -- wrappers around C code and whatnot, and then it just infects everything and breaks the world.
I'm happy to be writing all my python as python 3 now. It took ten years.
I haven't had all that much experience with Python 3, but for the 2.x series there were often tweaks that needed to be made either with code or libraries when moving between new releases with a large code base.
Lastly, Python just isn't great for making one-liners. It might be a personal quirk, but that's my favorite way to iterate over an problem. With all that said, I do really like Python and use it heavily.
https://news.ycombinator.com/item?id=27378444 (77 days ago)
https://news.ycombinator.com/item?id=27036572 (3 months ago)
More non-HN comments here: http://www.oilshell.org/blog/2021/06/hotos-shell-panel.html#... (as well as my notes on the HotOS conference event)
There needs to be a modern language that looks friendly, is compatible with shell, and is apart of the shells environment.
I am one of many people who don't really care for shell, it's old, limited, and just plain ugly. Unfortunately it's still the best way to interact with Unix, so it should be built upon to keep compatibility.
Wouldn't it be nice to write shell scripts with objects and data structures?
That's PowerShell - https://docs.microsoft.com/en-us/powershell/module/microsoft...
For example, you can make a Win32 GUI app, but the console window still shows. So, you can hide it, but it flashes briefly anyway.
Also, there's weird overlap of features, sometimes because it's so easy to call out to dot net. Like, there's Start-Job, but there's also Runspaces and System.Threading.Thread. Makes it hard to find the "right way" to do something.
And Powershell is super slow when you deal with a lot of data to the point of being unusable.
Two years ago I worked on a project where we used Powershell a lot. It worked OK but I think next time around I would use Python.
It would have been much better if they had used a variation of C= (which is a pretty good language)
or eshell?
IMO no, it wouldn't. The simplicity and flexibility of plain text piping beats out the more structured approaches. Sort of reminiscent of how HTTP ate the lunch of most all other RPC protocols (eg. CORBA) even though it wasn't even designed to be an RPC.
HTTP ate everybody else's lunch mainly because corporate firewalls closed off competing protocols' ports but kept port 80 open.
Do you know a good set of command line utilities to work with binary typed data?
PowerShell, by contrast, operates directly on objects with strongly typed fields.
Do you have tools to use this feature? If not, who will write them? Who will define a standard format to use? Who will extend the standard format, when necessary?
ls -fr | select (f: now() - f.mtime < days(1)) | map (f: (f.suffix, f.size)) | red . +
- ls -fr: list recursively, yielding only files.- select (f: ...): f is bound to each file from ls. If a file's modification time is within one day of the current time, then write that file object to the output pipeline.
- map (f: ...): f is bound to each file from the select, and mapped to a tuple containing the extension and file size.
- red . +: Group by file extension and sum sizes.
And shelling out from python is much simpler. Here is the same computation in python
from marcel.api import *
for ext, size in (ls(file=True, recursive=True) |
select(lambda f: now() - f.mtime < days(1)) |
map(lambda f: (f.suffix, f.size)) |
red(None, r_plus)):
print(f'{ext}: {size})
marcel.api imports functions matching the commands (ls, select, and so on), and the pipeline yields an iterator, for neat integration with python loops.Egads laddie, it'll happen to you too some day.
Turtle> cd "/tmp"
Turtle> pwd
FilePath "/tmp"
Turtle> :type pwd
pwd :: IO Turtle.FilePath
Turtle> touch "file"
Turtle> testfile "file"
True
Turtle> rm "file"
Turtle> testfile "file"
False
Fish [2] and Oilshell [3] are two other efforts to create new shell dialects that improve usability while remaining somewhat backwards-compatible.[1] https://hackage.haskell.org/package/turtle https://hackage.haskell.org/package/turtle-1.5.22/docs/Turtl...
Julia: https://docs.julialang.org/en/v1/manual/running-external-pro...
julia> prefixer(prefix, sleep) = `perl -nle '$|=1; print "'$prefix' ", $_; sleep '$sleep';'`;
julia> run(pipeline(`perl -le '$|=1; for(0..5){ print; sleep 1 }'`, prefixer("A",2) & prefixer("B",2)));
B 0
A 1
B 2
A 3
B 4
A 5
The problem arises when you need to chain executables together, rather than just Python code. It turns out that shells do some pretty complicated stuff with file descriptors and forking, stuff that you definitely do not want to DIY in Python. So "streaming" data from one executable to another means you buffer everything in Python runtime, even if you use async. This is fine for a lot of cases, but it feels wasteful and in elegant to me.
The glue should be structured data, none of that object bs. It should also have the option for plain text because sometimes that is all you need and you want simple tasks to remain simple. I'm guessing you'll use some sort of binary spec in order to help in the conversion of data structures between languages.
Once you have the communication between programs handled all you need is a decent language to handle the logic. The language doesn't really matter though since the core that allows all of this is not tied to any one language. I'm sure plenty of people would write their own wrapper for their favorite language.
That said, I do also appreciate bash scripts which are cleaner if you just have a long list of commands to execute and no real logic involved
What do you mean by this? You can write safe shell scripts; it just takes discipline and learning how to correctly write them.
There are a lot of pitfalls but it isn't that hard if people actually learned the language.
Edit: to clarify discipline meaning always doing things correctly and never taking shortcuts. For example, you must use:
while IFS= read -r || [[ "${REPLY}" ]]; do ((X++)); done < <(command)
If you want to loop over lines in a file. Don't use for loops, don't pipe to while, etc. It may be verbose but it won't be buggyWith that in mind I'll confess to not having read the rest of the article because really, that's so far from a correct point as to render discussion mute.
Yes, I think the shell is an amazingly empowering tool, and yes it's also in need of some love. It's hard pulling apart what pieces of the specs still make sense, and what parts don't. But I've tried to learn and love fish shell (for example) and I think it's just proof for me that a new shell language is just going to cause more integrations and translations I need to perform on the fly. I already convert from 12 hour to 24 hours in real time, I don't really need to be translating bash->fish every time I want to do a conditional.
Embedding languages inside each other is a topic of theoretical consideration now for me, and I'll admit I haven't found a compelling source for previous research on this yet, but I feel like I might need it one day.
Anyway, I'll just be happy if one day I can try and forget about all the weird flags shell options that can be set at any time and impact the evaluation strategies of future expressions directly.
But alas, the shell would never stay still.
We propose a dynamically triggered optimization regime for the shell
that we call Jash, short for ‘Just a shell’. Jash inspects each shell
command as it comes in to identify candidates for rewriting.Technology adoption is driven by extrinsic need, not intrinsic merit - so backcompatibility is hard to beat. This is especially true of infrastructure, from train tracks to bash scripts.
How do you tell the AI what you exactly want? It's just another abstraction...and probably a bad one.
In the end, it will determine your needs, superseding your wants.
Yeah, and in 50 years after 1969 we'd have colonies on Mars.
Meanwhile it's been 50 years that we haven't even send a man outside low earth orbit, much less to the moon even.
If they switched the bash terminal to a python repl, or just reliably offered stable python, that was available on every single distro, and just worked...I bet people would be fine with it.
Same with replacing JS in the browser with python or another dynamic language.
Tech people are practical and will just learn whatever they need to get things done quickly without introducing additional complexity.
But then there's the idea that todays elegant language become tomorrow's kludgy language.
So in the long run theres no winning. :)
That doesn't mean that there isn't a better shell, I just don't think Javascript being the dominant web language is a good comparison.
I think they ported bash just to bring the bash audience over to windows...not because there's any objective quality improvements.
I could be wrong. There's a lot to love about bash. Just alot MORE to love about actual fully featured dynamic programming languages i think.
It's interesting to think about.
Azure is a “bet the farm” strategy for Microsoft (and has been since before it launched) - they’ll do anything they need to do to make it work. (And so far it’s been a pretty good play!)
Why not make it easy for your competitors to join your ecosystem?
Most deff. They got a home run with Azure.
The things that are awkward about it are also awkward in bash, and generally less so (usually having to do with quoting details). Nothing is worse than in bash. And a huge amount of things are better.
It's not perfect, there are things I don't like, aesthetic things that are a little strange, but these are shortcomings compared to some imaginary perfect shell, or to some other programming language. Not compared to bash.
The only advantage bash has is install base and familiarity. Which isn't nothing, but on the merits of the program itself, powershell is better. I switched a couple years ago and haven't looked back.
You can get everything you want done with functions and imports.
If want to OOP it's there but not convoluted.
Its like OOP light.
Surely this is satire or I want to work where you work!
I don't know of any distros that don't have Python. I just don't want to pip install anything because I'll get a hundred red lines I don't care to make sense of, and I definitely don't want to mess around with environments.