Difference between revisions of "Fish"

From ArchWiki
Jump to: navigation, search
(Added IO section, because it's slightly different from bash)
(Use link to shell for changing default shell)
 
(43 intermediate revisions by 20 users not shown)
Line 1: Line 1:
 +
{{lowercase title}}
 
[[Category:Command shells]]
 
[[Category:Command shells]]
 
[[de:Fish]]
 
[[de:Fish]]
'''Fish''' is a user friendly commandline shell intended mostly for interactive use.
+
[[ja:Fish]]
 +
[[ru:Fish]]
  
== Installation instructions ==
+
'''fish''' (the '''friendly interactive shell''') is a user friendly command line shell intended mostly for interactive use.
  
[[pacman|Install]] {{Pkg|fish}} from the [[official repositories]].
+
== Installation ==
  
To verify that it has been installed you can run:
+
[[Install]] the {{Pkg|fish}} package. Alternatively install the {{AUR|fish-git}} package for the development version.
$ grep fish /etc/shells
+
  
If you wanted to make Fish your default shell run:
+
To make fish the default shell, see [[Shell#Changing your default shell]].
$ chsh -s /usr/bin/fish
+
  
== Input/Output ==
+
== Input/output ==
  
 
=== File descriptors ===
 
=== File descriptors ===
Like other shells, fish lets you redirect input/output streams. This is usefull when using text files to save programs output or errors, or when using text files as input. Most programs use three input/output streams, represented by numbers called file descriptors (FD). These are:
+
Like other shells, fish lets you redirect input/output streams. This is useful when using text files to save programs output or errors, or when using text files as input. Most programs use three input/output streams, represented by numbers called file descriptors (FD). These are:
  
* Standard input (FD 0), used for reading (keyborad by default).
+
* Standard input (FD 0), used for reading (keyboard by default).
 
* Standard output (FD 1), used for writing (screen by default).
 
* Standard output (FD 1), used for writing (screen by default).
 
* Standard error (FD 2), used for displaying errors and warnings (screen by default).
 
* Standard error (FD 2), used for displaying errors and warnings (screen by default).
Line 44: Line 44:
 
* A filename (the output will be written to the specified file).
 
* A filename (the output will be written to the specified file).
 
* An {{ic|&}} followed by the number of another file descriptor. The output will be written to the other file descriptor.
 
* An {{ic|&}} followed by the number of another file descriptor. The output will be written to the other file descriptor.
* An {{ic|&}} folowwed by a {{ic|-}} sign. The output will not be written anywhere.
+
* An {{ic|&}} followed by a {{ic|-}} sign. The output will not be written anywhere.
  
 
Examples:
 
Examples:
{{bc|''Redirecting standard otput to a file:''
+
{{bc|''Redirecting standard output to a file:''
 
$ command > destination_file.txt
 
$ command > destination_file.txt
  
Line 58: Line 58:
 
=== Piping ===
 
=== Piping ===
  
You can redirect standard output of one command to standard input of the next command. This is done by separanting the commands by the pipe character ({{ic|<nowiki>|</nowiki>}}). Example:
+
You can redirect standard output of one command to standard input of the next command. This is done by separating the commands by the pipe character ({{ic|<nowiki>|</nowiki>}}). Example:
  
 
  cat example.txt | head
 
  cat example.txt | head
Line 66: Line 66:
 
  $ command 2>| less
 
  $ command 2>| less
  
This will run {{ic|command}} and redirect it's standard error to the {{ic|less}} command.
+
This will run {{ic|command}} and redirect its standard error to the {{ic|less}} command.
  
 
== Configuration ==
 
== Configuration ==
  
If you would like Fish to display the branch and dirty status when you are in a git directory, you can add the following to your {{ic|~/.config/fish/config.fish}}:
+
User configurations for fish are located at {{ic|~/.config/fish/config.fish}}. Adding commands or functions to the file will execute/define them when opening a terminal, similar to {{ic|.bashrc}}.
 +
 
 +
=== Web interface ===
 +
 
 +
The fish prompt and terminal colors can be set with the interactive web interface:
 +
 
 +
fish_config
 +
 
 +
Selected settings are written to your personal configuration file. You can also view defined functions and your history.
 +
 
 +
=== Prompt ===
 +
 
 +
If you would like fish to display the branch and dirty status when you are in a git directory, you can add the following to your {{ic|~/.config/fish/config.fish}}:
 
{{bc|<nowiki>
 
{{bc|<nowiki>
# Fish git prompt
+
# fish git prompt
 
set __fish_git_prompt_showdirtystate 'yes'
 
set __fish_git_prompt_showdirtystate 'yes'
 
set __fish_git_prompt_showstashstate 'yes'
 
set __fish_git_prompt_showstashstate 'yes'
Line 95: Line 107:
 
</nowiki>}}
 
</nowiki>}}
  
If ''su'' starts with Bash (because Bash is the default shell), define a function in Fish:
+
=== Command completion ===
$  funced su
+
function su
+
        /bin/su --shell=/usr/bin/fish $argv
+
end
+
$ funcsave su
+
  
=== Pacman and Fish ===
+
fish can generate autocompletions from man pages. Completions are written to {{ic|~/.config/fish/generated_completions/}} and can be generated by calling:
  
Context-aware completions for Arch Linux-specific commands like ''pacman'', ''pacman-key'', ''makepkg'', ''cower'', ''pbget'', ''pacmatic'' are built into Fish, since the policy of the Fish development is to include all the existent completions in the upstream tarball. The memory management is clever enough to avoid any negative impact on resources.
+
fish_update_completions
 +
 
 +
You can also define your own completions in {{ic|~/.config/fish/completions/}}. See {{ic|/usr/share/fish/completions/}} for a few examples.
 +
 
 +
Context-aware completions for Arch Linux-specific commands like ''pacman'', ''pacman-key'', ''makepkg'', ''cower'', ''pbget'', ''pacmatic'' are built into fish, since the policy of the fish development is to include all the existent completions in the upstream tarball. The memory management is clever enough to avoid any negative impact on resources.
 +
 
 +
=== /etc/profile and ~/.profile compatibility ===
 +
 
 +
Since standard POSIX {{ic|sh}} syntax is not compatible with fish, fish will not be able to source {{ic|/etc/profile}} (and thus all {{ic|*.sh}} in {{ic|/etc/profile.d}}) and {{ic|~/.profile}}
 +
 
 +
If you want fish to source those files, install {{Pkg|dash}} and add this line to your {{ic|config.fish}}:
 +
env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source
 +
 
 +
an alternative variant will save you one executable invocation by using a builtin command:
 +
env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source
 +
 
 +
==Tips and Tricks==
 +
===History Substitution===
 +
Fish does not implement history substitution (e.g. {{ic|sudo !!}}), and the fish developers have said that they [http://fishshell.com/docs/current/faq.html#faq-history do not plan to]. Still, this is an essential piece of many users' workflow. Reddit user, [http://www.reddit.com/u/crossroads1112 crossroads1112], created a function that regains some of the functionality of history substitution and with another syntax. The function is on [https://gist.github.com/crossroads1112/77badb2c3455e23b873b github] and instructions are included as comments in it. There is a [https://gist.github.com/b-/981892a65837ab0a387e forked version] that is closer to the original syntax and allows for {{ic|command !!}} if you specify the command in the helper function.
  
 
== Troubleshooting ==
 
== Troubleshooting ==
  
In Arch, there are a lot of shell scripts written for Bash, and these have not been translated to Fish. It is advisable not to set Fish as your default shell because of this. The best option is to open your terminal emulator with a command line option that executes Fish. For most terminals this is the {{ic|-e}} switch, so for example, to open gnome-terminal using Fish, change your shortcut to use:
+
=== Scripts not compatiable with fish ===
 +
In Arch, some shell scripts are written for Bash, and not fully compatible to fish. You may meet some script error if your default shell is set as fish. The best option is to open your terminal emulator with a command line option that executes fish. For most terminals this is the {{ic|-e}} switch, so for example, to open gnome-terminal using fish, change your shortcut to use:
  
 
  gnome-terminal -e fish
 
  gnome-terminal -e fish
  
With LilyTerm and other light terminal emulators that don't support setting the shell it would look like this:
+
With LilyTerm and other light terminal emulators that do not support setting the shell it would look like this:
  
 
  SHELL=/usr/bin/fish lilyterm
 
  SHELL=/usr/bin/fish lilyterm
  
Another option is to set Fish as the default shell for the terminal in the terminal's configuration or for a terminal profile if your terminal emulator has a profiles feature. This is contrast to changing the default shell for the user which would cause the above mentioned problem.
+
Another option is to set fish as the default shell for the terminal in the terminal's configuration or for a terminal profile if your terminal emulator has a profiles feature. This is contrast to changing the default shell for the user which would cause the above mentioned problem.
  
To set Fish as the shell started in tmux, put this into your {{ic|~/.tmux.conf}}:
+
To set fish as the shell started in tmux, put this into your {{ic|~/.tmux.conf}}:
  
 
  set-option -g default-shell "/usr/bin/fish"
 
  set-option -g default-shell "/usr/bin/fish"
  
Not setting Fish as system wide default allows the arch scripts to run on startup, ensure the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like Fish.
+
Not setting fish as system wide default allows the arch scripts to run on startup, ensure the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like fish.
  
If you decide to set Fish as your default shell, you may find that you no longer have very much in your path.
+
If you decide to set fish as your default shell, you may find that you no longer have very much in your path.
 
You can add a section to your {{ic|~/.config/fish/config.fish}} file that will set your path correctly on login. This is much like {{ic|.profile}} or {{ic|.bash_profile}} as it is only executed for login shells.
 
You can add a section to your {{ic|~/.config/fish/config.fish}} file that will set your path correctly on login. This is much like {{ic|.profile}} or {{ic|.bash_profile}} as it is only executed for login shells.
  
Line 133: Line 159:
 
}}
 
}}
  
Note that you will need to manually add various other environment variables, such as {{ic|$MOZ_PLUGIN_PATH}}. It is a huge amount of work to get a seamless experience with Fish as your default shell.
+
Note that you will need to manually add various other environment variables, such as {{ic|$MOZ_PLUGIN_PATH}}. It is a huge amount of work to get a seamless experience with fish as your default shell.
  
== Current state of Fish development ==
+
=== su launching Bash ===
  
The original developer, [https://github.com/liljencrantz Axel Liljencrantz] has [http://www.mail-archive.com/fish-users@lists.sourceforge.net/msg02893.html abandoned the project]. The rest of his team slowly took over and transferred the codebase to [http://gitorious.org/fish-shell gitorius].
+
If ''su'' starts with Bash (because Bash is the default shell), define a function in fish:
 +
$ funced su
 +
function su
 +
        /bin/su --shell=/usr/bin/fish $argv
 +
end
 +
$ funcsave su
  
So far several bug fixes are available from the git repository. Also, there is an AUR package for the git master branch, which is considered stable for everyday use: {{AUR|fish-git}}.
+
=== Start X at login ===
  
On May 30, 2012 [http://ridiculousfish.com/shell/ ridiculous_fish] has [http://www.mailinglistarchive.com/html/fish-users@lists.sourceforge.net/2012-05/msg00004.html announced] a new fork of Fish which [http://www.mailinglistarchive.com/html/fish-users@lists.sourceforge.net/2012-05/msg00023.html has been adopted] as mainstream later, and development is now relocated to [https://github.com/fish-shell/fish-shell github]. The AUR package {{AUR|fish-shell-git}} follows the head branch of that, while the Fish package in the official repositories provides latest stable milestones as announced on the webpage.
+
Add the following to the bottom of your {{ic|~/.config/fish/config.fish}}.
 +
 
 +
{{bc|1=<nowiki>
 +
# start X at login
 +
if status --is-login
 +
    if test -z "$DISPLAY" -a $XDG_VTNR -eq 1
 +
        exec startx -- -keeptty
 +
    end
 +
end
 +
</nowiki>}}
  
Ridiculous_fish has [http://ridiculousfish.com/blog/posts/fish_shell.html announced fish 2.0 stable version] at May 17th, 2013.
+
{{Note|See [https://github.com/fish-shell/fish-shell/issues/1772 this issue] for reasons why {{ic|startx}} requires the {{ic|-keeptty}} flag when using fish.}}
  
 
== See also ==
 
== See also ==
  
 
* http://fishshell.com/ - Home page
 
* http://fishshell.com/ - Home page
* http://fishshell.com/docs/2.0/index.html - Documentation
+
* http://fishshell.com/docs/2.1/index.html - Documentation

Latest revision as of 00:54, 21 April 2016

fish (the friendly interactive shell) is a user friendly command line shell intended mostly for interactive use.

Installation

Install the fish package. Alternatively install the fish-gitAUR package for the development version.

To make fish the default shell, see Shell#Changing your default shell.

Input/output

File descriptors

Like other shells, fish lets you redirect input/output streams. This is useful when using text files to save programs output or errors, or when using text files as input. Most programs use three input/output streams, represented by numbers called file descriptors (FD). These are:

  • Standard input (FD 0), used for reading (keyboard by default).
  • Standard output (FD 1), used for writing (screen by default).
  • Standard error (FD 2), used for displaying errors and warnings (screen by default).

Redirection

Any file descriptor can be directed to other files through a mechanism called redirection:

Redirecting standard input:
$ command < source_file

Redirecting standard output:
$ command > destination

Appending standard output to an existing file:
$ command >> destination

Redirecting standard error:
$ command ^ destination

Appending standard error to an existing file:
$ command ^^ destination

You can use one of the following as destination:

  • A filename (the output will be written to the specified file).
  • An & followed by the number of another file descriptor. The output will be written to the other file descriptor.
  • An & followed by a - sign. The output will not be written anywhere.

Examples:

Redirecting standard output to a file:
$ command > destination_file.txt

Redirecting both standard output and standard error to the same file:
$ command > destination_file.txt ^ &1

Silencing standard output:
$ command > &-

Piping

You can redirect standard output of one command to standard input of the next command. This is done by separating the commands by the pipe character (|). Example:

cat example.txt | head

You can redirect other file descriptors to the pipe (besides standard output). The next example shows how to use standard error of one command as standard input of another command, prepending standard error file descriptor's number and > to the pipe:

$ command 2>| less

This will run command and redirect its standard error to the less command.

Configuration

User configurations for fish are located at ~/.config/fish/config.fish. Adding commands or functions to the file will execute/define them when opening a terminal, similar to .bashrc.

Web interface

The fish prompt and terminal colors can be set with the interactive web interface:

fish_config

Selected settings are written to your personal configuration file. You can also view defined functions and your history.

Prompt

If you would like fish to display the branch and dirty status when you are in a git directory, you can add the following to your ~/.config/fish/config.fish:

# fish git prompt
set __fish_git_prompt_showdirtystate 'yes'
set __fish_git_prompt_showstashstate 'yes'
set __fish_git_prompt_showupstream 'yes'
set __fish_git_prompt_color_branch yellow

# Status Chars
set __fish_git_prompt_char_dirtystate '⚡'
set __fish_git_prompt_char_stagedstate '→'
set __fish_git_prompt_char_stashstate '↩'
set __fish_git_prompt_char_upstream_ahead '↑'
set __fish_git_prompt_char_upstream_behind '↓'
 
function fish_prompt
        set last_status $status
        set_color $fish_color_cwd
        printf '%s' (prompt_pwd)
        set_color normal
        printf '%s ' (__fish_git_prompt)
       set_color normal
end

Command completion

fish can generate autocompletions from man pages. Completions are written to ~/.config/fish/generated_completions/ and can be generated by calling:

fish_update_completions

You can also define your own completions in ~/.config/fish/completions/. See /usr/share/fish/completions/ for a few examples.

Context-aware completions for Arch Linux-specific commands like pacman, pacman-key, makepkg, cower, pbget, pacmatic are built into fish, since the policy of the fish development is to include all the existent completions in the upstream tarball. The memory management is clever enough to avoid any negative impact on resources.

/etc/profile and ~/.profile compatibility

Since standard POSIX sh syntax is not compatible with fish, fish will not be able to source /etc/profile (and thus all *.sh in /etc/profile.d) and ~/.profile

If you want fish to source those files, install dash and add this line to your config.fish:

env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source

an alternative variant will save you one executable invocation by using a builtin command:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

Tips and Tricks

History Substitution

Fish does not implement history substitution (e.g. sudo !!), and the fish developers have said that they do not plan to. Still, this is an essential piece of many users' workflow. Reddit user, crossroads1112, created a function that regains some of the functionality of history substitution and with another syntax. The function is on github and instructions are included as comments in it. There is a forked version that is closer to the original syntax and allows for command !! if you specify the command in the helper function.

Troubleshooting

Scripts not compatiable with fish

In Arch, some shell scripts are written for Bash, and not fully compatible to fish. You may meet some script error if your default shell is set as fish. The best option is to open your terminal emulator with a command line option that executes fish. For most terminals this is the -e switch, so for example, to open gnome-terminal using fish, change your shortcut to use:

gnome-terminal -e fish

With LilyTerm and other light terminal emulators that do not support setting the shell it would look like this:

SHELL=/usr/bin/fish lilyterm

Another option is to set fish as the default shell for the terminal in the terminal's configuration or for a terminal profile if your terminal emulator has a profiles feature. This is contrast to changing the default shell for the user which would cause the above mentioned problem.

To set fish as the shell started in tmux, put this into your ~/.tmux.conf:

set-option -g default-shell "/usr/bin/fish"

Not setting fish as system wide default allows the arch scripts to run on startup, ensure the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like fish.

If you decide to set fish as your default shell, you may find that you no longer have very much in your path. You can add a section to your ~/.config/fish/config.fish file that will set your path correctly on login. This is much like .profile or .bash_profile as it is only executed for login shells.

if status --is-login
        set PATH $PATH /usr/bin /sbin
end

Note that you will need to manually add various other environment variables, such as $MOZ_PLUGIN_PATH. It is a huge amount of work to get a seamless experience with fish as your default shell.

su launching Bash

If su starts with Bash (because Bash is the default shell), define a function in fish:

$ funced su
function su
        /bin/su --shell=/usr/bin/fish $argv
end
$ funcsave su

Start X at login

Add the following to the bottom of your ~/.config/fish/config.fish.

# start X at login
if status --is-login
    if test -z "$DISPLAY" -a $XDG_VTNR -eq 1
        exec startx -- -keeptty
    end
end
Note: See this issue for reasons why startx requires the -keeptty flag when using fish.

See also