Put joy and productivity inside your Terminal with those cool command line tools.
But before we start, let's cover how you can install and uninstall them.
Table of contents
- Quick install
- Put in .bash_profile or .zshrc
- Try, adopt or uninstall
- The 15 Command Line Tools which Spark Joy in Your Terminal
- *tldr-pages/tldr: π Collaborative cheatsheets for console commands
- stedolan/jq: Command-line JSON processor
- direnv/direnv: unclutter your .profile
- jonas/tig: Text-mode interface for git
- tmux/tmux: terminal multiplexer
- santinic/how2: stackoverflow from the terminal
- BurntSushi/ripgrep : like grep, but better
- sharkdp/bat: A cat(1) clone with wings.
- junegunn/fzf: A command-line fuzzy finder
- sharkdp/fd: like find, but better
- wting/autojump
- inconshreveable/ngrok: Introspected tunnels to localhost
- github/hub:
- Any cool tool that I'm missing?
Quick install
I don't know about you, but I don't enjoy spending lots of time installing stuff.
So here is my executive summary
PROGRAMS="hub httpie ripgrep bat fzf fd fd-find jq autojump direnv tig tmux neovim exa just lazygit jump"
NPM="how-2 tldr"
export INSTALLER="sudo apt-get" # on Debian/Ubuntu
export INSTALLER="something else" # on another Linux
export INSTALLER="brew" # on macOS
for program in $PROGRAMS ; do $INSTALLER install $program ; done
for program in $NPM ; do npm install -g $program ; done
You may want to configure your .profile
## Put in .bash_profile or .zshrc
alias ls=exa
alias cat=bat
Try, adopt or uninstall
Try out the CLI tools. If you don't like them, uninstall them the same way
PROGRAMS="neovim exa"
export INSTALLER="brew" # on macOS
for program in $PROGRAMS ; do $INSTALLER uninstall $program ; done
This being done, let's move on to the tools!
The 15 Command Line Tools which Spark Joy in Your Terminal
*tldr-pages/tldr: π Collaborative cheatsheets for console commands
A must have
The man page is too long, didn't read.
Replace $ man git-checkout
by $ tldr git-checkout
You will find what you need in 5s or less, 80% of the time or more
tldr-pages / tldr
π Collaborative cheatsheets for console commands
What is tldr-pages?
The tldr-pages project is a collection of community-maintained help pages for command-line tools, that aims to be a simpler, more approachable complement to traditional man pages.
Maybe you're new to the command-line world? Perhaps you're just a little rusty or can't always recall the arguments for commands like lsof
, or tar
?
It certainly doesn't help that, in the past, the first option explained in man tar
was:
$ man tar
...
-b blocksize
Specify the block size, in 512-byte records, for tape drive I/O.
As a rule, this argument is only needed when reading from or writing to tape drives,
and usually not even then as the default block size of 20 records (10240 bytes) is very common.
...
There seems to be room for simpler help pages, focused on practical examples. How about:
This repository is just that: an ever-growing collection of examplesβ¦
stedolan/jq: Command-line JSON processor
Unix scripts are based on the idea that you have a stdout with lines of outputs.
How do you autoamte things if you have JSON instead? (and JSON is everywhere)
jq is the answer
jq
jq
is a lightweight and flexible command-line JSON processor akin to sed
,awk
,grep
, and friends for JSON data. It's written in portable C and has zero runtime dependencies, allowing you to easily slice, filter, map, and transform structured data.
Documentation
- Official Documentation: jqlang.github.io/jq
- Try jq Online: jqplay.org
Installation
Prebuilt Binaries
Download the latest releases from the GitHub release page.
Docker Image
Pull the jq image to start quickly with Docker.
Run with Docker
Example: Extracting the version from a package.json
file
docker run --rm -i ghcr.io/jqlang/jq:latest < package.json '.version'
Example: Extracting the version from a package.json
file with a mounted volume
docker run --rm -i -v "$PWD:$PWD" -w "$PWD" ghcr.io/jqlang/jq:latest '.version' package.json
Building from source
Dependencies
- libtool
- make
- automake
- autoconf
Instructions
git submodule update --init # if building from git to get
β¦direnv/direnv: unclutter your .profile
My .profile is horrible so I'm looking forward to try this one
direnv -- unclutter your .profile
direnv
is an extension for your shell. It augments existing shells with a
new feature that can load and unload environment variables depending on the
current directory.
Use cases
- Load 12factor apps environment variables
- Create per-project isolated development environments
- Load secrets for deployment
How it works
Before each prompt, direnv checks for the existence of a .envrc
file (and
optionally a .env
file) in the current
and parent directories. If the file exists (and is authorized), it is loaded
into a bash sub-shell and all exported variables are then captured by
direnv and then made available to the current shell.
It supports hooks for all the common shells like bash, zsh, tcsh and fish.
This allows project-specific environment variables without cluttering the
~/.profile
file.
Because direnv is compiled into a single static executable, it is fast enough to be unnoticeable on each prompt. It isβ¦
jonas/tig: Text-mode interface for git
Tig: text-mode interface for Git
What is Tig?
Tig is an ncurses-based text-mode interface for git. It functions mainly as a Git repository browser, but can also assist in staging changes for commit at chunk level and act as a pager for output from various Git commands.
Resources
-
Homepage: https://jonas.github.io/tig/
-
Tarballs: https://github.com/jonas/tig/releases
-
Git URL: https://github.com/jonas/tig.git
-
Gitter: https://gitter.im/jonas/tig
Bugs and Feature Requests
Bugs and feature requests can be reported using the issue tracker or by mail to either the Git mailing list or directly to the maintainer. Ensure that the word "tig" is in the subject. For other Tig related questions please use Stack Overflow: https://stackoverflow.com/questions/tagged/tig.
Installation and News
Information on how to build and install Tig are found in the installation instructions.
News about releases and latest features and bug fixes are found in the release notes.
tmux/tmux: terminal multiplexer
tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.
Welcome to tmux!
tmux is a terminal multiplexer: it enables a number of terminals to be created accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.
This release runs on OpenBSD, FreeBSD, NetBSD, Linux, macOS and Solaris.
Dependencies
tmux depends on libevent 2.x, available from this page.
It also depends on ncurses, available from this page.
To build tmux, a C compiler (for example gcc or clang), make, pkg-config and a suitable yacc (yacc or bison) are needed.
Installation
Binary packages
Some platforms provide binary packages for tmux, although these are sometimes out of date. Examples are listed on this page.
From release tarball
To build and install tmux from a release tarball, use:
./configure && make
sudo make install
tmux can use the utempter library to update utmp(5), if it isβ¦
santinic/how2: stackoverflow from the terminal
StackOverflow being such a massive part of a developer workflow, why not automating it?
how2: AI for your Terminal
how2 finds the simplest way to do something in a unix shell
It's like man
, but you can query it in natural language. It uses a mix of AI code-completion and StackOverflow search.
It effectively replaces Chrome => New Tab => Google => Click on StackOverflow => Scroll Down to first answer.
Go to how2terminal.com for more info.
Demo video
v5.mp4
Install
MacOSX (via HowBrew):
brew tap how2terminal/how2
brew install how2
With NPM:
sudo npm install -g how2
If you install it without sudo
, then you have to run it with npx how2
or alias the command manually.
Ubuntu/Debian:
Download latest .deb and then run:
wget how2terminal.com/how2.deb
sudo dpkg -i how2.deb
Binaries:
Go to the latest release and download the binaries.
Usage
By default, how2 uses an external AI server to find the best unix command line suggestion
If you add the -s
β¦
BurntSushi/ripgrep : like grep, but better
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
BurntSushi / ripgrep
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
ripgrep (rg)
ripgrep is a line-oriented search tool that recursively searches the current
directory for a regex pattern. By default, ripgrep will respect gitignore rules
and automatically skip hidden files/directories and binary files. (To disable
all automatic filtering by default, use rg -uuu
.) ripgrep has first class
support on Windows, macOS and Linux, with binary downloads available for every
release. ripgrep is similar to
other popular search tools like The Silver Searcher, ack and grep.
Dual-licensed under MIT or the UNLICENSE.
CHANGELOG
Please see the CHANGELOG for a release history.
Documentation quick links
- Installation
- User Guide
- Frequently Asked Questions
- Regex syntax
- Configuration files
- Shell completions
- Building
- Translations
Screenshot of search results
Quick examples comparing tools
This example searches the entire
Linux kernel source tree
(after running make defconfig && make -j8
) for [A-Z]+_SUSPEND
, where
all matches must be words. Timings were collected on a systemβ¦
sharkdp/bat: A cat(1) clone with wings.
Syntax highlighting for a large number of programming and markup languages, because why not?
You can alias it
$ alias cat=bat
A cat(1) clone with syntax highlighting and Git integration
Key Features β’
How To Use β’
Installation β’
Customization β’
Project goals, alternatives
[English]
[δΈζ]
[ζ₯ζ¬θͺ]
[νκ΅μ΄]
[Π ΡΡΡΠΊΠΈΠΉ]
Sponsors
A special thank you goes to our biggest sponsors:
Your app, enterprise-ready.
Start selling to enterprise customers with just a few lines of code.
Add Single Sign-On (and more) in minutes instead of months.
Warp is a modern, Rust-based terminal with AI built in
so you and your team can build great software, faster.
Feel more productive on the command line with parameterized commands,
autosuggestions, and an IDE-like text editor.
Syntax highlighting
bat
supports syntax highlighting for a large number of programming and markup
languages:
Git integration
bat
communicates with git
to show modifications with respect to the index
(see left side bar):
Show non-printable characters
You can use the -A
/β¦
junegunn/fzf: A command-line fuzzy finder
Makes looking for a file as easy as in Visutal Studio Code or IntelliJ
fzf is a general-purpose command-line fuzzy finder.
It's an interactive filter program for any kind of list; files, command history, processes, hostnames, bookmarks, git commits, etc. It implements a "fuzzy" matching algorithm, so you can quickly type in patterns with omitted characters and still get the results you want.
Highlights
- π¦ Portable β Distributed as a single binary for easy installation
- β‘ Blazingly fast β Highly optimized code instantly processes millions of items
- π οΈ Extremely versatile β Fully customizable via an event-action binding mechanism
- π Batteries included β Includes integration with bash, zsh, fish, Vim, and Neovim
Sponsors β€οΈ
I would like to thank all the sponsors of this project who make it possible for me to continue to improve fzf.
Ifβ¦
sharkdp/fd: like find, but better
A simple, fast and user-friendly alternative to 'find'
fd
fd
is a program to find entries in your filesystem
It is a simple, fast and user-friendly alternative to find
While it does not aim to support all of find
's powerful functionality, it provides sensible
(opinionated) defaults for a majority of use cases.
Installation β’ How to use β’ Troubleshooting
Features
- Intuitive syntax:
fd PATTERN
instead offind -iname '*PATTERN*'
. - Regular expression (default) and glob-based patterns.
- Very fast due to parallelized directory traversal.
- Uses colors to highlight different file types (same as
ls
). - Supports parallel command execution
- Smart case: the search is case-insensitive by default. It switches to case-sensitive if the pattern contains an uppercase character*.
- Ignores hidden directories and files, by default.
- Ignores patterns from your
.gitignore
, by default. - The command name is 50% shorter* than
find
:-).
Demo
How to use
First, toβ¦
wting/autojump
A cd command that learns - easily navigate directories from the command line
NAME
autojump - a faster way to navigate your filesystem
DESCRIPTION
autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line.
Directories must be visited first before they can be jumped to.
USAGE
j
is a convenience wrapper function around autojump
. Any option that
can be used with autojump
can be used with j
and vice versa.
-
Jump To A Directory That Contains
foo
:j foo
-
Jump To A Child Directory:
Sometimes it's convenient to jump to a child directory (sub-directory of current directory) rather than typing out the full name.
jc bar
-
Open File Manager To Directories (instead of jumping):
Instead of jumping to a directory, you can open a file explorer window (Mac Finder, Windows Explorer, GNOME Nautilus, etc.) to the directory instead.
jo music
Opening a file manager toβ¦
inconshreveable/ngrok: Introspected tunnels to localhost
You have your web app working on localhost, the CI is broken and you can't share your work with your colleagues.
Except that with ngrok, you can!
inconshreveable / ngrok
Unified ingress for developers
ngrok - Unified Ingress for Developers
ngrok Community on GitHub
If you are having an issue with the ngrok cloud service please open an issue on the ngrok community on GitHub
This repository is archived
This is the GitHub repository for the old v1 version of ngrok which was actively developed from 2013-2016.
This repository is archived: ngrok v1 is no longer developed, supported or maintained.
Thank you to everyone who contributed to ngrok v1 it in its early days with PRs, issues and feedback. If you wish to continue development on this codebase, please fork it.
ngrok's cloud service continues to operate and you can sign up for it here: https://ngrok.com/signup
What is ngrok?
ngrok is a globally distributed reverse proxy that secures, protects and accelerates your applications and network services, no matter where you run them. You can think of ngrok as the front door to yourβ¦
github/hub:
A command-line tool that makes git easier to use with GitHub.
hub is a command line tool that wraps git
in order to extend it with extra
features and commands that make working with GitHub easier.
For an official, potentially more user-friendly command-line interface to GitHub see cli.github.com and this comparison.
This repository and its issue tracker is not for reporting problems with GitHub.com web interface. If you have a problem with GitHub itself, please contact Support.
Usage
$ hub clone rtomayko/tilt
#=> git clone https://github.com/rtomayko/tilt.git
# or, if you prefer the SSH protocol:
$ git config --global hub.protocol ssh
$ hub clone rtomayko/tilt
#=> git clone git@github.com:rtomayko/tilt.git
See usage examples or the full reference documentation to see all available commands and flags.
hub can also be used to make shell scripts that directly interact with the GitHub API.
hub can be safely aliased as git
, so you can type $ git <command>
in theβ¦
Build your own CLI tools, but maybe not in Bash
Command-line tools are great to automate and simplify your developer workflow.
Tools written by others are good, but why would you not write your own tools?
I have a strong opinion weakly held on this topic:
After 15 years of trying to program in Bash and being stuck at trials and errors, I think it's time to retire Bash.
Why not using your favorite programming language instead?
I found they are 10x time better than Bash.
Python, Go and JavaScript are all good choices to write a CLI tool.
Now my favorite language being Kotlin, I wanted to write a starter project for my own CLI tools using Kotlin multiplatform.
So if you allow me this shameless plug, have a look at the kotlin-cli-starter GitHub template
jmfayard / kotlin-cli-starter
Life is too short for Bash programming
A starter project to build command-line tools in Kotlin Multiplatform
Contains a re-implementation of a real world CLI tool: git-standup
Installation
You can install using one of the options listed below
Source | Command |
---|---|
Node | npm install -g kotlin-cli-starter |
Installer | curl -L https://raw.githubusercontent.com/jmfayard/kotlin-cli-starter/main/installer.sh | sudo sh |
Tests | ./gradlew allTests |
Kotlin All Platforms | Run ./gradlew allRun
|
Kotlin JVM | Run ./gradlew run
|
Kotlin Native | Run ./gradlew install then $ git standup
|
Kotlin Node.JS | Run ./gradlew jsNodeRun
|
Why?
Being able to write your own command-line tools is a great skill to have. Automate all the things!
You can write the CLI tools in Kotlin and reap the benefits of using
- a modern programming language
- modern IDE support
- modern practices such as unit testing and continuous integration
- leverage Kotlin multiplatform libraries
- run your code on the JVM and benefit from a wealth of Java libraries
- or build a native executable, which starts very fast andβ¦
Any cool tool that I'm missing?
No such list would be ever complete, so please add your recommandation in the comments.
Updates from my readers
jesseduffield/lazygit simple terminal UI for git commands
lazygit is a very cool git client
jesseduffield / lazygit
simple terminal UI for git commands
Sponsors
Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. π
Elevator Pitch
Rant time: You've heard it before, git is powerful, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? Are you kidding me? To stage part of a file you need to use a command line program to stepβ¦
See the demo
casey/just: π€ Just a command runner
Inspired by make
just
just
is a handy way to save and run project-specific commands.
This readme is also available as a book.
(δΈζζζ‘£ε¨ θΏι εΏ«ηθΏζ₯!)
Commands, called recipes, are stored in a file called justfile
with syntax
inspired by make
:
You can then run them with just RECIPE
:
$ just test-all
cc *.c -o main
./test --all
Yay, all your tests passed!
just
has a ton of useful features, and many improvements over make
:
-
just
is a command runner, not a build system, so it avoids much ofmake
's complexity and idiosyncrasies No need for.PHONY
recipes! -
Linux, MacOS, and Windows are supported with no additional dependencies (Although if your system doesn't have an
sh
, you'll need to choose a different shell.) -
Errors are specific and informative, and syntax errors are reported along with their source context.
-
Recipes canβ¦
gsamokovarov/jump: Jump helps you navigate faster by learning your habits. βοΈ
An alternative to cd
that feels like it can read your mind
gsamokovarov / jump
Jump helps you navigate faster by learning your habits. βοΈ
Jump integrates with your shell and learns about your navigational habits by keeping track of the directories you visit. It gives you the most visited directory for the shortest search term you type.
Installation
Jump comes in packages for the following platforms.
Platform | Command |
---|---|
macOS |
brew install jump or port install jump
|
Linux | sudo snap install jump |
Nix | nix-env -iA nixpkgs.jump |
Go | go install github.com/gsamokovarov/jump@latest |
Linux distribution specific packages
Distribution | Command |
---|---|
Void | xbps-install -S jump |
Ubuntu | wget https://github.com/gsamokovarov/jump/releases/download/v0.51.0/jump_0.51.0_amd64.deb && sudo dpkg -i jump_0.51.0_amd64.deb |
Debian | wget https://github.com/gsamokovarov/jump/releases/download/v0.51.0/jump_0.51.0_amd64.deb && sudo dpkg -i jump_0.51.0_amd64.deb |
Fedora | wget https://github.com/gsamokovarov/jump/releases/download/v0.51.0/jump-0.51.0-1.x86_64.rpm && sudo rpm -i jump-0.51.0-1.x86_64.rpm |
Integration
You are using Jump through its shell helper function, j
. To get it, you have
to integrate Jump with your shell.
bash / zsh
Add the line below in ~/.bashrc
, ~/bash_profile
or ~/.zshrc
:
eval "$(jump shell)"
fish
Add the line below inβ¦
Top comments (14)
TUI file managers such as
nnn
(github.com/jarun/nnn, minimalistic, my favourite) orlf
(github.com/gokcehan/lf/, a more interactive one)delta
, more limited than lazygit, focused on just diffs, but it does it really really well, and can be a nice complement (github.com/dandavison/delta)glow
terminal markdown renderer (github.com/charmbracelet/glow): some might think this is superfluous, because markdown is supposed to be meaningfully readable as plain text, but I often find poorly formatted files, sometimes "augmented" with a lot of inline HTML, to the point of becoming impossible to parse for the human eyeSpeaking of creating your own cli tools. I would like to share something cool: a scripting language called ABS.
This is why I think is cool.
Here is a little snippet.
I wrote about this language a few years ago, here is the post if anyone is interested.
I like this a lot because it allows people who are familiar with a languages like javascript or PHP (that would be me) to write shell scripts in a way that feels comfortable.
If
bat
looks appealing to you and you happen to be a Vim user, you might want to consider runningview /path/to/file
instead ofbat
. It'll open any file as readonly in Vim, with all your favorite plugins like Git integration present. Instead of piping to| less
, you could also pipe to| view -
. You may have to enter something like:set syntax=json
if the syntax isn't autodetected based on content, although there's probably a simple setting or plugin to enable autodetection.If you're not a Vim user and you want something that works with zero configuration,
bat
seems like a good choice!jump
(github.com/gsamokovarov/jump) is in my opinion a better alternative toautojump
I personally prefer
jump
because it's actively maintained, but especially because β like all modern tools listed here β it's a standalone executable that does not require Pythonit works really well, the author says it can "read his mind" and I tend to agree π
Thanks, I've added the suggestion!
Iβm using ripgrep and bat daily, and they make everything just that much better.
Another tool Iβm using a lot is Just. I might have processes which need a number of steps, or building a project with a lot of arguments. I can abstract it all away and use something like βjust buildβ instead.
github.com/casey/just
I started using just in my own project, thanks, it's nice!
github.com/jmfayard/refreshVersion...
thanks, I've added the suggestion
Hey! I made this CLI tool called fcd which replaces the cd command. It basically searches for wherever you are trying to cd and then copies the appropriate cd command to your clipboard.
SiddharthShyniben / fcd
Faster cd-ing.
fcd
Better
cd
ing for macOSExplore the docs Β»
Report Bug Β· Request Feature
Table of Contents
About The Project
fcd
is a utility which helps youcd
faster on macOS.Ever had to type out a long
cd ~/Sites/Projects/project
, find out the path is wrong, rewrite it tocd ~/Sites/Sandbox/project
? You just wasted a minute or two. This inspired me to create this tool:fcd
.fcd
automatically reads the dirname and the basename of the input and searches for any folder with basename as the name in the dirname folder (Basically, if you input"some/where/else"
, the program returns the path to"some/where/**/else"
). Once it finishes:I wanted to implement autojump like functionality ever since I made fcd.
If you want exa to behave just like ls, so that you do not need to learn any new switches, I have made this wrapper script:
gist.github.com/eggbean/74db77c4f6...
I've found lazygit to be quite handy, myself.
github.com/jesseduffield/lazygit
I've tried it and love it, thanks!
Z is similar to autojump & works great for me.