如何在 Ubuntu VPS 上安装和使用 Fish Shell

介绍

Linux 和 Unix 类似的操作系统很幸运能够为其操作环境的几乎每一个组件提供一些替代方案,其中服务器用户与最多的组件之一是命令行壳。

虽然大多数系统都配备了bash壳,这代表了原来的sh壳的创造者之后的Bourne再次壳,但还有其他选项,许多用户会从中受益。

另一个功能齐全的壳,这将是本指南的主题,是壳. 壳是一个现代,有吸引力和强大的命令壳,可以扩展通常的bash壳的能力。

我们将在Ubuntu 12.04 VPS实例上使用这些,但您应该能够轻松地将其适应您选择的发行版。

如何安装鱼壳

幸运的是,对于我们来说,默认的Ubuntu 12.04存储库包含二进制包。

我们可以通过更新本地包索引并将包拉到我们的系统上以常规的方式安装它:

1sudo apt-get update
2sudo apt-get install fish

这就是我们需要做的,让新壳进入我们的系统。

要开始玩,我们将从我们当前的会话中开始一个新的壳,我们将稍后讨论如何改变默认壳,如果您决定是适合您的:

1fish

1demouser@host ~>

你可以看到你的提示变了,而不是一个$作为一个正常用户的提示,你会看到一个>字符。

熟悉一些表面的特征

立刻,我们可以开始看到这种壳的一些优势,只是通过在壳中进行我们的正常操作,这些主要是通过包含的功能完成的,我们将稍后研究。

例如,如果列出目录的内容,您会注意到它们会自动附加到末尾的字符中,表示文件类型:

1ls

1bin/   etc/         lib/         media/  proc/  sbin/     sys/  var/
2boot/  home/        lib64/       mnt/    root/  selinux/  tmp/  vmlinuz@
3dev/   initrd.img@  lost+found/  opt/    run/   srv/      usr/

这是与ls -F相同的输出,该输出将内容按类型分类。

如果你在文件路径中键入,无论是相对的还是绝对的,你会看到壳强调目录路径,以便轻松解读:

cd /home/demo

如果您的终端具有显示彩色输出的能力,您会注意到您的提示程序也会自动彩色。此外,它还具有动态颜色。

这将是红色的:

1ech

然而,当你添加最后的o,将其变成一个命令时,你会看到它立即变成绿色。

使用 TAB 完成更容易的时间

您还可能会注意到TAB的完成非常出色:

1cd /    ## Hit the TAB key at this point

1/bin/    (Directory)  /media/    (Directory)  /srv/  (Directory)
2/boot/   (Directory)  /mnt/      (Directory)  /sys/  (Directory)
3/dev/    (Directory)  /opt/      (Directory)  /tmp/  (Directory)
4/etc/    (Directory)  /proc/     (Directory)  /usr/  (Directory)
5/home/   (Directory)  /run/      (Directory)  /var/  (Directory)
6/lib/    (Directory)  /sbin/     (Directory)  
7/lib64/  (Directory)  /selinux/  (Directory)

正如你所看到的,智能地列出CD命令的目录,因为这些是唯一有意义的值。

如果我们使用一个更通用的命令,我们会看到所有列表(以及它们的类型):

1touch /     ## Hit the TAB key at this point

 1/bin/                  (Directory)  /proc/               (Directory)
 2/boot/                 (Directory)  /root/               (Directory)
 3/dev/                  (Directory)  /run/                (Directory)
 4/etc/                  (Directory)  /sbin/               (Directory)
 5/home/                 (Directory)  /selinux/            (Directory)
 6/initrd.img  (Symbolic link, 15MB)  /srv/                (Directory)
 7/lib/                  (Directory)  /sys/                (Directory)
 8/lib64/                (Directory)  /tmp/                (Directory)
 9/lost+found/           (Directory)  /usr/                (Directory)
10/media/                (Directory)  /var/                (Directory)
11/mnt/                  (Directory)  /vmlinuz  (Symbolic link, 5.2MB)
12/opt/                  (Directory)

一个有用的类似功能是命令的格式化,如果我们想要看到所有人页面,我们可以使用完成选项卡:

1man fish    ## Hit the TAB key at this point

1fish       (1: the friendly interactive shell)
2fish_indent       (1: indenter and prettifier)
3fish_pager  (1: internal command used by fish)
4fishd           (1: universal variable daemon)

在类似的情况下,您可以使用任何使用内置帮助系统的终端 Web 浏览器获得完整的帮助:

1help

 1fish home | Main documentation page | Design document | Commands | FAQ |
 2License
 3
 4Fish user documentation
 5
 6                                    1
 7
 8Table of contents
 9
10  • Fish user documentation
11      □ Table of contents
12      □ Introduction
13      □ Syntax overview
14      □ Help
15      □ Tab completion

