[HN Gopher] The Case for Nushell (2023)
___________________________________________________________________
The Case for Nushell (2023)
Author : ravenical
Score : 59 points
Date : 2026-01-07 16:15 UTC (6 hours ago)
(HTM) web link (www.sophiajt.com)
(TXT) w3m dump (www.sophiajt.com)
| xpe wrote:
| A nice coincidence to read this; I was just telling some friends
| the following (lightly edited):
|
| Nushell is amazing and a total pleasure to use. I cannot yet
| discern any limit to how much thought has been put into it.
|
| I'm stunned in a good way. I'm writing shell scripts without any
| pain -- actually I much prefer them to Python! With the language-
| server integration - I use Zed, but I'm sure they exist in VS
| Code and others too - I can see errors in scripts as I write
| them! (Including typos in pathnames! Amazing.)
|
| I have to admit Nushell didn't become my daily driver right away;
| it took a few years for me to switch fully. I don't know exactly
| why, but it probably had to do with its lack of POSIX
| compatibility. I now see this as a necessary break for Nushell to
| pursue its vision.
|
| About expectations: some people will be delighted immediately and
| get hooked, but not all. We're all busy and adopting a new tool
| can feel like a leap of faith. For me, it has been worth it.
| Nushell has felt like planting a garden that gives back way more
| than you put into it.
|
| I wrote up a quick gist [1] that shows how nice the experience is
| to write a new command (i.e. function) in Nushell.
|
| [1]: "Building Argsort with Nushell"
| https://news.ycombinator.com/item?id=46528644
| xpe wrote:
| From an end-user point of view, there are some weirdnesses in
| Nushell, but they are rare in my experience. Here is one that
| gotcha'ed me: [1 2 3] | sum
|
| The above does _not_ return the sum (1 + 2 + 3 = 6). Why? Because
| `sum` is a *nix utility for returning the checksum. The way to do
| it in Nushell is: [1 2 3] | math sum
|
| More info at [1]. Technically, this isn't Nushell's _fault_ ; it
| is just delegating to an external command.* Still, I found it
| confusing at first.
|
| * Maybe it is time to rename `sum` to `checksum`!
|
| [1]: https://github.com/nushell/nushell/discussions/17239
| Natfan wrote:
| i've never used nushell, but i've always felt that people have
| been sleeping on PowerShell.
|
| yes, it was _originally_ only for Windows, but PowerShell 6+ uses
| .NET Core, which is OS independent. this means that a few helper
| functions like GeneratePassword[0] are gone, but it's _mostly_ at
| parity with .NET.
|
| the Verb-Noun structure can be confusing at first, but once you
| know the approved verbs[1], you can usually guess your way
| through command discovery, which is not something i can say for
| most POSIX tools (useradd and adduser do different things!!)
|
| it's also object oriented by design, with default aliases like
| ?[2] and %[3], querying structured data is a breeze.
|
| - want to check a CSV? Import-CSV[4].
|
| - want to call a REST/SOAP endpoint? Invoke-RestMethod[5] has you
| covered.
|
| - DNS queries? Resolve-DnsName[6]
|
| as it's built on top of .NET, you get the whole CLR[7] at your
| fingertips! you can make a TCP client[8] in PowerShell, or even
| just write C# directly in your terminal[9] and execute it the
| same way.
|
| such a flexible and useful language, even if it is a little slow
| and owned by micro$oft. but it _is_ open source[10]!
|
| ---
|
| [0]:
| https://learn.microsoft.com/dotnet/api/system.web.security.m...
|
| [1]:
| https://learn.microsoft.com/powershell/scripting/developer/c...
|
| [2]:
| https://learn.microsoft.com/powershell/module/microsoft.powe...
|
| [3]:
| https://learn.microsoft.com/powershell/module/microsoft.powe...
|
| [4]:
| https://learn.microsoft.com/powershell/module/microsoft.powe...
|
| [5]:
| https://learn.microsoft.com/powershell/module/microsoft.powe...
|
| [6]:
| https://learn.microsoft.com/powershell/module/dnsclient/reso...
|
| [7]: https://learn.microsoft.com/dotnet/standard/clr
|
| [8]:
| https://learn.microsoft.com/dotnet/api/system.net.sockets.tc...
|
| [9]: https://devblogs.microsoft.com/scripting/weekend-scripter-
| ru...
|
| [10]: https://github.com/PowerShell/PowerShell
| b40d-48b2-979e wrote:
| As a prior contributor to PowerShell, I think part of this
| obscurity reason is how they neglected their community. This
| was evident in their merged PR history only containing commits
| from Microsoft developers.
|
| I use nushell now, and its community is fantastic. It may face
| breaking changes every so often, but it has a much faster
| execution speed and more features if you're not tied into the
| .NET ecosystem.
| adzm wrote:
| Powershell is pretty great, though I am constantly bit by
| issues with filenames having [ or ] in them and end up having
| to pass -LiteralPath to everything, which is frustrating and a
| constant source of bugs in any other scripts that do not do
| that.
| acedTrex wrote:
| I really wanted to get into nushell but i found reedline to be
| very limiting in a few specific ways esp around keybindings that
| blocked me from moving to it
| cassepipe wrote:
| Anyone knows how good is the vi mode ?
| adamnemecek wrote:
| I started using nushell around April 2024. While it is much
| better than other shell languages, the lack of proper types is
| painful.
|
| Shell languages make sense if you believe in the Unix philosophy.
| For me, the problem with the Unix philosophy is the endless
| serialization and deserialization as well as lack of proper error
| handling. So nushell for me is a good answer to an ill-posed
| question.
|
| The approach I have been taking is a single binary with a billion
| subcommands and aliasing these. I currently have two of these in
| Rust, one in Swift. I tried going all Rust but integrating with
| certain aspects of macOS is just so much simpler in Swift.
|
| Like the recent push to make CLI development suck less (e.g.
| argument parsing used to be painful but is solved now) has made
| developing CLI tools a lot less painful.
| nialv7 wrote:
| serialization/deserialization will always be needed unless you
| got all your programs working with the same ABI. it's just that
| in nushell's case you aren't serialize to human readable text.
| UltraSane wrote:
| endless serialization and deserialization is what makes me hate
| Bash and love PowerShell which solves this issue by piping full
| objects between commands and the ConvertTo-JSON command.
| BadBadJellyBean wrote:
| I have always struggled a bit with shell replacements. I use zsh
| but only because of oh-my-zsh. Apart from that I always thought
| of shell scripts as a necessary evil for interoperability. Today
| you can usually expect a linux system to have bash or at least
| sh. That is why I do shell scripting. Nushell is usally not
| preinstalled on a system and so I cannot expect it.
|
| If I want to do real scripting/programming I use python or
| another dedicated programming language. I don't really know what
| the value of Nushell is for me. Maybe the plugin system is
| amazing but at the moment I miss nothing in my zsh.
| timeon wrote:
| It is not just about scripting but the structure of input and
| output. Also no need to give up (z)sh switching shells is eazy.
| BadBadJellyBean wrote:
| Maybe I need to get into nushell more but my feeling is that
| if it's a simple problem it the benefit will be negligible
| and if it is too complicated for that I will probably write a
| python script.
| xpe wrote:
| That is how I felt with Zsh, even though Zsh scripting is a
| step up from Bash. But with Nushell there is a huge space
| of scripts I now prefer to write in it.
| mmh0000 wrote:
| I really would like a new shell that wasn't based on a poorly
| designed programming language from the 1960s[1][2]
|
| However, I need to know sh/bash well because they're the tools
| installed by default; in any "well-established" organization,
| getting approval to install a new shell will range from "12 to
| 24 months" to "impossible". And without that, I'm not going to
| put in the effort to learn a new tool that is only useful some
| of the time and requires massive context switching.
|
| [1] https://en.wikipedia.org/wiki/ALGOL_68 [2]
| https://en.wikipedia.org/wiki/Bourne_shell#:~:text=Stephen%2...
| BadBadJellyBean wrote:
| That's what I mean. A new shell would need to blow me away
| with some amazing must have interactive feature. The
| scripting part is, at least for me, not really relevant. If I
| can install software on the target I will install a proper
| language and if not then it will be bash or sh anyways, even
| though they properly suck.
| ZenoArrow wrote:
| The "killer app" is that it's easy to string together
| multiple commands and have them work more reliably than
| shells that rely on plaintext. In other words, it's
| something in-between running individual commands and
| writing full scripts. I've not used Nushell before, but I'm
| very familiar with PowerShell which is similar, and it's
| ridiculously easy to manipulate and explore your file
| system with confidence that you don't have to rely on hacky
| and hard to read regex and similar suboptimal solutions.
| xpe wrote:
| We all know the dueling aphorisms of "if it ain't broke, don't
| fix it" versus "no risk, no reward", so I'll just say this:
| there is a middle way. I keep a whole lotta Zsh and Bash
| scripts. But for work on systems I control, Nushell is a boon.
| I use it for interactive work and add scripts when I see a
| need.
| ndsipa_pomu wrote:
| The example FOR loop in BASH is missing a trick to make it easier
| to read: for i in {1..10}; do echo $i
| done
|
| (Though I prefer using printf than echo as it's more capable and
| POSIX compliant)
|
| I write far too much stuff in BASH, but for me it's just not
| worth moving to using a different shell due to its ubiquity.
| There's also the question of "will this still run easily in 20
| years". Of course, BASH is a nightmare for bugs and foot-guns
| unless you make a point of defensive coding (e.g. surround
| variables with double-quotes and using Shellcheck to point out
| common errors).
|
| By the way, the article goes on to mention the large number of
| options to "ls". Don't try to parse the output of "ls" in scripts
| as there's better ways to do things:
| https://mywiki.wooledge.org/ParsingLs
| tormeh wrote:
| If you're ever forced to use Windows, just install nushell. The
| speedup is wild, and along with it comes many nice quality of
| life features.
|
| Nushell is good on the Unixes as well, but the defaults there are
| less annoying. I regularly revert to bash because there's just
| some thing I've memorized in bash, and bash doesn't make me want
| to scream.
|
| Note that this is just my perspective on it as an interactive
| shell. I've never used it for scripting.
| UltraSane wrote:
| Windows already has a very good shell called PowerShell.
| tormeh wrote:
| I've tried the stock Windows shell and utilities. `ls` is
| noticeably slow in directories with like 15 subdirectories.
| That's not acceptable. Even the terminal emulator is so slow
| pasting 30 characters takes several frames. That's not too
| annoying, but I might replace it with Wezterm or something.
|
| The stock Windows terminal experience is awful. Windows has
| improved markedly recently with `winget`, so maybe they'll
| get around to fixing the speed sometime, too.
| FergusArgyll wrote:
| Windows terminal and Powershell are 2 distinct programs
| int0x29 wrote:
| Powershell itself can be noticably slow to even start.
| Waiting a minute or two to hit a prompt is just annoying. Yes
| this only happens if you run Windows on a spinning disk but
| it's a shell. It's shouldn't require an SSD to run.
| ZenoArrow wrote:
| > Waiting a minute or two to hit a prompt is just annoying.
|
| I've never experienced startup times anything close to a
| minute. Is your computer very old?
| runjake wrote:
| Powershell is slow to start (~1-8 seconds on my PCs, even
| without a profile.ps1) and it performs pretty poorly in
| general (eg. processing texts and pipelines) compared to
| other options -- even Python by a wide margin.
|
| I love Powershell and I wish MSFT would put a concerted
| effort into optimizing its performance.
| chasil wrote:
| There is one company who decides what PowerShell is, and they
| are not known for stability in many areas.
|
| Just as easily as Aero switched to Metro, syntax in
| PowerShell will do what they want, despite impacts to your
| legacy scripting.
|
| The POSIX shell, on the other hand, is a POSIX standard
| controlled by the Austin group. The classic adaptation is the
| Debian Dash shell, which is both tiny and fast, and changes
| are very, very slow.
|
| Dash can be linked with libedit and used as an interactive
| shell. Everyone should do so, before learning non-standard
| extensions in Korn, Bash, Zsh, et al.
|
| Shells are a matter of taste to a great extent. These are
| different envelopes of features, stability, and portability.
| UltraSane wrote:
| If you haven't tried PowerShell I strongly recommend you do. It
| is really well designed and the way objects are piped between
| commands is brilliant and very powerful. Combined with property
| filters you can do SQL like queries. The ConvertTo-JSON lets you
| export the output of any command to JSON which is amazingly
| useful. As an example you can dump the entire Active Directory
| (Assuming you have permissions) by
|
| Get-ADObject -Filter * -Properties * | ConvertTo-JSON >
| ADObjects.json
|
| And you have access to ALL of the .NET library.
| haolez wrote:
| Until you have to quote a string that has ampersands in it :)
| ZenoArrow wrote:
| You mean like this...
|
| ' "Here is an ampersand... &" '
|
| To clarify, in PowerShell there is a difference between text
| between single quotes (e.g. '$test') and double quotes (e.g.
| "$test"). Single quote strings are literal strings, so
| whatever text is contained within them is reproduced as
| written. Double quote strings are expandable strings, which
| means that certain text inside the string is evaluated before
| it is returned. If you have double quotes in a literal
| string, you'll see double quotes within that string, and the
| same should be true for ampersands.
| pksebben wrote:
| caveat up front: I see that the point here is to talk about a
| nice, good thing for people to use that is useful, and I don't
| think that's a bad thing. I am also always looking for ways to
| upgrade, and I also agree that in a modern context with modern
| knowledge, we can do better.
|
| However, regarding the posix skepticism - I think OP has missed
| (or just not mentioned) the actual thing that keeps bash/zsh from
| being unseated.
|
| Industrial standards are a good thing just because they're
| standards. They're right that a redesign would be superior in
| terms of raw design, but this is only useful if it's adopted
| widely enough so that you don't have to context switch between
| two fundamental systems. I spin up a new VM somewhere and it's
| going to have bash. I use a tool and I expect it to follow a
| particular convention - having to figure out which I'm reaching
| for adds an amount of friction that would make most work
| untenable.
|
| I like zsh but I also want something better. Type safety and
| robust completions would make me very happy, but if we're going
| to make the switch we have to do it as an industry - with a set
| of agreed upon interfaces and standards that are carefully
| thought out and built on consensus. I don't know if that's
| possible given the massive complexity of the state of affairs but
| that's what it would take.
| maxloh wrote:
| Nushell commands are really great, so great that they are even
| better than the standard library of some languages. However, the
| language itself isn't very intuitive to learn.
|
| I wish Nushell and Python/TypeScript have a baby one day.
| Barrin92 wrote:
| well if you want a python/shell hybrid there's always xonsh
| (https://xon.sh/). Really great in particular for people like
| me who are bash-challenged. I do like Nushell too but I also
| always had problems remembering the actual language.
| maxloh wrote:
| I actually meant something like that with Nushell commands.
| They output structured data that Python and JavaScript can
| easily leverage in theory. C: > ls +---
| -+------------------------+---------+---------+--------------
| + | # | name | type | size |
| modified | +----+------------------------+---------+-
| --------+--------------+ | 0 | Program Files
| | dir | 8.1 kB | 2 hours ago | | 1 | Program
| Files (x86) | dir | 8.1 kB | 2 months ago | |
| 2 | Users | dir | 4.0 kB | 4 months ago
| | | 3 | Windows | dir | 16.3 kB | 4
| days ago | +----+------------------------+---------+-
| --------+--------------+
| bflesch wrote:
| > I wish Nushell and Python/TypeScript have a baby one day.
|
| That would be nice. Or a TypeScript transpiler to rust ;)
| fainpul wrote:
| My pet peeve with nushell: broken tables
|
| https://github.com/nushell/nushell/issues/13601
|
| https://github.com/nushell/nushell/issues/16379
| wpm wrote:
| Is
|
| for i in 1..10 { print $i
|
| }
|
| really all that more readable than
|
| for i in {1..10}; do print $i
|
| done
|
| Like, am I taking crazy pills? They're basically exactly the
| same!
| kalterdev wrote:
| Bash is an advanced beast. In Bourne, it was
| for i in `seq 10` do print $i done
|
| Which is pretty much readable though. The only issue is Pascal
| vs C syntax. As a fan of the former, I admit that the latter is
| more advanced: it stacks better. E.g. consider
| if (test -f junk) rm junk
|
| against if test -f junk; then rm junk; fi
|
| The former "avoids semicolons that Bourne requires in odd
| places, and the syntax characters better set off the active
| parts of the command." [1]
|
| 1: Rc--The Plan 9 Shell https://9p.io/sys/doc/rc.html
| wpm wrote:
| The semicolon is required only when not using new lines to
| split the command words, as in
|
| sleep 60; do_the_thing_that_needs_a_minute_wait
|
| It's not necessarily required in the for loop either, I tend
| to prefer the more compact method of putting the "do" on the
| same line as the for. It can be written as
|
| for i in {1..10}
|
| do print $1
|
| done
|
| Having "done" be the signifier of the "the for loop context
| ends here" is 3 characters more than "}" or ")" or whatever
| else. "done" is more color coming off the screen with syntax-
| highlighting, and can be typed in two keypresses with a "d"
| and a "tab" in any editor from the last 30 years. It just
| seems like a very very inconsequential nitpick. At least
| Nushell doesn't pull a Python and just have "invisible space"
| be the end of the for-loop.
|
| One line conditionals are doable as well in the shell.
|
| test -f junk && junk
|
| or
|
| [[ -f junk ]] && junk
|
| You can even just use [ -f junk ] if double brackets is
| giving the yuck.
| cassepipe wrote:
| I have never seen the second version. Apparently it's there
| since bash 3.00 (2004). Maybe took inspiration from zsh who
| also has (or a common ancestor ?)
| Qwertious wrote:
| The former is easier to remember. You can't forget the
| semicolon if there isn't a semicolon to forget.
| runjake wrote:
| It depends on where you're coming from.
|
| To myself, I agree, but to a Windows native power user, the
| latter looks confusing.
|
| Source: Windows native colleagues.
| wpm wrote:
| Imagine though, if we shell-heads came over to Windows and
| started writing an entirely new shell to replace Powershell
| because we didn't want to learn Powershell. It's just so
| utterly bizarre to me. I guess people like what they like,
| and that's cool, but wanting to rip out a 40+ year old
| scripting environment and command line shell because it
| doesn't look like goddamn Ruby or Clojure or Rust or whatever
| is just intolerable.
| jiehong wrote:
| Still not super stable.
|
| Each releases breaks something, usually, and it's been like that
| for a few years (like the default config file that was generated
| is no longer parsed after an upgrade, or a function was renamed,
| etc.)
|
| I guess they are trying to go this way with their standard lib
| somehow.
| Aerbil313 wrote:
| Do not let the "shell" in the name fool you. Nu is a full on
| programming language. I've spent more time with it than pretty
| much any other lang and if I have to describe it in one sentence,
| I'd say: It's the most beautiful combination of the ease of
| Python, strictness and ergonomics of Rust and of course shell
| capabilities of Bash.
|
| It's really its own kind of thing. It's definitely not just
| another shell.
|
| I've written very impressive and very complex software in nu. I
| fully expect it to take off very fast as it nears a stable v1.0.
| I can't imagine going back to anything else.
| b00ty4breakfast wrote:
| this is very weird timing, I literally just installed nushell
| this morning lol. I like it so far but that may just be the
| novelty effect. I gotta find a syntax file for vim, tho, because
| moving over my bash aliases and trying to visually parse the
| config file after 10 lines or so is making me go cross-eyed.
| sunshine-o wrote:
| Nushell is a fantastic project.
|
| Something I came to appreciate is that the 50MB binary is really
| battery included. You will be able to deal with JSON, XML, SQLite
| DBs, HTTP requests and more. I personally do not need anything
| else.
|
| Now, no matter how much you get excited about it, do not write
| too much production code with it as it still change and break
| often between releases.
| Sunscratch wrote:
| I've created a small utility script at work that automates some
| routine tasks and nicely formats the collected data in a table,
| and I can say that Nushell is an amazing tool.
___________________________________________________________________
(page generated 2026-01-07 23:01 UTC)