Whenever I need to spin up a local server to work with bits of static HTML, I reach for devd. It’s a super fast, self-contained binary with great ergonomics. Running devd -lo . serves the current directory, opens (-o) your browser for you, and automatically livereloads (-l) your browser whenever any of the files change. It can do much more, including simulating bad connections, reverse proxying, and generating ephemeral self-signed TLS certificates, but I’m completely happy with just the basics.
In that same vein, my shell has python -m SimpleHTTPServer aliased to webserver so I can quickly browse a directory on a remote machine through a web browser and python is usually installed everywhere.
Also: python3 -m http.server :) As ridiculous as it sounds, I’ve actually had performance issues with Python’s built-in server, especially when I have a bunch of async requests on a page. Devd solved that for me.
entr - watches files/directories and executes an arbitrary command when they change.
stow - a utility for easily managing symlinked dotfiles
smu - a small markup-like implementation that’s easy to pipe to.
nmh - a unix-y approach to command line mail (I never really liked mutt). Basically nmh is made of a handful of small, discrete utils that are easy to pipe together.
pycco - just started using this recently to make documentation easier to write - I’m not sure if I like the quality of documentation that comes out, but I definitely like how easy it is to keep docs up to date.
youtube-dl - can download youtube/gyfcat/imgur videos (or gifvs), but I just download to stdout and pipe to mpv to stream them.
qutebrowser - a minimal vim-like browser. Works with most sites I visit (and I have a keybinding to pop open youtube-dl/mpv when I’m on a site that youtube-dl supports.
inox - patched version of chromium that supposedly doesn’t phone home to Google as much. I use it whenever qutebrowser doesn’t work on a site.
Linux/BSD/Xorg specific
Basically anything from suckless.org, including st (a terminal emulator), slock (a minimal x screen locker), dwm (a small window manager) and dmenu (a searchable X menu).
lemonbar - small X bar that is fed data by a pipe (flexible, so it can be used for other things like popup notifications too)
Hmm… it’s using QtWebkit, so I’m not entirely sure. However, the qutebrowser project just got a lot of funding to replace the rendering engine with chromium’s blink engine, which will probably improve security/support on “modern” websites.
par - A really handy utility for reflowing text in a particular column limit. Works well in source code with comments or email quotes. My favorite bit is that the man page contains an apology for its complexity. :-)
git gui is one of the few tools I’m willing to leave my terminal for. I use it in particular for committing things in patch mode.
bpython - A souped up Python interpreter. Not quite to the level of ipython, but has niceties like auto completion and doc string snippets.
I do actually use tig daily but I thought it was just a viewer for history? git gui is nice because it makes effective use of the mouse for patch mode commits.
You’re not mistaken. :-) In tig’s “Status view”, you can stage individual files, chunks, and lines for committing. This blog post is a nice overview of tig’s features.
I use tig every day and often recommend it to colleagues who git add or git add -i.
Some one brought this to my attention, may be a year or so ago. Recently, for the work that I do, I got tired of relogging into ssh and then reattaching my screen sessions and remembered there was a terminal that handles this kind of on-off internet connectivity, but I forgot the name and went mad searching. I kept running into tmux, which wasn’t it.
The text editor Sam by Rob Pike. Not as a day-to-day editor, but to replace of one-off Awk and Perl scripts.
I find the combination of command language, visible history and structural regular expression support is very useful in parsing large datasets and log files in an interactive way.
I’m always surprised at how rarely known atool is: Wrapper around various archive formats to give unified interface and sensible default behaviours (e.g. no tarbombs).
I don’t know if it’s that unknown, but GNU parallel, and especially the parallel --pipe option, are pretty amazing. Any cpu-bound script that processes stdin lines (like a Python script) can be made multi-core with no fuss.
Combined with pv, you get a toolkit for UNIX-y multi-core dataflow with animated progress bars that work with all the existing tools you know and love.
hexdump -C is useful for all sorts of file examination.
On OpenBSD, scan_ffs has saved my butt more than once when a disk gets screwed up somehow.
The basic operation of this program is as follows:
1. Panic. You usually do so anyways, so you might as well get it over
with. Just don't do anything stupid. Panic away from your
machine. Then relax, and see if the steps below won't help you
out.
If you do anything with MySQL/MariaDB/Percona, the Percona Toolkit has some great utilities like pt-online-schema-change.
msmtp is my go-to for sending out e-mail from mutt, rather than trying to configure a whole postfix/opensmtpd instance to just relay to your actual mail server (and you get instant feedback if delivery fails, rather than it staying queued on your machine).
birthday(1), in FreeBSD Ports as misc/birthday, for giving me advance notice of upcoming birthdays and anniversaries when I log in, letting me appear to be on the ball. Simple text configuration, flags to tune the window.
Website appears to be erroring right now. I guess this helps affirm that this is a rarely-known tool? Looks like it’s probably https://sourceforge.net/projects/birthday/ (v1.6.2, as opposed to v1.5 in Ports).
I use dc a lot as my go-to calculator. It’s a quasi-standard reverse polish notation (RPN) command-line calculator. Quasi-standard in the sense that it is traditionally included in unix, but POSIX chose not to standardize it, instead only standardizing bc (which was historically a front-end to dc for people who didn’t want RPN). The only change from the default setup I have is the command 10k in my ~/.dcrc, which sets the precision on startup to 10 decimal places (the default is 0). I mostly use it for basic arithmetic, but it can do more complex things too.
dwdiff is a word-level diff utility. There are probably a lot of these, but I use this one.
ncdu is a pretty straightforward ncurses frontend to du, letting you navigate around and see what’s taking up space.
units, available in GNU and other versions, converts between units. I had gotten in the habit of converting units by typing things like “33 C in F” or “23.3 km in mi” into my browser’s search bar (both Google and Bing intercept and answer these kinds of queries), but after a period spent with unreliable internet and realizing these conversions shouldn’t actually need to call out to the internet (except perhaps currency conversions, if you want them up to date), I’ve been using units instead.
ts which adds a timestamp prefix to each line passed to it on stdin. The feature I use mostly is ts -i which prefixes the elapsed time since the previous line was printed.
If you’re into C, cscope is highly recommended, eventhough its parsing is ad-hoc and its codebase is quite horrible. I’m avoiding mouse use with the aid of xclip, cwm (patched) amd Vimperator. A decade ago I used Synergy2, but it’s seldom useful.
cscope doesn’t support even a handful of languages. On the other hand, it shows you more: for me the two most useful features are backlinks (who calls this function?) and finding a “C symbol” (where is this function/variable/type mentioned?), but there are also more extensive forward function links (whom is this function calling?), forward and backward file links (jump to a file from an #include line and find files including a given file) and grepping the source (though the latter is not aided by the index). And it indexes the included system header files by default, so you find definitions there as well.
Not really, qfind is lot faster (or it feels so at least!) than find. On my first generation SSDs it gives subsecond filters for Linux kernel and mozilla-central repos, so it hasn’t been bother. It also feels very intuitive when combining with qselect for extra filtering, especially when using it inside other programs. For example my open file in vim.
It’s an oldie but a goodie - allows for pattern-based mass renaming of files. Yes, I know how to mass rename files the “proper” way using shell loops, sed/tr, etc but using mmv is way quicker. It’s in the ports/packages repos of most operating systems.
I use ledger for my personal finances, Sam as my preferred text editor, es for shell scripts, uuterm, Irc.c, newsbeuter, and my own little wrapper-around-gpg-as-a-password-manager. Wonderful software (excluding my own).
I always say this, but tsort is one of those strange little Unix utilities that is a total waste of bytes right up until that point when you need to run a quick topological sort, at which point you are SO HAPPY that it exists.
I’m also a big fan of the combination of isync and mu for mail. It has much of the flavor of mh, but works reasonably with IMAP mail sources. As a 25+ year Emacs graybeard, I interface with it via mu4e, but even from the bare command line, it is supremely useful. I also hear good things about notmuch, which has much the same flavor.
Both come with sane defaults resulting in a nice and easy usage in shell scripts and one liners.
lr supports extensive filter expressions which come very handy.
I have the bad habit of writing my own homegrown solutions for many problems and non-problems.
Those include a notetaking tool and a simple weather app </shamelessselfpromotion>
Some things I’ve found great(er) use in:
The termite terminal emulator. Features keyboard-driven copy/paste/select, URL focusing, and good configurability. Good stuff.
Not unheard of: awesomewm. But extremely cool as a glue-layer between tools, especially because it allows you to easily manage and create popup notifications. I’m writing my own “replacement”, as some might have noticed, but that’s another story. (I’m doing it again, aren’t I?)
VimFx is a slightly less popular, but very convenient vim-layer for firefox.
radare2 is a reverse engineering framework and much more, but some of it’s utilities have great value elsewhere as well, particularly rax2 for all things base conversion.
All other things I’d have mentioned, have been already.
I’ve been through a lot of todo management tools (even wrote my own minimal solution) and I have to say my favourite todo tool is taskpaper.vim. It’s easy to overlook it as being just a syntax file for the taskpaper format, but actually the few keybindings it provides to mark tasks as done and archiving them are all you need. Key features it offers that are surprisingly hard to find elsewhere:
Simple text-based format
Ability to keep notes alongside a given task
Ability to easily have different task lists for different projects
devd, by Aldo Cortesi
Whenever I need to spin up a local server to work with bits of static HTML, I reach for devd. It’s a super fast, self-contained binary with great ergonomics. Running
devd -lo .
serves the current directory, opens (-o
) your browser for you, and automatically livereloads (-l
) your browser whenever any of the files change. It can do much more, including simulating bad connections, reverse proxying, and generating ephemeral self-signed TLS certificates, but I’m completely happy with just the basics.In that same vein, my shell has
python -m SimpleHTTPServer
aliased towebserver
so I can quickly browse a directory on a remote machine through a web browser and python is usually installed everywhere.Also:
python3 -m http.server
:) As ridiculous as it sounds, I’ve actually had performance issues with Python’s built-in server, especially when I have a bunch of async requests on a page. Devd solved that for me.Linux/BSD/Xorg specific
I’m not sure how many of these tools are really “unheard of”, but they’re definitely not common. I use all of them practically every day.
Doesn’t qutebrowser depend on a WebKit fork which no longer receives security updates?
Hmm… it’s using QtWebkit, so I’m not entirely sure. However, the qutebrowser project just got a lot of funding to replace the rendering engine with chromium’s blink engine, which will probably improve security/support on “modern” websites.
git gui
is one of the few tools I’m willing to leave my terminal for. I use it in particular for committing things in patch mode.ipython
, but has niceties like auto completion and doc string snippets.Not
tig
?I do actually use
tig
daily but I thought it was just a viewer for history?git gui
is nice because it makes effective use of the mouse for patch mode commits.For some reason I was sure
tig
could commit, but I was mistaken.You’re not mistaken. :-) In
tig
’s “Status view”, you can stage individual files, chunks, and lines for committing. This blog post is a nice overview oftig
’s features.I use
tig
every day and often recommend it to colleagues whogit add
orgit add -i
.I was mistaken about being mistaken! (I normally just
git add -p
and usetig
only as a viewer.)I’m definitely addicted to
git gui
andgitg
.These are probably pretty popular, but you already covered pass and (h)ledger so I don’t have much else to work with. :)
Thank you for mentioning mosh.
Some one brought this to my attention, may be a year or so ago. Recently, for the work that I do, I got tired of relogging into ssh and then reattaching my screen sessions and remembered there was a terminal that handles this kind of on-off internet connectivity, but I forgot the name and went mad searching. I kept running into tmux, which wasn’t it.
Right,
mosh
(withtmux
inside). Haven’t heard about the other programs you mentioned.I normally use (Go)yacc with a handrolled lexer for parsing. Besides having a built-in lexer, how is Ragel better?
The text editor Sam by Rob Pike. Not as a day-to-day editor, but to replace of one-off Awk and Perl scripts.
I find the combination of command language, visible history and structural regular expression support is very useful in parsing large datasets and log files in an interactive way.
xonsh lets you basically write python directly in your shell. Great for people who know how to do things in python and abhor bash-isms.
eshell, scsh and avash are interesting projects if you’re interested in more programmable shells.
Taskwarrior has been mentioned here a few times but probably belongs on any list with pass and ledger.
I’m always surprised at how rarely known atool is: Wrapper around various archive formats to give unified interface and sensible default behaviours (e.g. no tarbombs).
I use BSD tar which lets you type
xzf
even if the archive is bzipped or whatever, but I don’t think it supports blocking tarbombs; thanks for the tip.GNU tar allows you to just write ‘tar xf’ regardless of compression as well. Does BSD tar not support this?
Atool also works with rar, zip, etc rather than just compressed tarballs FWIW
I don’t know if it’s that unknown, but GNU parallel, and especially the
parallel --pipe
option, are pretty amazing. Any cpu-bound script that processes stdin lines (like a Python script) can be made multi-core with no fuss.Combined with
pv
, you get a toolkit for UNIX-y multi-core dataflow with animated progress bars that work with all the existing tools you know and love.parallel –pipe info
pv man page
hexdump -C
is useful for all sorts of file examination.On OpenBSD,
scan_ffs
has saved my butt more than once when a disk gets screwed up somehow.If you do anything with MySQL/MariaDB/Percona, the Percona Toolkit has some great utilities like
pt-online-schema-change
.msmtp
is my go-to for sending out e-mail from mutt, rather than trying to configure a whole postfix/opensmtpd instance to just relay to your actual mail server (and you get instant feedback if delivery fails, rather than it staying queued on your machine).I wrote a post about this not too long ago, in which I mention my affection for mojo, jq, uniprops, and combine: http://hoelz.ro/blog/unsung-heroes-of-the-command-line
One tool I forgot to include in there is tig, a great curses UI for Git.
birthday(1)
, in FreeBSD Ports asmisc/birthday
, for giving me advance notice of upcoming birthdays and anniversaries when I log in, letting me appear to be on the ball. Simple text configuration, flags to tune the window.Website appears to be erroring right now. I guess this helps affirm that this is a rarely-known tool? Looks like it’s probably https://sourceforge.net/projects/birthday/ (v1.6.2, as opposed to v1.5 in Ports).
I use
dc
a lot as my go-to calculator. It’s a quasi-standard reverse polish notation (RPN) command-line calculator. Quasi-standard in the sense that it is traditionally included in unix, but POSIX chose not to standardize it, instead only standardizingbc
(which was historically a front-end todc
for people who didn’t want RPN). The only change from the default setup I have is the command10k
in my ~/.dcrc, which sets the precision on startup to 10 decimal places (the default is 0). I mostly use it for basic arithmetic, but it can do more complex things too.dwdiff
is a word-level diff utility. There are probably a lot of these, but I use this one.ncdu
is a pretty straightforward ncurses frontend todu
, letting you navigate around and see what’s taking up space.units
, available in GNU and other versions, converts between units. I had gotten in the habit of converting units by typing things like “33 C in F” or “23.3 km in mi” into my browser’s search bar (both Google and Bing intercept and answer these kinds of queries), but after a period spent with unreliable internet and realizing these conversions shouldn’t actually need to call out to the internet (except perhaps currency conversions, if you want them up to date), I’ve been usingunits
instead.pdftk
is a PDF swiss-army knife for various page-level operations like concatenating, splitting, and rotating.ts
which adds a timestamp prefix to each line passed to it on stdin. The feature I use mostly ists -i
which prefixes the elapsed time since the previous line was printed.If you’re into C,
cscope
is highly recommended, eventhough its parsing is ad-hoc and its codebase is quite horrible. I’m avoiding mouse use with the aid ofxclip
,cwm
(patched) amd Vimperator. A decade ago I used Synergy2, but it’s seldom useful.How does
cscope
compare toctags
, which supports a boatload of languages?cscope
doesn’t support even a handful of languages. On the other hand, it shows you more: for me the two most useful features are backlinks (who calls this function?) and finding a “C symbol” (where is this function/variable/type mentioned?), but there are also more extensive forward function links (whom is this function calling?), forward and backward file links (jump to a file from an#include
line and find files including a given file) and grepping the source (though the latter is not aided by the index). And it indexes the included system header files by default, so you find definitions there as well.qfind & qselect: fast, flagfree
find . -iname foo
with steroids and fuzzy-finder/filter to find exactly what I need interactively.looks neat, doesn’t it bother you that you’ll only see the list of files when the search is complete?
Not really,
qfind
is lot faster (or it feels so at least!) thanfind
. On my first generation SSDs it gives subsecond filters for Linux kernel and mozilla-central repos, so it hasn’t been bother. It also feels very intuitive when combining withqselect
for extra filtering, especially when using it inside other programs. For example my open file in vim.hmm, weird. it isn’t as fast on my mac book air so i created a pull request that prints the file as soon as it’s found.
do you mind trying my temporary fork?
mmv by Aharon (Vladimir) Lanin (original source)
It’s an oldie but a goodie - allows for pattern-based mass renaming of files. Yes, I know how to mass rename files the “proper” way using shell loops, sed/tr, etc but using mmv is way quicker. It’s in the ports/packages repos of most operating systems.
zmv is also similar in this vein if you use ZSH.
On a similar note, I like renamer.vim.
I use ledger for my personal finances, Sam as my preferred text editor, es for shell scripts, uuterm, Irc.c, newsbeuter, and my own little wrapper-around-gpg-as-a-password-manager. Wonderful software (excluding my own).
I always say this, but tsort is one of those strange little Unix utilities that is a total waste of bytes right up until that point when you need to run a quick topological sort, at which point you are SO HAPPY that it exists.
In that manpage, it says Mark Kettenis was the author!!
I’m also a big fan of the combination of isync and mu for mail. It has much of the flavor of mh, but works reasonably with IMAP mail sources. As a 25+ year Emacs graybeard, I interface with it via
mu4e
, but even from the bare command line, it is supremely useful. I also hear good things aboutnotmuch
, which has much the same flavor.ls(1)
,find(1)
,stat(1)
anddu(1)
.Both come with sane defaults resulting in a nice and easy usage in shell scripts and one liners.
lr
supports extensive filter expressions which come very handy.Mercurial. Haha :-) just mourning :-(
I have the bad habit of writing my own homegrown solutions for many problems and non-problems. Those include a notetaking tool and a simple weather app </shamelessselfpromotion>
Some things I’ve found great(er) use in:
rax2
for all things base conversion.All other things I’d have mentioned, have been already.
I use ConTeXt for most of my slides and really like it, I just cannot find any good documentation on it :).
I’ve been through a lot of todo management tools (even wrote my own minimal solution) and I have to say my favourite todo tool is taskpaper.vim. It’s easy to overlook it as being just a syntax file for the taskpaper format, but actually the few keybindings it provides to mark tasks as done and archiving them are all you need. Key features it offers that are surprisingly hard to find elsewhere: