<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Fish</id>
	<title>Fish - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Fish"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Fish&amp;action=history"/>
	<updated>2026-07-06T19:13:11Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Fish&amp;diff=519724&amp;oldid=prev</id>
		<title>imported&gt;Nullizer：​增加或调整分类</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Fish&amp;diff=519724&amp;oldid=prev"/>
		<updated>2025-10-26T04:24:54Z</updated>

		<summary type="html">&lt;p&gt;增加或调整分类&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{onesource|time=2019-06-13T16:05:27+00:00}}&lt;br /&gt;
{{primarysources|time=2019-06-13T16:05:27+00:00}}&lt;br /&gt;
{{NoteTA|G1=IT|G2=FL}}&lt;br /&gt;
{{lowercase}}{{otheruses|other=Fish的其他意思|subject=Unix shell|Fish (消歧義)}}&lt;br /&gt;
{{infobox software&lt;br /&gt;
| name = fish&lt;br /&gt;
| logo = Fish icon.png&lt;br /&gt;
| screenshot = Fish shell 4.0.0 screenshot.webp&lt;br /&gt;
| screenshot size = 300px&lt;br /&gt;
| author = Axel Liljencrantz&lt;br /&gt;
| developer = fish-shell developers&lt;br /&gt;
| released = {{Start date and age|2005|02|13}}&lt;br /&gt;
| operating system = [[Unix-like]]&lt;br /&gt;
| genre = [[Unix shell]]&lt;br /&gt;
| license = [[GNU通用公共许可证]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;fish&amp;#039;&amp;#039;&amp;#039; ({{langx|en|&amp;#039;&amp;#039;&amp;#039;f&amp;#039;&amp;#039;&amp;#039;riendly &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039;nteractive &amp;#039;&amp;#039;&amp;#039;sh&amp;#039;&amp;#039;&amp;#039;ell}}) 是一个[[Unix shell]]。fish旨在成为一个比其他shell交互性更强、用户体验更好的shell，并让其丰富的强大功能能够被用户轻松发现、记住并学以致用。fish的语法既不衍生于[[Bourne shell]]也不衍生于[[C Shell]]，故被分类为一种“外来”shell。有别于为节约系统资源而默认禁用部分功能的其他shell，fish的全部功能都是默认启用的。&lt;br /&gt;
&lt;br /&gt;
== 特色 ==&lt;br /&gt;
fish能根据用户的输入历史与当前所在的目录提供实时的[[自动完成]]。与[[bash]]的类似功能{{Keypress|Ctrl|R}}历史搜索相比，这种不必频繁切换模式还可以用方向键选择建议项的做法使用户能更流畅地进行输入。&lt;br /&gt;
&lt;br /&gt;
fish也拥有功能丰富的Tab补全功能。fish能够自动补全文件路径、变量与不少命令的参数，且支持路径[[通配符]]与C shell的花括号展开。fish某种意义上会通过分析命令的man文档生成与之相关的补全。&lt;br /&gt;
&lt;br /&gt;
fish倾向于使用命令来代替语法结构。由于命令相比语法结构能更方便地在shell内查到帮助内容，fish的功能很容易在使用过程中被用户自行发现。fish允许[[子程序]]提供对自己的说明，进一步免去了来回查找帮助的麻烦。fish还允许用户在拥有[[图形用户界面]]的[[网页浏览器|浏览器]]内查看帮助。&lt;br /&gt;
&lt;br /&gt;
== 语法 ==&lt;br /&gt;
&lt;br /&gt;
fish的语法类似于其他兼容[[可移植操作系统接口|POSIX]]的shell，但由于其开发者认为POSIX shell设计得有问题，fish的语法又与POSIX shell有相当的不同。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# 下面演示将&amp;quot;bar&amp;quot;赋给变量foo的过程。&lt;br /&gt;
# 由于等号在其他shell中会根据两端是否有空格而表现出不同的行为，&lt;br /&gt;
# fish选择了不在赋值中使用这个令人困惑的符号。&lt;br /&gt;
# set命令也可以用于数组，并可以轻松设置变量的作用域。&lt;br /&gt;
&amp;gt; set foo bar&lt;br /&gt;
&amp;gt; echo $foo&lt;br /&gt;
bar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# 下面演示使用命令替换将pwd的输出赋给wd的过程。&lt;br /&gt;
# 由于重音符（`）视觉上容易与单引号混淆且左右的符号都相同的话难以嵌套，&lt;br /&gt;
# fish改为在命令替换中使用括号。&lt;br /&gt;
# 但与ksh不同的是，fish仅在变量展开中使用美元符号。&lt;br /&gt;
&amp;gt; set wd (pwd)&lt;br /&gt;
&amp;gt; echo $wd&lt;br /&gt;
~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# 将一个有五个元素的数组赋给A。&lt;br /&gt;
&amp;gt; set A 3 5 7 9 12&lt;br /&gt;
# 将A的第二个和第一个元素赋给B。&lt;br /&gt;
# fish的数组索引从1开始。&lt;br /&gt;
&amp;gt; set B $A[2 1]&lt;br /&gt;
&amp;gt; echo $B&lt;br /&gt;
5 3&lt;br /&gt;
# 可以用命令替换索引数组中的元素……&lt;br /&gt;
&amp;gt; seq 3&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;gt; echo $A[(seq 3)]&lt;br /&gt;
3 5 7&lt;br /&gt;
# ……也可以用其他数组来索引。&lt;br /&gt;
# 下面将从A中删除第五个与第三个元素。&lt;br /&gt;
&amp;gt; set --erase A[$B]&lt;br /&gt;
&amp;gt; echo $A&lt;br /&gt;
3 5 9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# for循环。&lt;br /&gt;
&amp;gt; for i in *.jpg&lt;br /&gt;
      convert $i (basename $i .jpg).png&lt;br /&gt;
  end&lt;br /&gt;
# 分号可以代替换行来标记语句的结束：&lt;br /&gt;
&amp;gt; for i in *.jpg; convert $i (basename $i .jpg).png; end&lt;br /&gt;
# 但由于fish也会在历史记录中分开记录每一行，使用换行一般更加方便。&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# while循环。&lt;br /&gt;
# 下面演示输出/etc/passwd中每行的第五个字段。&lt;br /&gt;
&amp;gt; cat /etc/passwd | while read line&lt;br /&gt;
      set arr (echo $line|tr : \n)&lt;br /&gt;
      echo $arr[5]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 没有子shell ===&lt;br /&gt;
其他shell的部分语法结构，例如[[管道 (Unix)|管道]]、[[子程序]]与[[迴圈|循环]]，是使用一种称为子shell的方式实现的。所谓子shell即临时执行一个用完即退出的新的子进程。在子shell中执行的修改通常不符合一般人的直觉地，不会反映到真正的shell上（即没有[[函数副作用]]）。fish不依赖于子shell实现其语法结构，故所有内置命令在任何语境下都是会正常运作的。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# 相当多的shell会将read在单独的子shell中执行，所以如下语句在他们中无法按预期工作。&lt;br /&gt;
# 在常见shell中，bash的管道右边无法产生副作用，故line并不会被赋值；&lt;br /&gt;
# ksh中line会被正确赋值，但管道左边的语句无法产生副作用；&lt;br /&gt;
# 但是fish和zsh一样，允许管道两边都能有副作用。&lt;br /&gt;
&amp;gt; cat *.txt | read line&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
例如，下述bash脚本会因为子shell而导致循环内部给found赋的值在退出循环后即消失&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
found=&amp;#039;&amp;#039;&lt;br /&gt;
cat /etc/fstab | while read dev mnt rest; do&lt;br /&gt;
  if test &amp;quot;$mnt&amp;quot; = &amp;quot;/&amp;quot;; then&lt;br /&gt;
    found=&amp;quot;$dev&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;而需要用另一种方式来规避这个问题：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
found=&amp;#039;&amp;#039;&lt;br /&gt;
while read dev mnt rest; do&lt;br /&gt;
  if test &amp;quot;$mnt&amp;quot; = &amp;quot;/&amp;quot;; then&lt;br /&gt;
    found=&amp;quot;$dev&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
done &amp;lt; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如下的fish脚本则无需担心子shell会影响副作用。&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
set found &amp;#039;&amp;#039;&lt;br /&gt;
cat /etc/fstab | while read dev mnt rest&lt;br /&gt;
  if test &amp;quot;$mnt&amp;quot; = &amp;quot;/&amp;quot;&lt;br /&gt;
    set found $dev&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 有用的错误信息 ==&lt;br /&gt;
fish会在发生错误时清晰地指出出错的位置并给出修正的方法。&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; foo=bar&lt;br /&gt;
fish: Unknown command “foo=bar”. Did you mean “set VARIABLE VALUE”?&lt;br /&gt;
For information on setting variable values, see the help section on&lt;br /&gt;
the set command by typing “help set”.&lt;br /&gt;
# fish：未知的命令&amp;quot;foo=bar&amp;quot;。你是想输入&amp;quot;set 变量 值&amp;quot;吗？&lt;br /&gt;
# 关于如何设置变量的值，请输入&amp;quot;help set&amp;quot;获取set命令的帮助。&lt;br /&gt;
&lt;br /&gt;
&amp;gt; echo ${foo}bar&lt;br /&gt;
fish: Did you mean {$VARIABLE}? The &amp;#039;$&amp;#039; character begins a variable&lt;br /&gt;
name. A bracket, which directly followed a &amp;#039;$&amp;#039;, is not allowed as a&lt;br /&gt;
part of a variable name, and variable names may not be zero characters&lt;br /&gt;
long. To learn more about variable expansion in fish, type “help&lt;br /&gt;
expand-variable”.&lt;br /&gt;
# fish：你是想输入{$变量}吗？美元符号&amp;quot;$&amp;quot;仅用于变量名开头，而美元符号后的&lt;br /&gt;
# 那个花括号并不能作为变量名称的一部分，且变量也不能没有名称。&lt;br /&gt;
# 关于如何展开变量，请输入&amp;quot;help expand-variable&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
&amp;gt; echo $(pwd)&lt;br /&gt;
fish: Did you mean (COMMAND)? In fish, the &amp;#039;$&amp;#039; character is only used&lt;br /&gt;
for accessing variables. To learn more about command substitution in&lt;br /&gt;
fish, type “help expand-command-substitution”.&lt;br /&gt;
# fish: 你是想输入(命令)吗？在fish中，美元符号&amp;quot;$&amp;quot;仅用于访问变量。&lt;br /&gt;
# 关于如何进行命令替换，请输入&amp;quot;help expand-command-substitution&amp;quot;。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 通用变量 ==&lt;br /&gt;
Fish有一个名为通用变量的功能。通过利用通用变量，用户可以在多个同时运行的fish实例之间共享一个变量。即使用户注销或者计算机重启，通用变量的值也不会丢失。&amp;lt;syntaxhighlight lang=&amp;quot;fish&amp;quot;&amp;gt;&lt;br /&gt;
# 将emacs设置为默认文本编辑器。&lt;br /&gt;
# &amp;quot;--universal&amp;quot;或者&amp;quot;-U&amp;quot;表示设置通用变量。&lt;br /&gt;
&amp;gt; set --universal EDITOR emacs&lt;br /&gt;
&lt;br /&gt;
# 如下命令会把fish的提示符中的当前目录变成蓝色。&lt;br /&gt;
# 不止执行命令的这个fish，现在所有正在运行的fish的提示符都会发生变化。&lt;br /&gt;
&amp;gt; set --universal fish_color_cwd blue&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 其它功能 ==&lt;br /&gt;
* 高级tab补全&lt;br /&gt;
* 带完备的错误检查的[[語法突顯|语法高亮]]&lt;br /&gt;
* 支持[[X Window系統]]的[[剪贴板]]&lt;br /&gt;
* 基于{{Internal link helper/en|terminfo|terminfo}}的智能[[終端|终端]]处理&lt;br /&gt;
* 可搜索的[[命令行历史记录]]&lt;br /&gt;
&lt;br /&gt;
第二版还加入了如下功能：&lt;br /&gt;
&lt;br /&gt;
* 自动补全&lt;br /&gt;
* 支持256色&lt;br /&gt;
* 基于网页的配置功能&lt;br /&gt;
* 能够提升性能的更多的内置命令&lt;br /&gt;
&lt;br /&gt;
== 參考 ==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 另请参阅 ==&lt;br /&gt;
{{portal|Free software|Free Software Portal Logo.svg}}&lt;br /&gt;
* [[Unix shell]]&lt;br /&gt;
*{{Link-en|shell对比|Comparison of command shells}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* [http://fishshell.org 项目主页]{{Wayback|url=http://fishshell.org/ |date=20090219001811 }}&lt;br /&gt;
*[[GitHub]]上的[https://github.com/fish-shell/fish-shell fish]{{Wayback|url=https://github.com/fish-shell/fish-shell |date=20181220120639 }}仓库&lt;br /&gt;
*{{Internal link helper/en|Gitorious|Gitorious}}上的[https://web.archive.org/web/20110726104750/http://gitorious.org/fish-shell/ fish]仓库（不再使用）&lt;br /&gt;
*[[SourceForge]]上的[http://sourceforge.net/projects/fish/ fish]{{Wayback|url=http://sourceforge.net/projects/fish/ |date=20090705111449 }}仓库（不再使用）&lt;br /&gt;
*[https://lists.sourceforge.net/lists/listinfo/fish-users Fish-users]{{Wayback|url=https://lists.sourceforge.net/lists/listinfo/fish-users |date=20160308065537 }} - fish用户的综合讨论列表&lt;br /&gt;
*[https://github.com/fish-shell/fish-shell/wiki/Shell-Translation-Dictionary bash到fish的命令翻译对照]{{Wayback|url=https://github.com/fish-shell/fish-shell/wiki/Shell-Translation-Dictionary |date=20190216030401 }}&lt;br /&gt;
&lt;br /&gt;
{{Unix Shells}}&lt;br /&gt;
&lt;br /&gt;
[[Category:脚本语言]]&lt;br /&gt;
[[Category:用C編程的自由軟體]]&lt;br /&gt;
[[Category:面向文本编程语言]]&lt;br /&gt;
[[Category:Unix shells]]&lt;br /&gt;
[[Category:用Rust编程的自由软件]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Nullizer</name></author>
	</entry>
</feed>