diff --git a/content/posts/clirenaissance.md b/content/posts/clirenaissance.md index 74c9fd4..ebb486b 100644 --- a/content/posts/clirenaissance.md +++ b/content/posts/clirenaissance.md @@ -4,58 +4,80 @@ date = 2024-03-04T12:20:02-06:00 draft = true +++ -Id like to talk about a trend Ive seen these past few years, where people are rewriting core CLI tools, -why I think this trend is a good thing, and why I think this trend might be happening. + + + + +Take a look at this [table](#appendix-the-tools) at the bottom of the page. Ill +wait. Notice the relative scarcity between ~1995 and ~2015? Id like to talk +about a trend Ive seen these past few years, where people are rewriting and +rethinking staples of the CLI, why I think this trend is a good thing, and why I +think this trend might be happening. ## History @@ -86,20 +108,38 @@ the way that error messages can teach, the value of a good out of the box experience, and the value of documentation that is easy to find and digest. -## The new tools +## Exploration of the solution space -These changes to the environment surrounding CLI apps has, in recent years, +These changes to the environment surrounding CLI apps has in recent years, led to a resurgence in development of command line utilities. -Instead of just developing tools that dont exist, +Instead of just developing completely new tools, Ive noticed that people are rethinking and reinventing tools that have existed since the early days of Unix. -## Exploration of the design space - ## The lessons learned from the past +A large amount of the innovation in the area, I think, can be attributed to +lessons that have been learned in 50 years of using software; sharp edges we +have repeatedly cut ourselves on, unintuitive interfaces that repeatedly trip us +up, and growing frustration at the limitations that maintaining decades of +backwards compatibility imposes on our tools. + +These lessons have been gathering in the collective conciousness, through +cheatsheets, guides, and FAQs; resources to guide us through esoteric error +messages, complex configurations, and dozens upon dozens of flags. + +Id like to go over a couple of the more prominent lessons that I feel terminal +tools have learned in the past several decades. + ### A good out of the box experience +While configurability is great, one should not need to learn a new configuration +language and dozens or hundreds of options to get a usable piece of software. +Configuration should be for customization, not setup. + +One of the earliest examples of this principle may be the fish shell. +Both zsh and + ### Friendly error messages @@ -127,3 +167,65 @@ Ive noticed that people are rethinking and reinventing tools that have existed s +## Appendix: the tools + +This is an extremely unscientific table of command line tools that I have tried, +have used, or currently use. It is assuredly incomplete, but *should* be broadly +representative. The date data has been gathered from the first git commit where +available, wikipedia otherwise, and sorting is by year first, then alphabetical. + +|tool|year|language| +|-|-|-| +|ls|1961|c| +|cat|1971|c| +|cd|1971|c| +|cp|1971|c| +|man|1971|c| +|rm|1971|c| +|grep|1973|c| +|diff|1974|c| +|sed|1974|c| +|bc|1975|c| +|make|1976|c| +|vi|1976|c| +|awk|1985|c| +|screen|1987|c| +|[vim](https://www.vim.org/)|1991|c| +|midnight commander|1994|c| +|ssh|1995|c| +|[fossil](https://fossil-scm.org/home/doc/trunk/www/index.wiki)|2006|c| +|[tmux](https://github.com/tmux/tmux)|2007|c| +|[git](https://git-scm.com/)|2008|c| +|[go 1.0](https://go.dev/)|2012|go| +|[fzf](https://github.com/junegunn/fzf)|2013|go| +|[eza/exa](https://github.com/eza-community/eza)|2014|rust| +|[neovim](https://neovim.io/)|2015|c| +|[pueue](https://github.com/Nukesor/pueue)|2015|rust| +|[rust 1.0](https://www.rust-lang.org/)|2015|rust| +|[just](https://github.com/casey/just)|2016|rust| +|[micro](https://micro-editor.github.io/)|2016|go| +|[nnn](https://github.com/jarun/nnn)|2016|c| +|[ripgrep](https://github.com/BurntSushi/ripgrep)|2016|rust| +|[fd](https://github.com/sharkdp/fd)|2017|rust| +|[bat](https://github.com/sharkdp/bat)|2018|rust| +|[broot](https://dystroy.org/broot/)|2018|rust| +|[difftastic](https://difftastic.wilfred.me.uk/)|2018|rust| +|[hyperfine](https://github.com/sharkdp/hyperfine)|2018|rust| +|[lazygit](https://github.com/jesseduffield/lazygit)|2018|go| +|[lsd](https://github.com/lsd-rs/lsd)|2018|rust| +|[nushell](https://www.nushell.sh/)|2018|rust| +|[scc](https://github.com/boyter/scc)|2018|go| +|[sd](https://github.com/chmln/sd)|2018|rust| +|[git-delta](https://github.com/dandavison/delta)|2019|rust| +|[grex](https://github.com/pemistahl/grex)|2019|rust| +|[starship](https://starship.rs/)|2019|rust| +|[tre](https://github.com/dduan/tre)|2019|rust| +|[typst](https://typst.app/)|2019|rust| +|[diskonaut](https://github.com/imsnif/diskonaut)|2020|rust| +|[helix](https://helix-editor.com/)|2020|rust| +|[pijul](https://pijul.org/)|2020|rust| +|[zellij](https://zellij.dev/)|2020|rust| +|[zoxide](https://github.com/ajeetdsouza/zoxide)|2020|rust| +|[btop](https://github.com/aristocratos/btop)|2021|c++| +|[ast-grep](https://github.com/ast-grep/ast-grep)|2022|rust| +|[yazi](https://github.com/sxyazi/yazi)|2024|rust| diff --git a/content/posts/nushell.md b/content/posts/nushell.md index 19a2480..07be070 100644 --- a/content/posts/nushell.md +++ b/content/posts/nushell.md @@ -3,24 +3,24 @@ title = "Nushell first impressions" date = 2024-03-01T11:34:04-06:00 +++ -Ive been trying out a bunch of new shell utilities lately, -switching up my shell, terminal multiplexer, and even experimenting with my editor. -Today, Id like to focus on my experiments with my shell. +Ive been experimenting with the tools I use on a regular basis lately -- switching +up my shell, terminal multiplexer, and even trying out other editors. Today, +Id like to focus on my experiments with my shell. ## My old setup Before this, I had been using a minimal zsh setup for a long time, with only built in features and a handmade prompt. -Zsh is a good shell, probably one of the best posix shells out there, -and I still use it when a posix shell is needed. +Zsh is a good shell, probably one of the best POSIX shells out there, +and I still use it when a POSIX shell is needed. -However, I got tired of the endless footguns that posix shell scripting imposes, +However, I got tired of the endless footguns that POSIX shell scripting imposes, easy to make errors around quoting, word splitting, and escaping, the sort of thing that makes [shellcheck](https://www.shellcheck.net/) necessary. I played around with fish for a few days, but it had many of the same fundamental design choices, mainly, being 'stringly typed', -that made posix shells such a displeasure to work with. +that made POSIX shells such a displeasure to work with. ## A Nu shell @@ -95,7 +95,7 @@ explanatory comments. ## Parsing non-nu tools But what if our tool/text file isnt in a format nushell understands? -Thankfully, for most formats, parsing is relatively straightforward. +Thankfully, for most formats parsing is relatively straightforward. Lets take this NGINX server log, for example (not a log of real traffic, just a sample log I found) @@ -108,8 +108,7 @@ sample log I found) {{}} -We can parse it into a nu table like so (each line has a comment explaining what -it does, for those unfamiliar with the nushell language): +We can parse it into a nu table like so: {{}} open access.log | @@ -122,9 +121,10 @@ update time {into datetime -f '%d/%b/%Y:%T %z'} | # parse into proper integer update bytes_sent {into int} {{}} +(each line has a comment explaining what it does, for those unfamiliar with the nushell language) Now that we have it in nushell tables, we can bring all of nushells tools to -bear on the data. We could, for example, plot a histogram of the most common +bear on the data. For example, we could plot a histogram of the most common ips, just by piping the whole thing into `histogram ip`. We could easily calculate the average bytes sent per request. We could group the records by the day or hour they happened, and analyze each of those groups independently. And @@ -135,7 +135,7 @@ While it would be a pretty long one liner if we decided to put it in a single line, its still quite easy and straightforward to write. Most log formats and command outputs are similarly straightforward. -## Defining custom commands, with built in arg parsing +## Defining custom commands, with built-in arg parsing Nushell has a feature called Custom Commands, which fill the same purpose as functions in other shells/programming languages, but are a bit more featurefull @@ -278,7 +278,7 @@ echo "$i / 1000" | bc done {{}} -This gets the sizes of all the files in kib. But what if we typo something? +This gets the sizes of all the files in KiB. But what if we typo something? {{}} $ for i in $(ls -l | tr -s " " | cut --fields=6 --delimiter=" "); do @@ -367,8 +367,9 @@ to make 'scripts' that are integrated with the rest of nushell. ## So, overall, is it worth it? -Nushell is certainly an interesting project, and I will almost certainly be +Nushell is certainly an promising project, and I will almost certainly be continuing to use it as my daily shell. It cant do everything, but dropping into zsh for a task or two every once in a while isnt that big a deal for me, and having access to such a powerful shell by default has made other tasks much -easier for me. +easier for me. If you regularly use pipelines in your default shell, consider +giving Nushell a try.