如何在UbuntuVPS上安装和使用FishShell
介绍
Linux 和类 Unix 操作系统很幸运,它们的操作环境的几乎每个组件都有相当多的替代方案。 服务器用户交互最多的组件之一是命令行 shell。
虽然大多数系统都附带 bash
shell,它代表“Bourne again shell”,它的前身是原始 sh
shell 的创建者,但还有其他许多用户可以从中受益的选项退房。 您可能听说过流行的zsh
,您可以在这里了解。
fish
shell 是另一个全功能的 shell,将成为本指南的主题。 fish
shell 是一个现代、有吸引力且功能强大的命令 shell,它可以扩展通常的 bash
shell 的功能。 在本指南中,我们将学习如何安装、配置和使用这个 shell 替代方案。
我们将在 Ubuntu 12.04 VPS 实例上使用这些,但您应该可以轻松地将其调整为您选择的发行版。
如何安装鱼壳
对我们来说幸运的是,默认的 Ubuntu 12.04 存储库包含 fish
二进制包。
我们可以通过更新我们的本地包索引并将包拉到我们的系统上,以传统方式安装它:
sudo apt-get update sudo apt-get install fish
这就是我们需要做的所有事情,才能将新的 shell 安装到我们的系统上。
要开始玩,我们将从当前会话中启动一个新的 fish
shell。 如果您决定 fish
适合您,我们稍后将讨论如何更改默认 shell:
fish
demouser@host ~>
您可以看到您的提示已更改。 对于普通用户,您将看到一个“>”字符,而不是“$”作为提示。
熟悉一些表面特征
马上,我们就可以开始了解这个 shell 的一些优点,只需了解我们在 shell 中的正常例程。 这些主要是通过我们稍后将研究的包含函数来完成的。
例如,如果您列出目录的内容,您会注意到它们会自动在末尾附加一个指示文件类型的字符:
ls
bin/ etc/ lib/ media/ proc/ sbin/ sys/ var/ boot/ home/ lib64/ mnt/ root/ selinux/ tmp/ vmlinuz@ dev/ initrd.img@ lost+found/ opt/ run/ srv/ usr/
这与 ls -F
的输出相同,后者按类型对内容进行分类。
如果您输入文件路径,无论是相对路径还是绝对路径,您将看到 fish
shell 为目录路径添加了下划线,以便一目了然地解释:
cd /home/demo
如果您的终端能够显示彩色输出,您会注意到您的提示也会自动着色。 此外,它是动态着色的。 如果您键入的内容不是有效的命令,它将显示为红色。
这将是红色的:
ech
但是,当您添加最后的“o”,将其变成命令时,您会看到它立即变为绿色。 这为您提供了有用的反馈,可以很容易地及早发现错别字。
利用 TAB 完成更轻松的时间
您可能还会注意到 TAB 完成非常好:
cd / ## Hit the TAB key at this point
/bin/ (Directory) /media/ (Directory) /srv/ (Directory) /boot/ (Directory) /mnt/ (Directory) /sys/ (Directory) /dev/ (Directory) /opt/ (Directory) /tmp/ (Directory) /etc/ (Directory) /proc/ (Directory) /usr/ (Directory) /home/ (Directory) /run/ (Directory) /var/ (Directory) /lib/ (Directory) /sbin/ (Directory) /lib64/ (Directory) /selinux/ (Directory)
如您所见,fish
智能地列出 only 用于 cd
命令的目录,因为这些是唯一有意义的值。
如果我们使用更通用的命令,我们会看到所有列表(及其类型):
touch / ## Hit the TAB key at this point
/bin/ (Directory) /proc/ (Directory) /boot/ (Directory) /root/ (Directory) /dev/ (Directory) /run/ (Directory) /etc/ (Directory) /sbin/ (Directory) /home/ (Directory) /selinux/ (Directory) /initrd.img (Symbolic link, 15MB) /srv/ (Directory) /lib/ (Directory) /sys/ (Directory) /lib64/ (Directory) /tmp/ (Directory) /lost+found/ (Directory) /usr/ (Directory) /media/ (Directory) /var/ (Directory) /mnt/ (Directory) /vmlinuz (Symbolic link, 5.2MB) /opt/ (Directory)
一个类似的有用功能是 man
命令的格式。 如果我们想查看所有 fish
手册页,我们可以使用制表符完成:
man fish ## Hit the TAB key at this point
fish (1: the friendly interactive shell) fish_indent (1: indenter and prettifier) fish_pager (1: internal command used by fish) fishd (1: universal variable daemon)
同样,您可以使用内置帮助系统使用的任何终端 Web 浏览器获得全功能帮助:
help
fish home | Main documentation page | Design document | Commands | FAQ | License Fish user documentation 1 Table of contents • Fish user documentation □ Table of contents □ Introduction □ Syntax overview □ Help □ Tab completion
在我的机器上,这在 w3m
终端网络浏览器中打开了帮助系统。 您可以像在普通浏览器中一样访问任何链接,并可以通过键入“q”退出。 如果您想查看 fish 知道的特定命令的帮助,只需在之后将其用作参数:
help cd
cd - change directory Synopsis cd [DIRECTORY] Description Changes the current directory. If DIRECTORY is supplied it will become the new directory. If DIRECTORY is a relative path, the paths found in the CDPATH environment variable array will be tried as prefixes for the specified path. If CDPATH is not set, it is assumed to be '.'. If DIRECTORY is not specified, $HOME will be the new directory. Back to index.
同样,您可以通过使用 TAB 完成来查看可用的帮助命令:
help ## Type a space to let fish know you are finished with the command, and then hit the TAB key at this point
alias (Help for the specified command) and (Help for the specified command) begin (Help for the specified command) bg (Help for the specified command) bind (Help for the specified command) block (Help for the specified command) break (Help for the specified command) breakpoint (Help for the specified command) . . .
做一些常见任务的不同方式
许多使用bash
甚至sh
多年的人都会习惯这些shell的工作方式。 虽然 fish
确实继承了这些 shell 的大部分遗产,但它修改了可以提供改进的行为。
重定向、管道和通配符
一个简单的例子是重定向。 正常重定向和管道的工作方式与 bash
相同:
- |:左边命令输出到右边命令输入
- < :从右侧的文件而不是键盘获取标准输入
- >:将标准输出写入右侧文件而不是屏幕
但是,一个区别是重定向标准错误的方式。 您可以使用克拉字符执行此操作:
- ^:将标准错误重定向到右边的位置。
这提供了一种将一个文件描述符重定向到另一个文件描述符的简单方法。 回想一下,每个文件描述符通常都与一个数字相关联:
- 0:标准输入。 默认情况下,您的命令输入是键盘。
- 1:标准输出。 默认情况下,您的命令的输出是屏幕。
- 2:标准错误。 默认情况下,您的命令错误会打印到屏幕上。
我们可以使用“&”字符后跟描述符编号将一个文件描述符重定向到另一个文件描述符。
例如,我们可以将命令的标准输出重定向到文件中,然后将其标准错误也指向我们的标准输出文件,方法是键入如下内容:
ls /etc >ls_results.txt ^&1
所有的标准输出都被放入 ls_results.txt
文件,然后标准错误被设置到标准输出被定向的位置(上面的文件)。
至于通配符,fish
再次使用 bash
中的大部分默认值。 这些包括:
- *:匹配任何不包含“/”的字符串。
- ?:匹配任何单个字符,不包括“/”。
另外一个非常有用的通配符是递归通配符:
- **:匹配任何字符串,包括“/”。
这可以用来轻松地向命令添加递归功能。 即使 ls
有递归选项,我们也可以使用 fish
来做到这一点。 我们可以通过键入以下命令在我们的 /etc
目录中找到所有以 .conf
结尾的文件:
ls /etc/**.conf
/etc/adduser.conf /etc/apparmor/subdomain.conf . . .
在我的机器上,前两行输出显示了这一点。 一个文件位于我们正在搜索的顶级目录中,下一个文件位于子目录中。
创建函数和别名
我们可以使用易于使用的语法在 fish
中创建函数和别名。
基本格式类似于:
功能功能名称功能内容结束
如果您希望解析函数中的参数,可以将它们全部捆绑在 $argv
变量中。 它们被存储为一个数组。
例如,我们可以创建一个这样的函数来打印我们所有的参数:
function say_hello echo hello $argv end
我们可以用一个或多个参数调用它,它会将它们全部传递给 echo
命令:
say_hello John Doe
hello John Doe
如果我们想访问一个特定的变量,通过引用号将它从参数数组中拉出来(在 fish
中,数组从 1 开始,而不是 0)。 我们可以修改我们之前的脚本以仅使用第二个参数:
function hello_sir echo hello Mr. $argv[2] end
然后我们可以调用这个函数,我们会得到不同的结果:
hello_sir John Doe
hello Mr. Doe
我们可以通过键入以下命令查看所有定义的函数:
functions -a
您可以通过键入以下内容来删除您的功能之一:
函数 -e函数名
对于别名,bash
shell 有一个特定的命令。 在 fish
中,它使用相同的函数语法。
唯一需要注意的是,如果该命令取代或替换了它所引用的命令,则必须添加 command
内置命令告诉 shell 不要递归调用该函数,而是使用外部命令。
例如,如果我们希望 cat
命令默认包含编号,我们可能希望重新定义命令以包含该标志。 请记住传递参数变量,以便它可以正确解析文件名:
function cat command cat -n $argv end
现在,当我们调用 cat
时,输出将自动编号:
cat /etc/hosts
1 127.0.0.1 localhost fish fish 2 3 # The following lines are desirable for IPv6 capable hosts 4 ::1 ip6-localhost ip6-loopback 5 fe00::0 ip6-localnet 6 ff00::0 ip6-mcastprefix 7 ff02::1 ip6-allnodes 8 ff02::2 ip6-allrouters
如果您使用函数来覆盖命令的默认值,您还可以使用 command
内置到 绕过 所做的任何修改并获取原始命令。
command cat /etc/hosts
127.0.0.1 localhost fish fish # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
简化历史
虽然 bash
提供了一组非常复杂但有用的历史函数,但 fish
减少了这些并致力于改进基础知识以解决使用问题。
您可以使用 UP
键在历史记录中按时间顺序向上移动。 您可以使用 DOWN
键反向移动。 这是相当标准的。
如果我们希望返回到我们的提示,我们只需按下退出键。
我们也可以输入上一个命令的一部分,然后 then 按 UP
键来搜索该特定命令的最新实例。
此外,我们可以使用 ALT-UP
和 ALT-DOWN
命令仅调用命令行参数。
例如,假设我们列出了一个目录的内容:
ls /etc
acpi/ groff/ ltrace.conf rmt* adduser.conf group magic rpc alternatives/ group- magic.mime rsyslog.conf apm/ grub.d/ mailcap rsyslog.d/ apparmor/ gshadow mailcap.order screenrc . . .
我们意识到这是我们正在寻找的目录,我们现在想切换到它。 我们可以从输入新命令开始:
cd # Don't press return yet
现在,我们可以通过点击 ALT-UP
键来插入最后一个命令的参数:
cd # Hit Alt-UP and get... cd /etc
这是一个非常简单的示例,但您可以看到这可能非常有用,特别是因为您可以滚动浏览以前的命令参数。
fish
提供的另一种历史记录是目录历史记录。 这是一个很棒的功能,可以让您基本上通过 cd
历史记录返回到以前的目录。
您可以通过键入以下内容查看您的目录历史记录:
dirh
在空命令提示符下按 ALT-LEFT
和 ALT-RIGHT
可以在目录历史记录中前后移动。 这将允许您轻松地在目录之间循环。
创建配置文件并更改默认 Shell
如果您发现自己喜欢 fish
shell,您可能希望包含一些自定义项来塑造您的环境。
虽然您可能习惯于在 ~/.bashrc
或 ~/.bash_profile
文件中进行自定义,但这些不适用于此 shell。
要配置您的首选项,您应该在 ~/.config/fish/config.fish
创建一个文件。 所有 fish
配置文件必须以 .fish
结尾。 通常,第一次使用 shell 时会创建 ~/.config/fish/
路径。
如果您想从一个示例文件开始,您可以从 fish
包目录中复制它:
cp /usr/share/fish/config.fish ~/.config/fish
然后,您可以像编辑任何其他文件一样对其进行编辑:
nano ~/.config/fish/config.fish
当您熟悉该文件时,您可能应该删除您没有亲自定制的任何内容。
最好不要将函数直接添加到这个配置文件中。 相反,您应该在 fish
配置目录中创建一个名为 functions
的目录:
mkdir ~/.config/fish/functions
在此目录中,为您希望创建的每个函数创建文件。 只要每个文件以 .fish
结尾,shell 就会找到它们并将它们合并到它的环境中。 每个函数都必须在自己的文件中,没有别的。
例如,我们可以创建一个文件来使我们的 hello_sir
函数在我们的用户的每个会话中都可用,我们可以输入这个(在继续之前,请记住取消设置我们之前使用 [ X207X] 如果你还没有这样做):
cat > ~/.config/fish/functions/hello_sir.fish function hello_sir echo hello Mr. $argv[2] end
输入end
后,点击CTRL-D
结束输入。 现在每次加载 shell 时都可以使用它。 如果我们还想添加我们的 say_hello
函数,我们需要一个单独的文件。
如果需要一些灵感,可以看看默认的 fish
函数:
cd /usr/share/fish/functions ls
根据自己的喜好配置 shell 后,您可能希望使用 fish
作为默认 shell。 为此,您可以使用 chsh
命令。
首先,我们需要知道 fish
shell 的路径:
which fish
/usr/bin/fish
接下来,我们可以通过键入以下内容来更改我们的 shell:
chsh -s /usr/bin/fish
系统将要求您输入密码以确认。 完成后,每次登录时,都会出现fish
提示。
如果你想换回你的另一个 shell,你可以用同样的方式通过路径指定它:
chsh -s /bin/bash
结论
至此,您应该对使用 fish
shell 的基础知识比较熟悉。 对于许多人来说,这是一个很好的中间立场,因为它在有意义的地方坚持约定,但在以前的 shell 留下改进空间的地方增加了功能。
肯定还有更多的东西要学,但你应该为进一步的探索打下良好的基础。 请记住使用通过 help
命令提供的出色帮助系统。