

If you want to do a Bash like management and programming, that is not dramatically different but fixes some irritations, then Fish is an alternative. Obviously it will not fix all issues, but there is no paradigm shift in handling streams. nushell is dramatically different and at that point, I would rather use a programming language to do the stuff. Speaking of programming language, there is also Xonsh (basically Python+Bash like combination as a system shell).
All these alternatives have a singular big flaw to me: they are not the standard tools on the system, which defeats the purpose of a system shell to me. In the end, without changing the core system that these shells are built on, I don’t think its possible to make a really well made language that interoperates on system level like a shell does at the moment.
That’s the reason why I got a bit more into Bash to understand some flaws, to understand how to use regexes inside Bash and variable substitutions and a few other concepts that are very useful to know. But man… there are so many traps… like looping over a wildcard for files (such as for file in *.txt
) and if the wildcard does not match, then the loop consists of the wildcard as a literal word as if “*.txt
” was a filename. What a stupid idea. There is an option to change that, but that’s the issue. The language is filled with traps and optional options and you have to know all of them.
Edit: Added example code why default behavior sucks:
$ for file in *.ABCD; do echo "${file}"; done
*.ABCD
shopt -s nullglob
$ for file in *.ABCD; do echo "${file}"; done
Yes, I use shellcheck in the editor. Its pretty useful. But running (a little bit more complex commands) in the terminal directly won’t help with shellcheck. That’s why I also have a functionality to directly load and edit the current command in the terminal in (Neo)vim and edit and when closing Vim the command gets executed. The benefit doing this is getting checked by shellcheck in the editor and also it makes it easier to one-off complex commands.
Thanks to shellcheck I got in the habbit to always enclose variables in
${var}
. And recently learned from a community member that using[[ expr ]]
style has basically no downsides against using[ expr ]
directly.