在我的机器上,这打开了w3m终端网页浏览器的帮助系统. 你可以跟随任何链接,就像你在正常的浏览器中一样,并且可以通过键入q而停止。

1help cd

 1cd - change directory
 2
 3Synopsis
 4
 5cd [DIRECTORY]
 6
 7Description Changes the current
 8
 9directory. If DIRECTORY is supplied it will become the new directory. If
10DIRECTORY is a relative path, the paths found in the CDPATH environment
11variable array will be tried as prefixes for the specified path. If
12CDPATH is not set, it is assumed to be '.'. If DIRECTORY is not
13specified, $HOME will be the new directory.
14
15Back to index.

再次,您可以通过使用 TAB 完成来查看哪些帮助命令可用:

1help    ## Type a space to let fish know you are finished with the command, and then hit the TAB key at this point

1alias                                   (Help for the specified command)
2and                                     (Help for the specified command)
3begin                                   (Help for the specified command)
4bg                                      (Help for the specified command)
5bind                                    (Help for the specified command)
6block                                   (Help for the specified command)
7break                                   (Help for the specified command)
8breakpoint                              (Help for the specified command)
9. . .

做一些常见任务的不同方式

多年来一直使用bash甚至sh的人都已经习惯了这些壳做事的方式,而确实携带了这些壳的遗产,但它改变了行为,可以提供改进。

重定向,管道和野生卡片

一个简单的例子是与重定向. 正常的重定向和管道工作与bash:

  • ****:向左输出指令,向右输入指令
  • < :从右侧的文件输入标准,而不是键盘
  • > :向右侧的文件输入标准,而不是屏幕

然而,一个区别是你重定向标准错误的方式. 你用卡拉特字符做到这一点:

  • ^ :重定向标准错误到右侧的位置。

这提供了一个简单的方法来重定向一个文件描述器到另一个. 请记住,每个文件描述器通常与一个数字相关联:

  • 0 :标准输入.您的命令的输入是默认的键盘。
  • 1 :标准输出.您的命令的输出是默认的屏幕。
  • 2 :默认的错误。

我们可以将一个文件描述器重定向到另一个,使用&字符,然后是描述器号。

例如,我们可以将命令的标准输出重定向到一个文件,然后将其标准错误指向我们的标准输出文件,通过键入这样的东西:

1ls /etc >ls_results.txt ^&1

所有标准输出都放入ls_results.txt文件中,然后将标准错误设置为标准输出被指向的位置(上面的文件)。

至于野卡,再次使用了bash中的大多数默认字符,其中包括:

  • ***** :匹配不包含/的任何字符串。
  • ? :此匹配不包括/的任何单个字符。

一个非常有用的额外的野卡是复发性野卡:

  • ***** *:匹配包括/在内的任何字符串

虽然ls有一个重复的选项,但我们可以用fish来做到这一点。我们可以通过键入我们的/etc目录中找到在.conf结束的所有文件:

