介绍
Linux和类Unix操作系统很幸运,几乎可以替代它们的操作环境的每一个组件。服务器用户最常与之交互的组件之一是命令行shell。 虽然与大多数系统船舶bash
shell,它的全称是“伯恩再次壳”原始的创造者后
sh
外壳,这是它的前身,也有很多用户会从检查出有利于其他选项。 你可能听说过流行的
zsh
,你可以
了解这里 。 另一种全功能的外壳,这将是本指南的主题,是
fish
外壳。 该
fish
的外壳是一个现代化的,有吸引力和强大的命令行shell,可以延长平时的能力
bash
外壳。在本指南中,我们将学习如何安装,配置和使用此shell。 我们将在Ubuntu 12.04 VPS实例上使用这些,但你应该有一个容易的时间适应您的选择的分布。
如何安Fish Shell
幸运的是,Ubuntu默认12.04存储库包含fish
二进制软件包。 我们可以通过更新我们的本地包索引并将包拉到我们的系统中以常规方式安装:
sudo apt-get update
sudo apt-get install fish
这就是我们需要做的,以获得新的shell到我们的系统。 要开始打转转,我们将开始一个新的
fish
从我们当前会话中的shell。 我们将如何,如果你决定改变默认的shell后面讨论
fish
是为你:
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
贝强调目录路径,使其更容易一目了然解释:
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
智能
只列出了目录
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
终端的Web浏览器。你可以按照任何链接,就像你在一个普通的浏览器,并可以通过输入“q”退出。如果你想看到Fish Shell知道的特定命令的帮助,只是使用它作为参数:
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
年会已经习惯了这些炮弹做事的方式。 虽然
fish
没有太多上这些贝壳的遗产携带,它会修改行为在那里可以提供改进。
重定向,管道和通配符
一个简单的例子是重定向。普通重定向和管道的工作方式相同与bash
:
- |:命令的管道输出的左到命令的右边的输入
- <:从文件上,而不是在键盘的右注意到标准输入
- >:写入标准输出到文件上,而不是在屏幕的右
- ^:重定向标准错误到正确的位置。
- 0:标准输入。默认情况下,您的命令的输入是键盘。
- 1:标准输出。默认情况下,您的命令的输出是屏幕。
- 2:标准错误。默认情况下,您的命令的错误会打印到屏幕上。
ls /etc >ls_results.txt ^&1
所有的标准输出的放入
ls_results.txt
文件,然后将标准误差被设置为标准的输出被定向的位置(上面的文件)。 至于通配符,
fish
再次使用大部分的默认值从
bash
。包括:
- *:匹配任何字符串,不包含“/”。
- ?:此匹配任何单个字符,不包括“/”。
- **:匹配包括“/”的字符串。
ls
有一个递归选项,我们可以做到这一点
fish
。 我们可以发现,在结尾的所有文件
.conf
在我们
/etc
通过键入目录:
ls /etc/**.conf
/etc/adduser.conf
/etc/apparmor/subdomain.conf
. . .
在我的机器上,前两行输出显示这在行动。一个文件位于我们正在搜索的顶级目录中,下一个位于子目录中。
创建函数和别名
我们可以创建函数和别名fish
与一个易于使用的语法。 基本格式如下:
function function_name function_content end如果你想你的函数中的参数解析,你有他们的所有可用内捆绑在一起
$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
您可以通过键入以下内容删除您的某个功能:
functions -e function_name对于别名,在
bash
外壳有一个特殊的命令。 在
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
键。这是相当标准。 如果我们希望返回到我们的提示符,我们只需点击转义键。 我们还可以输入一个以前的命令的一部分,
然后按
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
贝,你可能要包括一些自定义来塑造您的环境。 虽然你可能被用来将在自定义你
~/.bashrc
或
~/.bash_profile
的文件,这些不用于这个shell。 要配置你的喜好,你应该建立在文件
~/.config/fish/config.fish
。 所有
fish
的配置文件必须以结束
.fish
。 通常情况下,在
~/.config/fish/
当你使用shell首次路径将被创建。 如果你想开始一个例子文件,你可以从它复制
fish
包目录:
cp /usr/share/fish/config.fish ~/.config/fish
您可以像任何其他文件一样编辑它:
nano ~/.config/fish/config.fish
当你熟悉文件,你应该可能删除你没有自己定制的任何东西。 最好不要将函数直接添加到此配置文件中。相反,你应该创建一个目录中称为
functions
的内
fish
配置目录:
mkdir ~/.config/fish/functions
在此目录中,为您要创建的每个功能创建文件。只要每个文件结尾
.fish
,外壳会发现它们,并将它们纳入其环境。每个函数必须在其自己的文件中,没有别的。 例如,我们可以创建一个文件,以使我们的
hello_sir
为我们的用户每个会话提供的功能,我们可以输入这个(继续之前,别忘了去掉的
cat
前面制成的别名
set -e cat
,如果你还没有这样做已经):
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
你已经得到了你的后壳配置根据自己的喜好,你不妨用
fish
作为默认的shell。 要做到这一点,您可以使用
chsh
命令。 首先,我们需要知道的路径,
fish
贝:
which fish
/usr/bin/fish
接下来,我们可以通过键入:
chsh -s /usr/bin/fish
系统将要求您输入密码以确认。一旦完成,每次你登录时,你将得到一个
fish
提示。 如果要更改回到其他shell,您可以通过路径以相同的方式指定:
chsh -s /bin/bash
结论
现在,你应该是比较熟悉使用的基本fish
外壳。它是许多人的良好的中间地带,因为它坚持约会,这是有道理的,但增加了功能,以前的shell留下了改进的空间。 有更多的东西要学习,但你应该有一个良好的基础进一步探索。请记住,利用优秀的帮助系统,可通过
help
命令。
作者:Justin Ellingwood