Which Linux command or utility is simple, powerful, and surprisingly unknown to many people or used less often?
This could be a command or a piece of software or an application.
For example I’m surprised to find that many people are unaware of Caddy, a very simple web server that can make setting up a reverse proxy incredibly easy.
Another example is fzf. Many people overlook this, a fast command-line fuzzy finder. It’s versatile for searching files, directories, or even shell history with minimal effort.
A few that I use every day:
- Fish shell
- Starship.rs
- Broot (a brilliant filesystem navigator)
- Helix editor (My favorite editor / IDE, truly the successor to vim IMO)
- Topgrade (updates everything)
Do you have experience with either ranger, lf, or yazi? I’m wondering how broot compares. Big fan of file ranger, and this looks very similar.
I’ve used ranger, but I’m not as big a fan of it as broot.
I heard about helix from you and I’ve used it for a year and a half or so now, it’s by far the best editor I’ve used so far and I can definitely vouch for it
Nice!
Just commenting to give more love to helix. It’s my favorite “small quick edits” editor.
Could you explain them in more depth? I opened them and don’t know
Helix is a terminal based text editor. It’s much like vim / neovim, but unlike those editors it’s good to go right out of the box, no configuration or plugins needed to make it work well.
Topgrade is one I haven’t used, but it looks like its intended purpose is to let you upgrade your apps with one command, even if you use multiple different package managers (I.e. if you were on Ubuntu, you could use it to upgrade your apt packages, at the same time as your snap packages, as well as flatpak, nix, and homebrew if you’ve added those.)
Thank you for explaining. I would never have understood topgrade without your example :)
Fish is a replacement of bash that’s a bit more user friendly (has some cool auto completion features out of the box and more sane behaviour like handling of spaces when expanding variables). I personally started to use nutshell recently but unlike fish it’s very different from bash.
Starship is a “prompt” for various shells (that bit of text in terminal before you enter the command that shows current user and directory in bash). I haven’t used it but AFAIK it has many features like showing current time, integration with git, etc.
Yep, here’s my Starship prompt, for example:
So, I have it configured to show:
- the exit code of the last command (if it’s non-zero),
- the duration of the last command (if it’s longer than 2 seconds),
- the time (when the last command ended),
- the current directory,
- the current Git branch, and it also shows some Git status information, for example the
means I have something stashed,
- and finally the technology in use in a repository/directory, so in this case that repo uses Rust and the compiler version is 1.83.
Thanks for adding this. What does stashed mean
Oh, when you’re coding something in a Git repo and you realize that you need to make a different change before you continue coding (e.g. switch to a branch, pull newest changes, or just create a separate smaller commit for part of your change), then you can run
git stash push
to put away your current changes, then make your other change, and then rungit stash pop
to bring your ongoing changes back. I recommend readinggit stash --help
, if you want to use it.Sometimes, though, you might end up just taking it into a different direction altogether or simply forget that you had something stashed. That’s when that indicator comes in handy. Because while you can have multiple things stashed, I do find it’s best not to keep them around for too long. If you do want to keep them for longer, then you can always create a branch and commit it as WIP onto there, so that you can push it onto a remote repo.
This is sick!! Would you mind sharing your config?
Nope, I’m glad to share.
I personalized it from the “Gruvbox Rainbow” preset from here: https://starship.rs/presets/
So, you might prefer that, if you’re not, well, me.You will need to set up a NerdFont, like the Starship installation guide says.
Here’s my configuration:
Spoiler
"$schema" = 'https://starship.rs/config-schema.json' format = """ [$status](bg:color_red fg:color_fg0)\ [](fg:color_red bg:color_orange)\ [$cmd_duration](bg:color_orange fg:color_fg0)\ [](fg:color_orange bg:color_yellow)\ [$time](bg:color_yellow fg:color_fg0)\ [](fg:color_yellow)\ $line_break\ [$directory](bg:color_aqua fg:color_fg0)\ [](fg:color_aqua bg:color_blue)\ [$git_branch\ $git_status](bg:color_blue fg:color_fg0)\ [](fg:color_blue bg:color_bg3)\ [$c\ $rust\ $golang\ $nodejs\ $php\ $java\ $kotlin\ $haskell\ $python\ $docker_context](bg:color_bg3 fg:color_fg0)\ [](fg:color_bg3)\ $line_break\ $line_break""" palette = 'gruvbox_dark' [palettes.gruvbox_dark] color_fg0 = '#ffffff' color_bg1 = '#3c3836' color_bg3 = '#665c54' color_blue = '#458588' color_aqua = '#689d6a' color_green = '#98971a' color_orange = '#d65d0e' color_purple = '#b16286' color_red = '#cc241d' color_yellow = '#d79921' [status] disabled = false symbol = "" format = ' $symbol $status ' [username] format = ' $user ' [directory] format = " $path " truncation_length = 3 truncation_symbol = "…/" [directory.substitutions] "Documents" = " " "Downloads" = " " "Music" = " " "Pictures" = " " "Projects" = " " [git_branch] symbol = "" format = ' $symbol $branch ' [git_status] style = "bg:color_aqua" format = '$all_status$ahead_behind ' [nodejs] symbol = "" format = ' $symbol $version ' [c] symbol = " " format = ' $symbol $version ' [rust] symbol = "" format = ' $symbol $version ' [golang] symbol = "" format = ' $symbol $version ' [php] symbol = "" format = ' $symbol $version ' [java] symbol = " " format = ' $symbol $version ' [kotlin] symbol = "" format = ' $symbol $version ' [haskell] symbol = "" format = ' $symbol $version ' [python] symbol = "" format = ' $symbol $version ' [cmd_duration] format = ' $duration ' [time] disabled = false time_format = "%R" format = ' $time ' [line_break] disabled = false
Once Helix gets plugin support and someone makes a Clojure REPL plugin as good as Conjure I am never touching
vim
again!It does have clojure lsp support, but you’ll probably have to use a command line for most repls.
Yeah the clojure lsp support is top notch, but there being no support for “jacking in” to a repl is the big thing keeping me from using helix full time. There’s a way of doing it if you use kitty, but it’s pretty janky.
Helix is great thanks
I’ve actually been testing with fish recently coming from zsh, though I might wait until 4.0 fully releases before I make a more conclusive decision to move or not.
With that said, I remember looking through omf themes and stumbled onto Starship that branched off one of the themes and really liked the concept.
One thing that holds people back sometimes is that bash scripts that set environment variables don’t work by default. https://github.com/edc/bass is an easy solution
I love
ncdu
for seeing where all my storage is being taken up.Most listed in some form elsewhere, but
- Ugrep
- ranger/lf
- tmux (splitting terminal and detatching/reattaching when I’m sshing onto server, etc)
I’ve also been enjoying Kate. It’s a decent text editor, but the ability to Ctrl + / to pipe selected lines through any Linux command (Uniq, shuf, etc) is a bit of a superpower for an editor
socat
- connect anything to anythingfor example
socat - tcp-connect:remote-server:12345
socat tcp-listen:12345 -
socat tcp-listen:12345 tcp-connect:remote-server:12345
pdfgrep for the well maintained company’s project folder of your choice.
I use fuck to fix typos
That sounds dangerous. I hope it never tries to fix anything with
rm
You have to confirm any command before it runs, so no more dangerous than baseline rm
If you’d map it to just
f
it’s even more handyYou gain efficiency, but lose fun
this just reminds me of
please
which runs the previous command withsudo
sudo !!
Will also run the previous command with sudo, fwiw.
Game changer!
That’s fantastic, I can’t wait to go home and install it
- awk
- the (usually rust-based) coreutils “alternatives” like bat, fd, eza, procs
- trash-put (rm with trash integration. But beware that it also operates on directories by default, which rm only does with -r. There should be an option to change that behavior but there isn’t. Don’t alias rm to this)
- wl-copy/paste (or the older one for X11, ‘xclip’ IIRC. Enables you to do stuff like “cat image.jpg | wl-copy” to copy it to the clipboard. Best alias it to something shorter)
- xdg-open (open the file using your associated program for that file type. Alias to “o” or so)
- pass (awesome password manager, when you have a GPG key pair. Even better in combination with e.g. wofi)
- notify-send (to send GUI notifications from shell scripts)
- ledger (plain-text accounting software. If you use Emacs you should take a look at this as it’s written by an Emacs dev, and has good integration of course)
- nc
- nohup
jq - super powerful json parser. Useful by hand and in scripts
I love jq, but I wouldn’t call it “surprising simple” for anything but pretty-formatting json. It has a fairly steep learning curve for doing anything with all but the simplest operations on the simplest data structures.
jq
andyq
are both things I install on pretty much every machine I have.Combine with jc to process CSV files. This is how I get data into my plain text accounting system.
It can also format minimized JSON from cURL API requests
vd
(VisiData) is a wonderful TUI spreadsheet program. It can read lots of formats, like csv, sqlite, and even nested formats like json. It supports Python expressions and replayable commands.I find it most useful for large CSV files from various sources. Logs and reports from a lot of the tools I use can easily be tens of thousands of rows, and it can take many minutes just to open them in GUI apps like Excel or LibreOffice.
I frequently need to re-export fresh data, so I find myself needing to re-process and re-arrange it every time, which visidata makes easy (well, easier) with its replayable command files. So e.g. I can write a script to open a raw csv, add a formula column, resize all columns to fit their content, set the column types as appropriate, and sort it the way I need it. So I can do direct from exporting the data to reading it with no preprocessing in between.
jq?
yq can do both JSON and YAML :)
https://github.com/johnkerl/miller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON
Funny how this was one of the first tools I learnt once I “seriously” started my linux journey, lol
I use it occasionally but every time I need to do something a tiny bit more complex than “extract field from an object” I have to spend half an hour studying its manual, at which point it’s faster to just write a Python script doing exactly what I need it to do.
Check out https://www.nushell.sh/ I use it for exactly that, i.e. complex extract and convert files
I actually installed it recently out of curiosity, but I’m hesitant about learning its advanced features like that. At least jq is a standalone tool that’s more ubiquitous than nushell, so you can rely on it even in environments that you don’t fully control (e.g. CI like GitHub Actions). And if you use it in some public code/scripts then other people will be more familiar with it too.
Not powerful, but often useful,
column -t
aligns columns in all lines. EG$ echo {a,bb,ccc}{5,10,9999,888} | xargs -n3 echo a5 a10 a9999 a888 bb5 bb10 bb9999 bb888 ccc5 ccc10 ccc9999 ccc888 $ echo {a,bb,ccc}{5,10,9999,888} | xargs -n3 echo | column -t a5 a10 a9999 a888 bb5 bb10 bb9999 bb888 ccc5 ccc10 ccc9999 ccc888
I really enjoy erdtree as a ls replacement
grep goes crazy if you know your regex
I love flexibility with regex, personally I use ugrep as it also allows utilization of boolean and/or/not logic for more complicated searches.
Check out my chapter on GNU grep BRE/ERE for those wanting to learn this regex flavor: https://learnbyexample.github.io/learn_gnugrep_ripgrep/breere-regular-expressions.html (there’s also another chapter for PCRE)
I can never get grep to work consistently on Mac and Linux. Now, ripgrep OTOH…
That’s because Macs generally use BSD-based command line tools instead of GNU ones. You have to do a lot of Homebrew jiggery-pokery to approximate a GNU environment. Know Your Tools: Linux (GNU) vs. Mac (BSD) Command Line Utilities
Alas, doesn’t fit my purpose since it requires action by the script user. I usually just use perl in those situations
xargs
paste. I don’t think a lot of people know this command, but it can be handy at times