1ls /etc/**.conf

1/etc/adduser.conf
2/etc/apparmor/subdomain.conf
3. . .

在我的机器上,第一两个输出行在动作中显示了这一点. 一个文件是在我们正在搜索的顶部目录中,另一个是在子目录中。

创建函数和名称

我们可以用易于使用的语法在中创建函数和副名词。

基本格式是这样的东西:

function function_name
    function_content
end

如果您希望在函数中解析参数,则可以将其全部组合到$argv变量中,它们被存储为数组。

例如,我们可以创建一个像这样的函数,它会打印出我们所有的论点:

1function say_hello
2    echo hello $argv
3end

我们可以称之为一个或多个论点,并将它们全部传递到响应命令:

1say_hello John Doe

1hello John Doe

如果我们想要访问一个特定的变量,请将其从参数数列中拉出来(在中,数组开始于1,而不是0)。

1function hello_sir
2    echo hello Mr. $argv[2]
3end

然后我们可以调用这个函数,我们会得到不同的结果:

1hello_sir John Doe

1hello Mr. Doe

我们可以通过键入查看所有定义的函数:

1functions -a

您可以通过键入删除其中一个函数:

functions -e function_name

对于字母,bash壳具有特定的命令,在fish中,它使用相同的函数语法。

唯一要注意的是,如果命令取代或取代它所引用的命令,则必须添加命令内置,以告知壳不会反复调用函数,而是使用外部命令。

例如,如果我们希望cat命令默认包含编号,我们可能希望重新定义命令以包括该旗帜。

1function cat
2    command cat -n $argv
3end

现在,当我们调用,输出将自动编号:

1cat /etc/hosts

11	127.0.0.1	localhost fish fish
2     2	
3     3	# The following lines are desirable for IPv6 capable hosts
4     4	::1 ip6-localhost ip6-loopback
5     5	fe00::0 ip6-localnet
6     6	ff00::0 ip6-mcastprefix
7     7	ff02::1 ip6-allnodes
8     8	ff02::2 ip6-allrouters

如果您正在使用一个函数来取消命令的默认值,您还可以使用命令内置来绕过您所做的任何更改并获取原始命令。

1command cat /etc/hosts

1127.0.0.1	localhost fish fish
2
3# The following lines are desirable for IPv6 capable hosts
4::1 ip6-localhost ip6-loopback
5fe00::0 ip6-localnet
6ff00::0 ip6-mcastprefix
7ff02::1 ip6-allnodes
8ff02::2 ip6-allrouters

简化历史

虽然bash提供了非常复杂但有用的历史函数,但fish将这些函数对齐下来,并致力于改进基本知识,以解决使用问题。

您可以通过使用UP键在历史上按时移动,您可以通过使用DOWN键向反方向移动,这是相当标准的。

如果我们想回到我们的快递,我们只是敲出逃跑钥匙。

我们还可以键入以前命令的一部分,然后按UP键搜索该特定命令的最新实例。

此外,我们可以使用ALT-UPALT-DOWN命令仅回忆命令行参数。

例如,假设我们列出了一个目录的内容:

1ls /etc

1acpi/                   groff/               ltrace.conf rmt*
2adduser.conf group magic rpc
3alternatives/           group-               magic.mime rsyslog.conf
4apm/                    grub.d/              mailcap rsyslog.d/
5apparmor/               gshadow mailcap.order screenrc
6. . .

我们意识到这是我们正在寻找的目录,我们现在想切换到它,我们可以通过输入新的命令开始:

1cd      # Don't press return yet

现在,我们可以通过按ALT-UP键插入最后命令中的参数:

1cd      # Hit Alt-UP and get...
2
3cd /etc

这是一个非常简单的例子,但你可以看到这可能非常有用,特别是因为你可以滚动以前的命令参数。

提供的另一种历史是目录历史,这是一个很棒的功能,允许你基本上通过你的CD历史回到以前的目录。

您可以通过键入查看您的目录历史:

1dirh

您可以通过在空命令提示时按ALT-LEFTALT-RIGHT在目录历史中向后移动,这将允许您轻松在目录之间循环。

创建配置文件并更改默认壳

如果你发现你喜欢壳,你可能想包括一些定制来塑造你的环境。

虽然您可能习惯于在您的 ~/.bashrc~/.bash_profile 文件中设置定制,但这些不用于此壳。

要配置您的偏好,您应该在~/.config/fish/config.fish创建一个文件。所有fish配置文件必须在.fish结束。

如果你想从一个示例文件开始,你可以从包目录中复制它:

1cp /usr/share/fish/config.fish ~/.config/fish

然后你可以像任何其他文件一样编辑它:

1nano ~/.config/fish/config.fish

当你熟悉的文件,你可能应该删除任何你没有自定义的。

最好不要直接将函数添加到此配置文件中,而应在配置目录中创建一个名为函数的目录:

1mkdir ~/.config/fish/functions

在此目录中,为您想要执行的每个函数创建文件,只要每个文件都以.fish结束,壳将找到它们并将它们纳入其环境中。

例如,我们可以创建一个文件,使我们的hello_sir功能在每个会话中为我们的用户提供,我们可以输入这个(在继续之前,请记住,如果您还没有这样做,请卸载我们之前用set -e cat创建的cat名称):

1cat > ~/.config/fish/functions/hello_sir.fish
2function hello_sir
3    echo hello Mr. $argv[2]
4end

在输入后键入终止,点击CTRL-D以结束输入. 此功能现在每次加载壳时都可用。 如果我们还想添加我们的say_hello功能,我们需要一个单独的文件。

如果你需要一些灵感,你可以看看默认的函数:

1cd /usr/share/fish/functions
2ls

您已将壳配置为您喜欢后,您可能希望使用fish作为默认壳。

首先,我们需要知道到壳的路径:

1which fish

1/usr/bin/fish

接下来,我们可以通过键入更改我们的壳:

1chsh -s /usr/bin/fish

您将被要求确认您的密码,一旦完成,每次您登录,您将收到一个提示。

如果您想返回另一个壳,您可以以相同的方式按路径指定它:

1chsh -s /bin/bash

结论

到目前为止,你应该相对熟悉使用壳的基本知识,这对许多人来说是一个很好的中间场,因为它在有意义的地方坚持惯例,但在以前的壳留下了改进的空间时增加了功能。

肯定有更多的东西要学习,但你应该有一个很好的基础进一步探索. 记住使用通过帮助命令可用的优秀的帮助系统。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus