在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
英语是一种令人困惑的语言。例如,请考虑 moon 和 good 这两个单词。对外行人而言,这两个单词似乎应该是押韵的,但是前者的读音是 /mun/(根据 International Pronunciation Alphabet),而后者的读音是 /good/。似乎英语中的惟一规则就是例外。 复制代码 代码如下:bash-1) # Demonstrate the differences between single-, double-, and back quotes bash-2) var=ls bash-3) echo '$var' $var bash-4) echo "$var" ls bash-5) echo `$var` Rakefile app bin components config db doc lib log patches public script src test tmp vendor 在上面的命令序列中,把变量 var 设置为两字母的字符串 ls。在第一个 echo 命令中,单引号禁止解释此变量,因此会按原样显示引号中的文本,即四字母的字符串 $var。在第 4 行代码中,双引号会解释此变量,所以结果是字符串 ls。最后,反撇号解释变量并作为子 shell 运行中间结果。因此,`$var` 产生中间字符串 ls,它作为 shell 命令运行,生成当前目录的内容列表。 当然,这三种操作符(单引号、双引号和反撇号)都有合法的用途,但是与英语中的例外一样,记住和掌握这些细微差异很令人头疼。为了进一步证明这一点,请问:$var 和 "$var" 之间有什么差异?(提示:假设 $var 包含空格。) 复制代码 代码如下:bash-1) # Create three files and try to remove two bash-2) touch three two one bash-3) var="one two" bash-4) rm "$var" rm: one two: No such file or directory bash-5) rm $var bash-6) ls three 如果一个变量包含空格,双引号会按原样把变量展开为一个 参数。否则,变量中的任何空格都被解释为参数分隔符。 shell 语法很令人头疼。这很糟糕,因为它使 CLI(UNIX 最强大的特性之一)更难掌握。上面这样的不一致问题甚至会给 UNIX 老手带来困扰。 好在,fish (Friendly Interactive Shell) 的出现改变了这种混乱局面,它提供简明的语法,显著改善了用户体验。与其他 shell 一样,fish 也提供重定向、快捷方式、globbing(即通配符的展开)、子 shell、制表符补全和变量。但是,与其他 shell 不同,fish 还提供颜色编码的 CLI、功能丰富的命令行编辑器和大量文档。 另外,对于执行任何操作,fish 只提供一种方式,这非常明智。如果一个 UNIX 实用程序能够完成某一任务,fish 就不会通过内置命令重复提供此特性。例如,fish 使用系统范围的应用程序 /bin/kill 终止进程。(与之相反,Bourne shell 通过一个内置应用程序实现了它自己的 kill 版本。可以在 Bourne shell 命令提示上输入 /bin/kill 来访问此版本)。fish 尽可能优先考虑简单性而不是灵活性,这显著简化了它的使用方法。 下面,我们来安装 fish 并体验它的一些特性。
复制代码 代码如下:bash-1) wget http://www.fishshell.org/files/1.23.0/fish-1.23.0.tar.gz bash-2) tar xzvf fish-1.23.0.tar.gz bash-3) cd fish-1.23.0 bash-4) ./configure --without-xsel checking if autoconf needs to be run... no checking if autoheader needs to be run... no checking for /usr/pkg/include include directory... no ... bash-5) make gcc -c -o function.o function.c ... bash-6) sudo make install ... To use fish as your login shell: * add the line '/usr/bin/fish' to the file '/etc/shells'. * use the command 'chsh -s /usr/bin/fish'. 如果使用 UNIX 类系统,configure 可能不需要更多的标志。但是,为了尽可能减少依赖性并让 fish 采用与常用 shell 相同的目录结构,可以分别添加 --without-xsel 和 --prefix=/usr。(如果使用 Mac OS X version 10.4 Leopard,那么还要添加参数 LDFLAGS=-liconv。如果在 Mac OS X 上省略后一个选项,那么无法编译附带的 fish 实用程序) 。 另外,如果使用流行的 UNIX 版本,很可能会找到预先构建好的二进制版本,可以把它直接安装在您的系统上。例如,如果使用 Debian Linux,那么可以用 sudo apt-get install fish 命令直接安装 fish。请访问 fish 项目的主页,了解是否有针对您的系统的二进制版本。 入门 在命令 3 中,rm 产生的错误消息被重定向到 errors 文件中。命令 4 显示此文件的内容。fish shell 为重定向提供各种支持,比如把描述符组合成一个流和结束描述符。 通过创建 fish 函数创建别名(即快捷方式)。 fish 提供 --query 选项来检查是否定义了一个变量。如果已经设置了此变量,set --query 返回状态码 0,这表示没有出现错误;否则,返回 1。语句 6 用 or 操作符连接两个命令:第二个命令(echo)只在第一个命令失败的情况下执行。 如果最外边的引号是双引号,那么展开所有变量。 对于新手非常有帮助的一个特性 注意 CLI 中的红色文本。如果 fish 不认识一个命令名,就用红色显示它。按 Tab,就会显示以目前输入的字母开头的所有应用程序名(以及简短的描述)。在空提示行上按 Tab,就会看到 PATH 中的所有应用程序。 此时,fish 会显示可用的选项。shell 维护许多常用命令和选项的索引,您很可能能够得到所需的帮助。但是,定制的或更复杂的实用程序可能缺少这种数据。可以阅读 fish 文档,了解关于编写自己的补全特性的更多信息。 如果您不知道一个命令处理的操作数类型,fish 在许多情况下可以提供帮助,但并不是在所有情况下都可以。例如,如果输入 set(或 vared,即 fish 变量编辑器)和一个空格,然后按 Tab,fish 会显示可用变量的列表。set 的操作数是一个变量。同样,如果输入 type 和一个空格,然后按 Tab,fish 会显示内置函数的列表,这些函数扩展文件系统上可用的实用程序。 cd 函数是一个 fish 函数,它的操作数是一个现有的目录。在输入 cd 之后按 Tab,fish 会显示 CDPATH 中的每个目录包含的所有现有目录。 复制代码 代码如下:fish-1) ssh login.example.com (Hostname) host1.example.com (Hostname) fish shell 还会补全文件名和目录名。同样,它会在您输入路径名时突出显示正确的元素。 fish 与其他 shell 之间的一个重要差异是,它不提供历史快捷方式,比如 !、!! 和 !$。 使用 fish 作为登录 shell 复制代码 代码如下:bash-1) type fish fish is /usr/bin/fish bash-2) sudo vi /etc/shells Add the line /usr/bin/fish to the file if it's missing, and save the file bash-3) cat /etc/shells /bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh /usr/bin/fish bash-4) chsh -s /usr/bin/fish Changing shell for strike Password: ******** bash-5) login strike Password: ******** Last login: Wed Oct 8 15:02:21 on ttys000 Welcome to fish, the friendly interactive shell Type help for instructions on how to use fish fish-1) echo $SHELL /usr/bin/fish 结束语 |
请发表评论