Five small programs make a Linux terminal far more useful without changing the terminal itself: bat for reading files, eza for listing them, Starship for the prompt, Yazi for browsing folders and trash-cli for deleting things you might want back. Each one sits next to a command you already use, so nothing you rely on breaks.
Tools, not settings
None of the five is a setting inside your terminal app. They are ordinary command-line programs that run in your shell, so they keep working if you swap GNOME Terminal for kitty or Ghostty. And cat, ls and rm stay installed and untouched, so scripts that call them behave exactly as before.
On Ubuntu 24.04, bat, eza and trash-cli all come from the normal apt repositories. Starship installs with the script on its website. Yazi isn't in Ubuntu's own repositories, but its installation page offers the project's APT repository or a Snap instead.
They sit alongside the tools in Supercharging Your Terminal, which are about finding and searching rather than what you see.
bat: cat with colours and Git markers
cat prints a file's bytes and nothing else, which is fine for a five-line config and a grey wall for anything longer. bat (its own tagline is 'a cat clone with wings') prints the same file with three additions: syntax highlighting for a long list of languages, line numbers down the left, and a header with the file name.
The fourth is the one people keep it for. Inside a Git repository, bat asks Git which lines differ from the index, the snapshot you last staged, and marks them in the margin. Here line 6 has been edited and line 13 is new:
A tilde means a changed line and a plus an added one, so you see what you touched without opening a diff.
Two behaviours surprise new users. A file taller than the window opens in a pager (less by default), so you scroll with the arrow keys and press q to leave. And when bat's output goes into a pipe or a file instead of the screen, it drops the colours, numbers and header and prints the plain contents, exactly as cat would. If you want the basics of the original first, the Cat Command page covers them.
Why Ubuntu calls it batcat
Type bat after installing it from apt on Ubuntu 24.04 and you get 'command not found'. Another Debian package already owned the name, so the package installs the program as /usr/bin/batcat. bat's README notes that newer Debian and Ubuntu releases ship it as plain bat again.
The quick fix is a one-line alias in ~/.bashrc that points bat at batcat. Bash only uses aliases in interactive shells, though, so a script that calls bat still fails. For that, bat's README suggests a symbolic link named bat in ~/.local/bin pointing at /usr/bin/batcat; Ubuntu adds that folder to your PATH at your next login.
eza: ls with icons and Git status
eza calls itself a modern replacement for ls. Its long view shows permissions, sizes, owners and dates, each field coloured so you can scan it, and the icons option puts a symbol for the file type before each name.
The Git option is the reason to switch. It adds a two-character column to the long view: the first character is the file's staged status and the second its unstaged one. Running plain ls and then eza's long view with icons and Git status on the same folder looks like this:
-N on menu.txt means a new file Git isn't tracking yet. -M on shop.sh means a modified file that hasn't been staged. A dash means no change, I marks a file Git ignores and D one that was deleted.
eza also has a tree view that recurses into folders and can skip anything your .gitignore lists. Its flags look like ls's but don't all match, so check the help before reusing an old ls habit. If the icons show as empty boxes, the terminal can't draw those symbols yet; eza's README explains what to install.
Starship: a prompt that reports back
The prompt is the text your shell prints before each command. Bash's default is a user name, a folder and a dollar sign at best, and on some systems only the dollar sign. Starship replaces it. It's a separate program that your shell runs every time it draws the prompt, and you switch it on with one line at the end of ~/.bashrc (zsh, fish and other shells have their own one-liner on the Starship site).
Out of the box it shows the folder you're in, the Git branch and a short Git status, and it adds the duration of the last command once that command ran for more than two seconds:
'tuna on main' is the folder and the branch. The brackets hold the status symbols: ! means modified files, ? untracked ones and ✘ deleted ones. 'took 2s' appears because sleep 2 crossed the two-second default, which you can raise or lower. Quick commands don't clutter the prompt, and after a long build or test run you see how long it took without timing it yourself.
Each piece of the prompt is a module, from the Git branch to the version of the language you're working in, and ~/.config/starship.toml restyles or turns off any of them. Because Starship runs Git on every prompt, a very large repository can make the prompt lag. By default it gives up on any command that takes over half a second, and its docs warn that Git status is slow in Windows folders under WSL.
Yazi: a file manager inside the terminal
Finding one photo among two hundred by file name alone means opening them one at a time. Yazi is a full file manager that runs inside the terminal, written in Rust. Its file operations run in the background, so a slow disk doesn't freeze the screen. It shows three columns: the parent folder, the current folder and a preview of whatever is selected.
The preview column does most of the work. Text files show highlighted, folders show their contents and images show as images. Moving down a folder of cat photos updates the preview at every step:
You move with the arrow keys or Vim's h, j, k and l, and press q to quit. Yazi can also copy, move, bulk rename and trash files.
Real image previews depend on the terminal. kitty, Ghostty, WezTerm, Konsole, foot, iTerm2 and recent Windows Terminal all support them directly. Ubuntu's default GNOME Terminal isn't on that list, so there you either install Überzug++ or settle for Chafa's block-character approximation. It's a good reason to try a terminal like Kitty.
Quitting leaves your shell in the folder you started from. The Yazi docs give a short shell function, y, that moves your shell to wherever you were in Yazi instead.
trash-cli: a delete you can undo
rm doesn't move a file anywhere. It removes the file's name from the folder, and once no program still has the file open, its space is free for reuse. There is no bin to dig through. trash-cli gives the command line the same safety net the desktop has:
trash-putmoves files or folders to the trash, recording each one's original path, deletion date and permissions.trash-listshows what's in the trash.trash-restorelists the trashed files with numbers and puts back the ones you pick.trash-emptydeletes everything, or only files trashed more than a given number of days ago.trash-rmdeletes trashed files matching a pattern.
Here a file goes to the trash and comes back:
Watch the Starship prompt in that clip: while orders.csv is in the trash, Git sees a tracked file as deleted and a ✘ appears in the brackets, then disappears after the restore.
trash-cli follows the FreeDesktop.org trash specification, the same one GNOME, KDE and XFCE use. Files trashed from your home folder land in ~/.local/share/Trash, which is the bin you see in the Files app, so you can restore from either side.
The space isn't free until you empty it. trash-empty with a number of days clears out only the older files. trash-cli's FAQ suggests running it daily from cron with 30, which keeps the last month and nothing older.
Common mistakes
- Aliasing
rmtotrash-put. trash-cli's own FAQ advises against it: the two behave differently (rmrefuses a folder without-R,trash-putdoesn't), and the habit fails you on any machine without the alias. - Writing scripts that need these tools. Servers, CI runners and colleagues' laptops won't have them.
- Blaming the tool for boxes or missing pictures. eza's icons and Yazi's previews depend on what the terminal can draw.
- Thinking bat has hung on a big file. It's waiting in the pager: press
q, or set its paging option to 'never'.
Key takeaways
- All five are separate programs, so they work in any terminal and leave
cat,lsandrmin place for scripts. - bat and eza both read Git: bat marks changed lines and eza marks changed files.
- Starship shows the branch, the Git status and how long a slow command took, from one line in your shell's startup file.
- Yazi shows real image previews only in terminals that can draw images, such as kitty or Ghostty.
- trash-put sends files to the desktop's own trash, so trash-restore can undo a mistake that
rmcan't.