介绍
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-UP
和ALT-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-LEFT
和ALT-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
结论
到目前为止,你应该相对熟悉使用鱼
壳的基本知识,这对许多人来说是一个很好的中间场,因为它在有意义的地方坚持惯例,但在以前的壳留下了改进的空间时增加了功能。
肯定有更多的东西要学习,但你应该有一个很好的基础进一步探索. 记住使用通过帮助
命令可用的优秀的帮助系统。