Difference between revisions of "Fish (简体中文)"

From ArchWiki
Jump to navigation Jump to search
(Completed translation update to 把fish设为默认shell →‎把fish设为默认shell)
(Updated translation of System integration)
Line 1: Line 1:
{{lowercase title}}
 
[[Category:Command shells (简体中文)]]
 
[[en:Fish]]
 
[[de:Fish]]
 
[[ja:Fish]]
 
[[ru:Fish]]
 
{{TranslationStatus (简体中文)|Fish|2019-05-08|567009}}
 
[https://fishshell.com fish]是“'''''f'''riendly '''i'''nteractive '''sh'''ell''”的缩写,是一个“交互式的、对用户友好的 [[command-line shell|命令行shell]]”。
 
 
''fish''被有意设计成不完全与[[Wikipedia:POSIX|POSIX]]兼容。fish的作者们认为POSIX中存在一些缺陷和矛盾,并通过fish简化的或不同的语法解决这些问题。因此,即使简单的POSIX兼容的脚本也可能需要较多的修改,甚至完全重写,才能在fish中运行。
 
 
== 安装 ==
 
 
安装{{Pkg|fish}}软件包。也可以从AUR安装开发版的{{AUR|fish-git}}。
 
 
安装完成后,输入{{ic|fish}}即可进入fish shell。
 
 
要查看帮助文档,在fish中输入{{ic|help}}。文档将会在浏览器中打开。建议用户至少读完文档中“Syntax overview”这一节内容,因为fish的语法和其他shell的不太一样。
 
 
 
== 把fish集成到系统中 ==
 
== 把fish集成到系统中 ==
  
Line 38: Line 19:
 
这三个路径就会一直保持在{{ic|$PATH}}中。这种方式比较简单,因为不需要修改配置文件。
 
这三个路径就会一直保持在{{ic|$PATH}}中。这种方式比较简单,因为不需要修改配置文件。
  
== 配置 ==
+
=== 只把fish设为交互式shell ===
 
 
fish的配置脚本保存在{{ic|~/.config/fish/config.fish}},这个文件就和 {{ic|.bashrc}}一样。当启动终端时,fish会执行这个文件中的脚本。
 
 
 
=== 网页配置接口 ===
 
 
 
通过下面命令即可用浏览器打开fish的配置页面。
 
 
 
fish_config
 
 
 
在浏览器中可以交互式配置提示和颜色主题, 配置会保存到个人配置文件, 你也可以在浏览器中查看自己定义的函数和命令历史。
 
 
 
=== 命令补全 ===
 
 
 
fish可以通过解析man的数据,生成自动补全规则,这些自动补全规则保存于{{ic|~/.config/fish/generated_completions/}}。可以运行下面命令更新自动补齐规则。
 
 
 
fish_update_completions
 
 
 
你也可以在 {{ic|~/.config/fish/completions/}} 中定义自己的自动补全规则. {{ic|/usr/share/fish/completions/}} 有更多的例子。
 
 
 
对Arch Linux来说, ''pacman'', ''pacman-key'', ''makepkg'', ''cower'', ''pbget'', ''pacmatic''这些命令的自动补全规则已经在fish中内置了----fish在不同的发行版中内置了不同的命令补全规则。fish的内存管理足够智能,不会因为命令补全产生负面影响。
 
 
 
==故障排除==
 
===历史记录===
 
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.
 
 
 
Other alternatives to regaining the {{ic|command !!}} syntax can be found on [https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution-%28%21%21-and-%21%24%29 Fish' github wiki]. The examples here include e.g. the {{ic|bind_bang}} function which expands {{ic|!!}} to the latest command in the history (this will of course make it impossible to do to bangs in a row as they will expand). Another option is the command given on [https://github.com/fish-shell/fish-shell/issues/288#issuecomment-158704275 this github issue].
 
 
 
==提示与技巧==
 
  
=== 不要把fish设为默认shell ===
+
如果不将fish设为默认shell,就能照常运行Bash的初始化脚本。这能够保证用户当前的环境变量不受影响并且在fish中也能使用,因为fish是作为Bash的子进程运行的。下面是几种只把fish设为交互式shell的方法。
  
在Arch中,很多shell脚本都是为[[Bash]]而写的,并且与fish不兼容。这里不建议把fish设为默认shell,把bash设为默认shell可以使得那些为bash而写的脚本可以正常运行,确保系统环境正常初始化,环境变量正常配置。如果你把fish设为默认的shell,很可能会在启动shell时看到报错信息。
+
==== 通过.bashrc启动fish ====
  
下面是一些技巧,能够使得即使不把fish设为默认shell,也能够在登录的时候自动进入fish。
+
保持默认shell为Bash不变,然后添加一行{{ic|exec fish}}到合适的[[Bash#Configuration files|Bash配置文件]]中,比如{{ic|.bashrc}}。在这种方法中,Bash会正常执行{{ic|/etc/profile}}和{{ic|/etc/profile.d}}中的所有配置文件。相对于之后几种方法,这种是最通用的,因为这种方法在本机计算机和SSH远程计算机上都能使用。
 
==== 修改.bashrc来启动fish ====
 
  
把bash设为你的默认shell,只需要在你的bash配置文件[[Bash#Configuration files]](一般是{{ic|.bashrc}})的最后一行加入 {{ic|exec fish}},即可在进入bash之后自动启动fish。这种做法使得Bash可以正常的运行 {{ic|/etc/profile}} {{ic|/etc/profile.d}}下的配置。因为''fish''替代了bash 进程,退出 ''fish''也会自动退出终端。和下一个方法相比,这种做法更通用,因为它能够同时在本地和SSH远程连接时运作。
+
{{Tip|
 +
* 在这种配置下,要使用Bash而不是接着启动fish,需要使用{{ic|bash --norc}},以防止Bash加载{{ic|~/.bashrc}}并执行{{ic|exec fish}}
 +
* 要让类似于{{ic|bash -c 'echo test'}}中的命令在Bash中执行而不是启动fish,你可以将{{ic|exec fish}}换为{{ic|if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi}}。}}
  
{{Tip|如果你想进入bash而不是fish,使用命令 {{ic|bash --norc}} }}
+
==== 使用终端模拟器的选项 ====
  
==== 设为默认终端模拟器shell ====
+
另一种方法是在启动终端模拟器时通过添加命令行选项来启动fish。对于大部分的终端,这个选项是 {{ic|-e}}。比如,要打开gnome-terminal并运行fish,可以将gnome-terminal的快捷方式改为:
 
 
另外一种自动启动fish的方法是专门针对终端模拟器设置默认解释器。对大多数终端模拟器来说,只需要{{ic|-e}} 选项即可完成配置修改。以gnome终端模拟器为例,修改使用fish的命令如下:
 
  
 
  gnome-terminal -e fish
 
  gnome-terminal -e fish
  
LilyTerm等轻量级的终端模拟器,不支持通过命令设置默认的解释器,这时候可以通过环境变量的方式:
+
对于不支持设置shell的终端模拟器,比如{{aur|lilyterm-git}},则需要这样:
  
 
  SHELL=/usr/bin/fish lilyterm
 
  SHELL=/usr/bin/fish lilyterm
  
你也可以通过修改终端模拟器的配置文件来完成配置。
+
另外,有些终端可以在设置或配置文件中将fish设为默认shell。
 
这样,当你打开终端模拟器的时候,就会自动的进入fish。
 
  
====设为默认终端服用器shell ====
+
==== 使用终端复用器的选项 ====
  
如果要为tmux设置默认的shell,只需要把下面这句话放到 {{ic|~/.tmux.conf}}:
+
要将fish设为[[tmux]]启动的默认shell,在{{ic|~/.tmux.conf}}中加入这行:
  
 
  set-option -g default-shell "/usr/bin/fish"
 
  set-option -g default-shell "/usr/bin/fish"
  
这样只要启动''tmux'',都会自动进入fish。
+
''tmux''启动时,就会自动进入fish。
 
 
===关闭问候语===
 
 
 
默认情况下,每次启动fish,fish都会打印问候语。你可以在fish的配置文件中增加 {{ic|set fish_greeting}}以关闭它。
 
 
 
=== 配置su命令默认启动fish ===
 
 
 
当你使用"su"用户切换到其他用户的时候,默认使用的shell是Bash,但是你可以在fish的配置文件中添加一个函数覆盖默认的"su"命令,使得你在使用"su"命令切换用户的时候会自动使用fish:
 
 
 
function su
 
    /bin/su --shell=/usr/bin/fish $argv
 
end
 
 
 
=== 登录fish时自动开启X ===
 
 
 
把下面配置添加到 {{ic|~/.config/fish/config.fish}},即可在你登录tty1的时候自动启动X。
 
 
 
{{bc|1=<nowiki>
 
# Start X at login
 
if status --is-login
 
    if test -z "$DISPLAY" -a $XDG_VTNR = 1
 
        exec startx -- -keeptty
 
    end
 
end
 
</nowiki>}}
 
 
 
=== 使用 liquidprompt ===
 
 
 
[https://github.com/nojhan/liquidprompt Liquidprompt] is a popular "full-featured & carefully designed adaptive prompt for Bash & Zsh" and has no plans to make it compatible with fish [https://github.com/nojhan/liquidprompt/pull/230]. [https://github.com/wesbarnett/fish-lp This project] implements it for fish.
 
 
 
=== 在提示中增加git 状态 ===
 
 
 
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>
 
# 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
 
</nowiki>}}
 
 
 
===  ssh-agent 问题 ===
 
 
 
在fish中,{{ic|eval (ssh-agent)}}会因为变量的设置方式而报错。一个变通的方案是使用csh风格的选项{{ic|-c}}:
 
 
 
  $ eval (ssh-agent -c)
 
 
 
===  "command not found" 钩子 ===
 
 
 
[[pkgfile]] 包含了一个 "未找到命令"("command not found") 钩子,但你输入一个当前系统不存在的命令,pkgfile会自动从官方仓库中搜索哪个安装包有这个命令。只要你安装了[[pkgfile]],这个钩子就会自动启用。
 
 
 
=== 从jobs中删除进程 ===
 
 
 
当你退出''fish''的时候,所有后台进程也会终止。为了保持一个任务即使在fish退出了之后也继续运行,需要先输入{{ic|disown}}命令,再退出。举例来说,在后台启动firefox,然后退出fish,但firefox在后台继续运行:
 
 
 
 
 
  $ firefox &
 
  $ disown
 
  $ exit
 
 
 
你会发现虽然你退出了fish,但firefox没有退出。请参阅{{man|1|disown|url=}}了解更多细节。
 
 
 
=== 迅速设置别名 ===
 
 
 
如果想要快速的设置一个持久化的别名(即使重启也不会失效),可以直接在fish下输入:
 
{{bc|1=<nowiki>
 
$ alias FooAliasName "foo"
 
$ funcsave FooAliasName
 
</nowiki>}}
 
这种做法会把你的别名设为fish的终端函数。如果你想看所有的函数,或者是编辑它们,你可以使用{{ic|fish_config}} ,然后在'''Function'''标签下进行配置。
 
 
 
== 另请参阅 ==
 
 
 
* http://fishshell.com/ - fish主页
 
* http://fishshell.com/docs/current/index.html - 文档
 
* http://hyperpolyglot.org/unix-shells - Shell 语法对照表
 

Revision as of 03:50, 9 May 2019

把fish集成到系统中

需要考虑的是:是把fish设置为默认shell,也就是用户登录时直接进入的shell,还是通过当前的默认shell启动fish,并只在交互模式下使用fish。这里,我们假设当前的默认shell是Bash

  • 把fish设为默认shell:这种方式需要用户对fish的运行机制及其脚本语言有些基本的了解。用户需要把当前的初始化脚本和环境变量移动到fish的环境中。#把fish设为默认shell中有具体的步骤。
  • 只把fish用作交互式shell:这种方法“破坏性”较小。Bash会照常运行所有的初始化脚本,并在此基础上启动fish。#只把fish设为交互式shell中有具体的步骤。

把fish设为默认shell

如果你决定把fish设为默认的shell,首先你需要将你的用户的shell改为/usr/bin/fish。参照Command-line shell#Changing your default shell中的步骤。

下一步是把Bash的几个初始化脚本中现有的操作和配置写成fish的格式。这些脚本分别是/etc/profile~/.bash_profile/etc/bash.bashrc~/.bashrc

需要特别关注的是,在登录到fish中后,你需要尽快检查、调整环境变量$PATH的内容。在fish中,$PATH是一个全局环境变量,即它的作用范围包含所有函数,它在重启时会被清除,以及它对fish的所有子进程都是可见的(是一个环境变量)。向$PATH添加长期使用的路径的推荐的方法,是将他们赋给fish_user_paths这个全局变量。这个变量的内容重启时不会丢失,并会被自动添加到$PATH中。比如,

$ set -U fish_user_paths /第一个/路径 /第二个/路径 /第三个/路径

这三个路径就会一直保持在$PATH中。这种方式比较简单,因为不需要修改配置文件。

只把fish设为交互式shell

如果不将fish设为默认shell,就能照常运行Bash的初始化脚本。这能够保证用户当前的环境变量不受影响并且在fish中也能使用,因为fish是作为Bash的子进程运行的。下面是几种只把fish设为交互式shell的方法。

通过.bashrc启动fish

保持默认shell为Bash不变,然后添加一行exec fish到合适的Bash配置文件中,比如.bashrc。在这种方法中,Bash会正常执行/etc/profile/etc/profile.d中的所有配置文件。相对于之后几种方法,这种是最通用的,因为这种方法在本机计算机和SSH远程计算机上都能使用。

Tip:
  • 在这种配置下,要使用Bash而不是接着启动fish,需要使用bash --norc,以防止Bash加载~/.bashrc并执行exec fish
  • 要让类似于bash -c 'echo test'中的命令在Bash中执行而不是启动fish,你可以将exec fish换为if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi

使用终端模拟器的选项

另一种方法是在启动终端模拟器时通过添加命令行选项来启动fish。对于大部分的终端,这个选项是 -e。比如,要打开gnome-terminal并运行fish,可以将gnome-terminal的快捷方式改为:

gnome-terminal -e fish

对于不支持设置shell的终端模拟器,比如lilyterm-gitAUR,则需要这样:

SHELL=/usr/bin/fish lilyterm

另外,有些终端可以在设置或配置文件中将fish设为默认shell。

使用终端复用器的选项

要将fish设为tmux启动的默认shell,在~/.tmux.conf中加入这行:

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

tmux启动时,就会自动进入fish。