1. 53

I previously asked this in 2020 [1] and I think many of us learned of some upcoming and interesting tools.

I use “non-standard” loosly here. We’re looking for CLI utilities that are definitely not part of the POSIX required or optional utilities, and more coloquiallly not considered to be standard BSD or *nix fare.

[1] https://lobste.rs/s/eprvjp/what_are_your_favorite_non_standard_cli

  1.  

    1. 21

      I actually picked up a few from the last thread that I continue to use today

      • xsv: CSV swiss army knife
      • gron: Make working with JSON easier to grep
      • direnv: Used in conjunction with devenv and ess for local development secrets/settings

      Some new ones I’ve started using since last time

      • devenv: I use devenv (flakes) for all new projects
      • ess: Keep env.sample in sync with .env, so secrets and settings get documented. I use it in a post-commit hook.
      • khal/ikhal: Calendaring in the terminal. This runs in a set of kitty windows with aerc and typically di-tui
      • aerc: Terminal email client
      • nh: More pleasant nix cli
      • qrencode: QR encode stuff from the command line

      The ones I’ve been using for many years

      Tools typically only used inside projects (via devenv dependency)

      • svu: semantic version util
      • pre-commit: shareable pre-commit hooks
      • devenv
      • ess

      I’ll keep editing as I think of more.

      1. 4

        xsv: CSV swiss army knife

        If you’re familiar with SQL, I’ve found that duckdb has pretty much replaced my usage of xsv and csvkit.

      2. 3

        Slightly off topic, but I find this alias really handy for quickly qr encoding stuff I want to access on other devices:

        alias quickqr=‘a() { qrencode -o /tmp/qr.png $1 && ((xdg-open /tmp/qr.png; sleep 15; rm /tmp/qr.png ) &)}; a &>/dev/null’

        e.g. quickqr lobste.rs

        [update]

        Even more off topic – you’re probably a lot better off using qrencode’s -t ansiutf8 switch to print the qr directly to your terminal. Either I missed this switch years ago, or it didn’t exist when I created this alias.

        I’ve updated it to the much more sensible

        alias quickqr=“qrencode -t ansiutf8 $1”

        1. 5

          I’ve been using qrencode -t ANSI256UTF8 blahblah for copying OTPs from my Authy export to my ReinerSCT doodad. Super handy.

      3. 1

        I use devenv(lorri,flakes) with the flakes version as a fallback. Lorri has some really nice features when it comes to flakes.

      4. 1

        direnv: Used in conjunction with devenv and ess for local development secrets/settings

        I haven’t used it yet, but a lot of people sound enthusiastic about mise as a superset of this functionality.

        1. 2

          IME, mise is a nicer asdf, with a good UI. I’ve used it in the past for controlling versions of software tools, but as a general tool, it’s sometimes not the best for more complicated setups. E.g., I prefer uv for my Python needs.

          And unlike nix (which devenv is based off), it can’t control nearly as many things if you need super-fine-grained and/or extensive versioning.

          1. 2

            Thank you!

    2. 12

      I didn’t see this one mentioned in the last thread, so I’ll post it here:

      fq is basically jq for binary formats. Whilst not so useful for programming it tends to be very useful for quick reverse engineering of formats or if you need to inspect some metadata information stored in binary data.

      1. 2

        I tried fq on some binary file and was disappointed by the gobbledygook, but it turns out /usr/bin/fq on ubuntu is a log viewer for nq/tq jobs … ie. install it from github, not apt :)

        1. 3

          :D yeap sadly there is a name collision :( hope the intended fq gave more resonable output

          1. 1

            it did! It’s actually surprisingly interesting to just fq . random binaries :-D

            1. 1

              🥳 i also casually poke around with fq at times, good way to get motivation when something unknown looks interesting :)

    3. 11

      In alphabetical order, here are a few that come to mind:

      • entr: run a command when files change
      • ffmpeg: convert audio/video (see also: ffmpeg buddy)
      • ncdu: analyze disk space
      • pwgen: generate passwords
      • shellcheck: lint shell scripts
      • tig: git log interface I prefer (among other features)
      • tmux: windows and splits in your terminal (among other features)
      • tree: print directory trees nicely
      • yt-dlp: download audio/video from many sources
      • zopfli: make gzip-compatible files that are smaller than gzip. Also see zopflipng
      1. 4

        ncdu is one I can never remember when I need to go byte hunting. I’ll add it to my nixos config this time :)

        1. 3

          Consider trying duc : http://duc.zevv.nl/

    4. 11

      One I use often is xh as an httpie replacement without depending on python. It has (in my opinion) a more intuitive command interface and can optionally print out the equivalent curl invocation for you

      1. 2

        Thank you! I’ve been looking for a competent HTTPie replacement for a while, and xh looks good.

    5. 11

      Nobody yet has mentioned ugrep, my favorite grep.

      The ug -Q command opens up an interactive regex-builder that searches for results as you edit the regex. It’s like those websites that teach you how to write regex queries, except inside your own file system, and it can compose with other CLIs.

      I also love the ELFKickers tool suite. They are obscure but I use them all the time. Especially sstrip (a strip-ier strip) and elfls, but the others are also great.

    6. 9

      I am a caveman that doesn’t really stray outside of the posix toolset that often, but there’s some invaluable stuff I’ve picked up

      • jq is pretty well known, but I also use pup extensively for when I want to do some website automation/parsing without needing an api key or whatever
      • ripgrep, of course
      • atool for managing archives without needing to memorize 30 different flags across several different programs
      • jdupes for finding duplicate files and deleting/hardlinking them when needed
      • libxml2 has some neat utilities for working with xml files

      and some more stuff that mainly appeals to media nuts/archivists like me:

      • free-bandcamp-downloader for downloading free/nyp albums from bandcamp
      • yt-dlp for downloading videos from a ton of sites
      • gallery-dl is basically the analogue to yt-dlp for image hosting sites
      • TwitchDownloader for downloading twitch chat
      • exiftool for working with EXIF data in images/formatted printing/etc.
      • ffmpeg for video transcoding/inspection/etc.
      • flacconv is something I made for converting flac files to opus/mp3
      1. 6

        yt-dlp properly handles Bandcamp albums now.

        1. 2

          it still only downloads the surface-level mp3 128k files from bandcamp–it can’t navigate the buttons and whatnot that need to be pushed to get a flac download link

          1. 1

            I didn’t realise free-bandcamp-downloader could get the FLACs from my account! Thank you, this is great news!

    7. 8
      • eza: a “replacement” for ls which generates nicer output than ls.
      • yazi: a terminal file manager. I used to use lf but I feel that yazi is being recently more actively developed. It renders images in the terminal out-of-the-box.
      • z: it tracks your most-used directories and then works as a “smartcd.
      • direnv: it has already been mentioned in this thread, but it has been such a game-changer for me, that I had to mention it as well. If you haven’t tried yet, you should!
    8. 8

      jj — a Git compatible version control system.

      acme (plan9port) — a text editor from Plan 9.

      yaegi — a Go interpreter.

      rc (plan9port) — a shell from Plan 9.

      tcc — a tiny C compiler. Featuring the -run flag.

      aunpack (atool) — an archive unpacker.

      rlwrap — a readlinifier. So your Emacs key bindings work.

      alejandra — a Nix formatter.

      cloc — a lines of code counter.

      1. 1

        oooh acme and rc :)

    9. 7

      for context, i am very hesitant to pick up new tools in general, since standard CLI utilities/applications get me 90% of the way there for most things - to introduce a tool into my kit, it really has to be exceptional in my mind.

      so, tools i can’t live without:

      • pa: a li password manager by me & arcxio (btw the website was all arcxio - it’s really cute imo)
      • jq
      • ijq
      • gron

      (can you tell i interact with json a lot?)

      • getcert (for the life of my i absolutely cannot recall the openssl invocation to get this info)
      • fd (i tried to go without this, but alas, i type this way too much)
      • gj (i often really do not care about git commit messages lmao)
      1. 4

        getcert

        highly recommend step, it’s laid out a lot better than openssl it handles MOST things i need to do w/ certificates

        it would be step certificate inspect "https://google.com"

        can also provide --format=json which is lovely

    10. 7

      pv, the pipe viewer, is super handy. I also use parallel sometimes. These aren’t mentioned much in the thread so far.

      1. 2

        +1 for pv and parallel. parallel is especially helpful when you’re mangling filenames with its {} twiddlers (and escape to Perl if you need something esoteric.)

    11. 7

      For mac users, pbcopy + pbpaste is a great little trick to get stuff in and out of your clipboard

      1. 2

        Also caffeinate will prevent your Mac going to sleep.

    12. 5
      • McFly: a context aware bash history search that replaces ctrl-r.
      • Zoxide: smart cd, as others have mentioned.
      • bat: fancy cat
      • curlie: fancy curl
      • lsd: fancy ls
      • ripgrep
    13. 5

      pv, moreutils, kakoune are the ones I use that aren’t already here

    14. 5

      Several I have not seen mentioned (in order of what I most frequently use):

      • watchexec. automatically run commands on file change
      • tokei. code counter
      • mosh, eternalterminal. ssh clients that let you resume disconnected sessions (i think mosh is unmaintained?)
      • btop. very nice looking resource monitor
      • dua-cli. Its interactive mode is very useful for cleaning up large swathes of files. It queries the disk in the background, dynamically updating the list of files, and allows you to perform the deletion directly in the tool and see updated file size amounts.
      • dive. interactive docker image explorer
      • jless. Interactive json file viewer
      • hexyl. hex viewer
      • asdf. version manager for a bunch of tools
      • zellij. honestly haven’t used this one very much but i’ll throw it out here anyway. tmux but rewritten in rust.

      Also not sure if this one counts since it’s not really a CLI tool but does enhance my terminal experience:

      • powerlevel10k. prompt that doesn’t lag the input. it goes back and updates the info line after the commands are done running so large git repos, for example, don’t cause my prompt to take a long time to load
    15. 4
      • xidel for querying XML
      • yq is a wrapper around jq which converts YAML into JSON and back (there are lots of such commands; I tend to use this one). Also provides xq for doing the same with XML.
      • ts (taskspooler) for sending commands to a background queue (WARNING: that site’s SSL certificate seems to be expired)
      • GNU parallel as mentioned by others.
      • ag the silver searcher, which replaces recursive grep.
      • pandoc for converting document formats.
      • ddgr is handy for searching with DuckDuckGo (and DuckDuckGo itself is handy for bang patterns which make it easy to search various other sites)
      • rclone for mounting network shares. I use this with S3-compatible storage, as an alternative to SSHFS, and for SMB/CIFS shares. I don’t bother with a config file, since it can also take options on the CLI.
      • zbar for reading QR codes. Very useful when sites don’t provide their otpauth:// URL as text, and I want to use pass otp as my authenticator.

      Annoyingly, moreutils conflicts with a couple of these:

      • Its timestamping command is called ts, which conflicts with taskspooler (Debian renames the latter to tsp for this reason)
      • It provides a parallel command which conflicts with GNU Parallel’s. I always prefer the latter, so I mark it “high priority” in my Nix configs so its bin/parallel symlink takes precedence.
    16. 4
      • fd (instead of GNU find)
      • rg (instead of recursive grep)
      • tsk (instead of JIRA)
      • rc (instead of bash; for scripts)
      • fish (instead of zsh; interactive shell)
      • dnsi (instead of nslookup/dig)
      • glow
      • entr
      • lf
      • ncdu
      • tree
      • pa for passwords, though I may swap this out
      • direnv

      Eventually I’m tossing around the idea of an AWK implementation that uses Pike’s structural regex and capture groups instead of FS, but we’ll see if I get to it.

      1. 3

        ayy i wrote pa - any reason for wanting to swap it out ooc?

        1. 2

          I haven’t decided if I will or not. I’m likely looking to unify my usage with agenix and maybe bitwarden for syncing. We’ll see though, I haven’t investigated too much yet. pa is nice and simple, so it works for scripts really well. It’s not quite clear to me how it decrypts the vault though? I haven’t dug through the code, but the fact that I can just do pa show ... without any sort of decryption/password step concerns me slightly and has prevented me from putting more in it.

      2. 2

        Thanks for introducing me to tsk, I like it a lot!

        1. 2

          Glad you like it! (I’m the author)

      3. 1

        rc (instead of bash; for scripts)

        Link?

        1. 2

          The original plan9 version has docs here.

          I usually use this version, though I found some bugs with child processes getting orphaned improperly that might push me to either fork it or try out the plan9port version.

          rc is much nicer to script than (ba)sh IMO, and I control all of my systems /shrug

    17. 4
      • jj: Has replaced the git CLI for me in the last few months
      • jq: tbh, I’m not sure how much longer this one counts as non-standard, but structured JSON at the terminal is supported by so many tools now and is nicer than awk
      • zoxide is basically for jumping to directories based on partial name matches as a cd supplement
      • bat is cat with line numbers and syntax highlighting
      • eza has nicer presentation out of the box and I also had an alias that used it as a git status replacement before moving to jj
      • rofi is nice for minimal GUI from shell scripts`when you need a picker or text input
      • fzf is similar for TUI
    18. 4

      I personally wrote quite a few that I still use extensively today:

      • human : factorize numbers for humans to read
      • cream/safe : general purpose encryption tool/password manager
      • pm : “package” manager. It basically keeps track of files installed from a tarball

      I also couldn’t live in a terminal anymore without those:

      • vis : vim + Sam editor
      • pick : fuzzy selector (similar to fzf)
      • dvtm/abduco : terminal multiplexer/terminal session detach feature
      • mk : from plan9ports
    19. 4

      I don’t use jq because my main shell is nushell and it can wrangle JSON and other formats like YAML, CSV, TOML, even INI with plugins!

      I wrote wrappers for commands I use frequently that output tabular data or benefit from autocomplete like docker, kubectl and so on. I have even more scripts strewn about my work laptop to do stuff that’s more specific to my company’s infra. I build pipelines to parse and filter and aggregate data very frequently. I’m just generally very happy with nushell, even though it still has its rough edges.

      Other stuff:

      • Starship is always my prompt. It looks nice and doesn’t require any config.
      • I use zoxide to jump around the filesystem.
      • nnn is my file manager, though I’m not very happy with it. I tried yazi but I don’t like it as much and last I tried it, copy and move operations would get “stuck” in the queue…
      • Helix Is my main editor. I’m really hoping the Scheme plugin system lands soon.
      • I use direnv and flakes to manage per-project configurations. For work repos I have a flake that just contains a bunch of devshells for each combination of tools I need, and an .envrc file in each repository that I add to .git/info/exclude so it doesn’t accidentally end up in my coworkers’ computers.
      • I recently started using atuin to manage shell history. I don’t use the sync or anything, I just prefer the search to nushell’s built-in search.
      • I use unar to decompress archives, because it supports a ton of formats and lets me forget about all the specific tools’ options.
      • fx is nice when I need to explore a huge JSON file and search through it.
      • doggo for the occasional “why isn’t this domain resolving correctly” query.
      • Jujutsu has recently replaced git for most things for me. It’s very nice. Though for some things I still use gitui such as exploring old commits or looking at files at a certain revision.
      • Obviously ripgrep.
      • magic-wormhole for quickly sharing files between computers and phones.
      • Ruby and in particular irb aren’t going away any time soon for me when I need to do some quick thinking.

      I probably picked a few up from previous threads, so feel free to take credit for what you like from here :)

    20. 3

      On my day to day at home and work:

      • nushell Largely replaced my use of bash/zsh and jq and yq.
      • shellcheck for all the times I do write bash because I need to share.
      • Glow tui reader/renderer for markdown
      • mlr swiss-army chainsaw replacing awk, sed, cut, join, and sort for CSV/TSV. Though I’m using it less since moving to nushell.
      • ag “ag” the Silver Searcher out of habit, ripgrep feels more ergonomic somehow and I’m weaning myself off ag.
      • babashka is becoming part of my workflow when I don’t need to share.

      At home I also use often:

    21. 3

      Most of the stuff I use will already be mentioned here, so I will add two slightly less common things:

      Oh, and the most important one, the shell: fish.

    22. 3
      • direnv
      • gron
      • jq
      • git
      • ripgrep
      • xz and zstd
      • shellcheck (but typically used from emacs)
      • tmux
      • weechat
      • notmuch (and mbsync, called by imapfilter)
      • entr (or just inotifywait)
      • wmctrl and xdotool (in scripts)
      1. 3

        Since you’ve broken the taboo, my own collection is here :)

        http://chriswarbo.net/git/warbo-utilities

    23. 3
      • cometary: a tool that I wrote that makes writing conventional commits easier
      • gron: makes JSON actually diff’able
      • kubecolor: adds colored output to all kubectl commands
      • up: allows interactive writing of Linux pipes
    24. 3

      Tilde. By far my favourite console/shell text editor, as I have written about.

      1. 2

        The search is over! Finally (apparently I am 13 years late though) a proper MSEDIT Clone.

        1. 1

          I can’t tell if you’re kidding or not. :-)

          Anyway, yes. I don’t write code; I tweak config files a bit.

          I don’t want any additional functionality aimed at writing code. I want my editor not to have extensions for programmers. I want it small, simple, and I want a familiar UI, ideally one that is close to the UI I normally work with on the desktop.

          This simple and reasonable position appears to baffle and bewilder most in the xNix and FOSS world.

          1. 2

            :⁠-⁠) I was serious. I learned about computers by opening files using MSEdit on MSDOS and try to figure out what’s what.

            I think discoverability is underrated. I’ve been a Linux user for 25 years. It was painful to get started in the beginning and there was this anti-microsoft mindset that refused to look at positive things Microsoft was doing.

            MSDOS gets little credit and is pretty much forgotten. But I think bill gates and his employees were really good at giving people what they wanted/needed. And they mastered the art of making things intuitive.

            With MSEdit, one only needed to know that you press alt plus the underlined leter. From that point on, you could explore the possibilities yourself.

            I remember some 10 years ago or so, emacs making a release highlighting the great breakthrough that the menus finally dropped down on the terminal. We are talking about 3 decades of delay comparing to Microsoft.

            1. 1

              Great to hear it. I completely agree!

    25. 3

      Trying to only list some that aren’t already listed:

      • broot for file management and also tab completion of file paths
      • tup for make-like tasks
      • highlight for syntax highlighting
      • wheezy.template for general template rendering
      • riff for nice diff views
      • edir for bulk renaming
      • lineinfile for otherwise difficult config insertions/changes/removals
      • croc for file transfers
      • yamlpath for YAML/JSON queries, insertions, and merges
      • lnav and tailspin for log viewing
      • xmq for reading XML and HTML as a human
      • pacaptr for package management wrapped in pacman syntax
      • Considering yage as an alternative to sops . . .
      • Hey no one’s mentioned micro?

      Some of my own:

      • zpy for Python venv, dependency, and tool management
      • NestedTextTo for type-conscious conversion between NestedText and JSON/TOML/YAML
    26. 2

      It is bundled with vim and so was installed on every *NIX system I used and I didn’t realise until recently that it wasn’t standard: xxd. Hex dump, with a reverse mode (so you can turn any text editor into a hex editor by piping the buffer through it and back). Can also generate a C header containing the binary, which is useful until #embed works everywhere.

    27. 2

      I’m not sure how non-standard it is, but I like git-delta a lot for viewing diffs.

    28. 2
      • tshark
      • mediainfo
      • bat is quite nice, also works great with my tool ansisvg to produce fancy graphics for presentations etc
    29. 2

      Lotta common ones with folks in here but I use:

      • jq - When I just need to script something with curl to do an action
      • eza - I use this on macOS + Linux because it looks as good as ls output does on windows with powershell
      • op - 1password CLI tool I use for .env files.

      Not much else :v

    30. 2

      screen (might be standard, I don’t know)

    31. 2

      I have nothing more to add to what everyone else said; the only one that might be useful is this small program I wrote to bookmark files and open them easily.

    32. 2

      I try to use GUI for most things, but lazygit is still my favorite git tool.

    33. 2

      devbox gives me everything I want out of a package manager on my Mac. That combined with direnv gives me per project repeatable dependency installation and I don’t have to use homebrew.

    34. 2
      • babashka has snuck it’s way into more of my dotfiles and daily workflow
      • pup always comes in clutch for some adhoc html scraping
      • yq jq for yaml
    35. 2

      I wrote septum to interactively search large codebases (>1 million lines). It looks for multi-line contexts of a specific width which match filters of terms to include or exclude. It works well on big projects like Unreal Engine and LLVM.

    36. 2
      • vils is a script I have updated from the original, which has gone. It lets you use vi(m) to edit a file listing for renaming etc. Comes in very handy more often than I thought it would.
      • dumpasn1 is use a lot for my work in ASN.1 lately. Need to compile it yourself in most places.
      • tig for viewing git history.
      • entr for running stuff when other stuff changes.
    37. 2

      I use my own tools which are part of the Offpunk package (disclaimer: I’m the main author)

      • offpunk: to browse the web from CLI, read RSS feeds and keep a “to read” list
      • opnk : to open files from the terminal with the good handler (using that one ten times a day)

      More rarely:

      • netcache: as a wget/curl alternative when offline
      • ansicat: to display a file directly in the terminal (but usually, opnk handles that for me)

      https://offpunk.net/

    38. 1

      The other day I learned Visidata can handle JSON (if it’s sufficiently tabular). There are things that I don’t like about the project, but I haven’t found anything nicer. (It has replaced most uses of spreadsheets for me.)

      Also, https://github.com/ihabunek/toot

    39. 1

      batch

      The command takes a list of items, lets you edit the list in your favorite text editor, then generates a shell script to batch process unchanged items, renamed items, and deleted items. You can edit the script to add your own logic for how to process each kind of item, and then run it.

    40. 1
    41. 1
      • fx - JSON and YAML viewer written in Go.
    42. 1

      qmv from renameutils is underappreciated - batch rename files using your usual text editor!