diff --git a/content/posts/cli-renaissance/index.md b/content/posts/cli-renaissance/index.md index 698eac2..629c5c4 100644 --- a/content/posts/cli-renaissance/index.md +++ b/content/posts/cli-renaissance/index.md @@ -213,8 +213,84 @@ but its an extremely usable IDE out of the box thanks to having all of its featu ### Helpful error messages +When the user does do something wrong, it is vital to let them know exactly what, where, and how it went wrong, +and if at all possible, what action the user can do to fix it. +`Operation Failed`, `Error` or `syntax error` on their own are horrible error messages. +They tell you that something *somewhere* failed, giving almost no information the user can use to troubleshoot. +In the worst case, they can even point you in a completely different direction than what is actually needed to fix things. +Git is a good example of this. As much as I love git, sometimes its error messages are the opposite of helpful. +To borrow an example from [Julia Evans](https://jvns.ca/blog/2024/04/10/notes-on-git-error-messages/#git-checkout-asdf), +if you run `git checkout SomeNonExistantBranch`, you get: +`error: pathspec 'SomeNonexistantBranch` did not match any file(s) known to git`. +This is confusing because you are trying to checkout a branch, you arent thinking about files. -TODO [before](../nushell) +Another example, I covered [before](../nushell) is the contrast between Bash and Nushell. +Consider the following script: +{{}} +$ for i in $(ls -l | tr -s " " | cut --fields=5 --delimiter=" "); do +echo "$i / 1000" | bc +done +{{}} + +This gets the sizes of all the files in KiB. But what if we typo the cut field? + +{{}} +$ for i in $(ls -l | tr -s " " | cut --fields=6 --delimiter=" "); do +echo "$i / 1000" | bc +done + +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +(standard_in) 1: syntax error +{{}} + +Due to the syntax error coming from bc rather than bash directly, +even the line number it gives you is misleading, +and in order to have the slightest clue whats going on, +you have to start print debugging. + +The equivalent in nushell would be: + +{{}} +> ls | get size | each {|item| $item / 1000} +{{}} + +and the equivilant error would be: +{{}} +> ls | get type | each {|item| $item / 1000} +Error: nu::shell::eval_block_with_input + + × Eval block failed with pipeline input + ╭─[entry #5:1:1] + 1 │ ls | get type | each {|item| $item / 1000} + · ─┬ + · ╰── source value + ╰──── + +Error: nu::shell::type_mismatch + + × Type mismatch during operation. + ╭─[entry #5:1:30] + 1 │ ls | get type | each {|item| $item / 1000} + · ──┬── ┬ ──┬─ + · │ │ ╰── int + · │ ╰── type mismatch for operator + · ╰── string + ╰──── + +{{}} + +Though the first error isnt helpful, the second one tells us right away that `$item` is not what we expect it to be, +hopefully pointing us to the `get type` mistake. +Nushells error messages are miles ahead of other shells just... +being useful, helping you find where you made an error, +rather than just telling you theres an error *somewhere*. ### Concise and discoverable documentation @@ -325,9 +401,25 @@ allowing for more people to experiment with the design and ergonomics of CLI too ## Conclusion -TODO - +> If I have seen further than others, it is by standing on the shoulders of giants. + +-- Isaac Newton, 1675 + +Once again, Id like to state that I am not advocating for shiny new tools *because* they are shiny and new. +Likewise, I dont think the old tools are *bad*, nor does their age alone count against them. +However, new tools have the opportunity to learn from their predecessors and build upon them. +In this way, the new tools are a tribute to those tools that came before; +a recognition of their strengths, an acknowledgement of their weaknesses. + +Now, these new tools are not the be-all end-all of the command line interface. +Just because this new generation of tools improve on the old ones, +it does not mean they are themselves perfect. +As we use these tools, we will become familiar with them, +and we will discover their sharp edges, +or their common usecase will change, +or we develop a new usecase entirely. +And when these things happen, we will develop yet another generation of tools, +one further polished and adapted to new usecases. ## Appendix: the tools