Title: Playing with a new shell: fish | |
Author: Solène | |
Date: 05 September 2021 | |
Tags: openbsd shell | |
Description: | |
# Introduction | |
Today I'll introduce you to the interactive shell fish. Usually, Linux | |
distributions ships bash (which can be a hidden dash, a limited shell), | |
MacOS is providing zsh and OpenBSD ksh. There are other shells around | |
and fish is one of them. | |
But fish is not like the others. | |
fish shell project website | |
# What make it special? | |
Here is a list of biggest changes: | |
* suggested input based on commands available | |
* suggested input based on history (even related to the current | |
directory you are in!) | |
* not POSIX compatible (the usual shell syntax won't work) | |
* command completion works out of the box (no need for extensions like | |
"ohmyzsh") | |
* interconnected processes: updating a variable can be done into every | |
opened shells | |
Asciinema recording showing history features and also fzf integration | |
# Making history more powerful with fzf | |
fzf is a simple utility for searching data among a file (the history | |
file in that case) in fuzzy mode, meaning in not a strict matching, on | |
OpenBSD I use the following configuration file in | |
~/.config/fish/config.fish to make fzf active. | |
When pressing ctrl+r with some history available, you can type any | |
words you can think about an old command like "ssh bar" and it should | |
return "ssh foobar" if it exists. | |
```fish config sample | |
source /usr/local/share/fish/functions/fzf-key-bindings.fish | |
fzf_key_bindings | |
``` | |
fzf is absolutely not related to fish, it can certainly be used in some | |
other shells. | |
github: fzf project | |
# Tips | |
## Disable caret character for redirecting to stderr | |
The defaults works pretty well but as I said before, fish is not POSIX | |
compatible, meaning some habits must be changed. By default, ^ | |
character like in "grep ^foobar" is the equivalent of 2> which is very | |
misleading. | |
```fish config sample | |
# make typing ^ actually inserting a "^" and not stderr redirect | |
set -U fish_features stderr-nocaret qmark-noglob | |
``` | |
## Web GUI for customizing your shell | |
If you want to change behaviors or colors of your shell, just type | |
"fish_config" while in a shell fish, it will run a local web server and | |
open your web browser. | |
## Validating a suggestion | |
When you type a command and you see more text suggested as you type the | |
command you can press ctrl+e to validate the suggestion. If you don't | |
care about the suggestion, continue typing your command. | |
## Get the return value of latest command | |
In fish, you want to read $status and not $? , that variable doesn't | |
exist in fish. | |
## Syntax changes | |
Because it's not always easy to find what changed and how, here is a | |
simple reminder that should cover most of your needs: | |
* loops (no do keyword, ends with end): for i in 1 2 3 ; echo $i ; end | |
* condition (no then, ends with end): if something ; echo true ; end | |
* inline command (no dollar sign): (date +%s) | |
* export a variable: set -x EDITOR kak | |
* return value of last command: $status | |
# Conclusion | |
I love this shell. I've been using the shell that come with my system | |
since forever, and a few months ago I wanted to try something | |
different, it felt weird at first but over time I found it very | |
convenient, especially for git commands or daily tasks, suggesting me | |
exactly the command I wanted to type in that exact directory. | |
Obviously, as the usual syntax changes, it may not please everyone and | |
it's totally fine. |