A better shell than bash
# Installation methods for Ubuntu and Debian.
sudo apt-get install fish
# Mac installation method.
brew install fish
Since the syntax of Fish
is very different from Bash
, Bash
scripts are generally incompatible. Therefore, it is recommended not to make Fish
the default Shell
but to start it manually each time.
# After the installation is complete, you can start Fish.
$ fish
# During use, if you need help, you can enter the help command
$ help
# Invalid commands are red
$ mkd
# Valid commands are blue
$ mkdir
# Valid paths will be underlined. If there is no underscore, you know the path does not exist.
$ cat ~/somefi
Fish will automatically suggest possible options behind the cursor, colored gray. If you follow the suggestion, you can press →
or Control + F
. To adopt only part of it, press Alt + →
.
$ /bin/hostname # Command suggestions
$ grep --ignore-case # Parameter suggestions
$ ls node_modules # Path suggestions
When entering a command, Fish
will automatically display the previous matching history record. If there is no matching history record, Fish
will guess the possible results and automatically complete various inputs. For example, if you type pyt
and then press Tab
, it will be automatically completed into the python
command.
Fish
can also automatically complete Git
branches.
if grep fish /etc/shells
echo Found fish
else if grep bash /etc/shells
echo Found bash
else
echo Got nothing
end
switch(uname)
case Linux
echo Hi Tux!
case Darwin
echo Hi Hexley!
case FreeBSD NetBSD DragonFly
echo Hi Beastie!
case '*'
echo Hi, stranger!
end
while true
echo "Loop forever"
end
for file in *.txt
cp $file $file.bak
end
Fish
functions are used to encapsulate commands, or to alias existing commands.
function ll
ls -lhG $argv
end
The above code defines an ll
function. After executing this function on the command line, you can use the ll
command instead of ls -lhG
. Among them, the variable $argv
represents the parameters of the function.
functionls
command ls -hG $argv
end
The above code redefines the ls
command. Note that command
must be added before ls
in the function body, otherwise an error will be reported due to an infinite loop.
The fish_prompt
function is used to define the command line prompt (prompt).
function fish_prompt
set_color purple
date "+%m/%d/%y"
set_color FF0
echo (pwd) '>'
set_color normal
end
After executing the above function, your command line prompt will become as follows.
02/06/13
/home/tutorial >
The configuration file of Fish is ~/.config/fish/config.fish
. This file will be automatically loaded every time Fish
is started. Fish also provides a web interface to configure this file.
$ fish_config # Browser opens the Web interface configuration
Running Commands: Compatible with bash and other shell command execution methods
Getting Help: help/man cmd -> browser/terminal
Syntax Highlighting: Check whether the command is correct in real time
Wildcards: supports abbreviation *
recursive matching
Pipes and Redirections: Use ^
for stderr
Autosuggestions: Automatic suggestions, you can use Ctrl-f / ->
to complete
Tab Completions: More powerful tab completion
Variables: set using set
Exit Status: use echo $status
instead of $?
Exports (Shell Variables)
Lists: all variables in fish are really lists
Command Substitutions: Use (cmd)
to execute commands instead of backticks or $()
Combiners (And, Or, Not): The use of conjunction to represent logical operations is not supported
Functions: use $argv
instead of $1
Conditionals (If, Else, Switch) / Functions / Loops: more user-friendly writing (refer to py)
Prompt: function fish_prompt
implementation
Startup (Where's .bashrc?): ~/.config/fish/config.fish
, a better way is autoloading-function, universal-variables
Autoloading Functions: ~/.config/fish/functions/.
Universal Variables: a variable whose value is shared across all instances of fish
set name 'czl' #Set variable, replace name=czl
echo $name
echo $status # exit status, replace $?
env #environment variable
set -x MyVariable SomeValue # alternative to export
set -e MyVariable
set PATH $PATH /usr/local/bin # Use lists to record PATH
set -U fish_user_paths /usr/local/bin $fish_user_paths # takes effect permanently
touch "testing_"(date +%s)".txt" # command subtitution, replace `date +%s`
cp file.txt file.txt.bak; and echo 'back success'; or echo 'back fail' # combiner
functions # List functions defined under fish