非常适合UNIX新手和专家的 Friendly Interactive Shell

    技术2024-05-27  112

    英语是一种令人困惑的语言。 例如,考虑单词Moon and good 。 对于初学者来说,这些单词应该押韵,但是前者的发音为/ mun / (根据国际发音字母),而后者的发音为/ good /。 看来,英语中唯一的规则是例外。

    UNIX shell同样令人困惑。 例如,在Bourne shell的(也是最常见的UNIX shell),短语'$var' , "$var"和`$var`外观相似,但产生截然不同的结果。 (本文提供的shell示例中的每个CLI均以活动shell的名称和命令号开头。)

    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最强大的功能之一)更加难以学习。 确实,上述不一致之处也使老兵变得僵硬。

    值得庆幸的是, fish友好的交互式外壳)在上游陷入了混乱的浪潮,提供简化的语法和大大改善的用户体验。 像其他外壳程序一样, fish提供了重定向,快捷方式,通配符(即通配符的扩展),子外壳程序,制表符补全和变量。 与替代方案不同, fish还提供了颜色编码的CLI,广泛的命令行编辑器和丰富的文档。

    另外(聪明地), fish只提供一种做任何事情的方式。 如果UNIX实用程序完成特定任务,则fish不会将其功能作为内置命令来重复。 例如, fish使用系统范围的应用程序/ bin / kill终止进程。 (通过比较,Bourne shell将其版本的kill作为内置应用程序实现。您可以在Bourne shell提示符下键入/bin/kill来使用该应用程序。) fish尽可能地选择简单性而不是灵活性,因此使用起来更加可预测。

    在这里,让我们安装fish ,将其卷入,然后尝试其中的许多功能。

    抓鱼

    Fish是Axel Liljencrantz创建的一个开源项目,并根据GNU通用公共许可证版本2进行许可。截至撰写本文时, fish的最新版本是2008年1月13日发布的1.23.0。

    如果使用UNIX或类似UNIX的系统(例如Linux®或Mac OS X),则fish应该在系统上轻松,轻松地从源代码构建。 这是步骤,如清单1所示:

    下载该程序的最新源tarball。打开包装。转到源目录。配置构建。运行make 。

    清单1.从源头构建鱼

    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版本10.4 Leopard,则还添加参数LDFLAGS=-liconv 。如果在Mac OS X上省略了后者,则附带的fish实用程序将无法构建。)

    可选地,如果您使用流行的UNIX变体,则可能会发现可以在发行版上安装的预构建二进制文件。 例如,如果你使用Debian Linux,你可以安装fish在瞬间用命令sudo apt-get install fish 。 检查fish项目主页以了解系统的可用性。

    学校在

    在深入探讨更复杂的主题之前,让我们看一下fish常见的shell任务如何完成:

    要重定向标准输入和标准输出,请分别使用运算符<和> 。 要重定向标准错误,请使用克拉( ^ ), 如图1所示。 要将标准错误附加到文件,请使用^^ 。

    图1.使用插入号运算符重定向标准错误

    在命令3中,由rm产生的错误消息被捕获在名为errors的文件中。 命令4显示文件的内容。 该fish外壳具有重定向丰富的支持,如描述符组合成一个流和关闭描述符。

    顺便说一下,显示的带颜色和下划线的文字不是社论。 键入时,shell会在CLI中突出显示文本。 在行中,绿色表示命令名称有效; 无效的命令名称显示为红色。 下划线表示该命名文件存在。 (下面的部分更详细地介绍了shell反馈。)

    要运行子shell,请使用括号( () ), 如图2所示。 括号内的文本被解释为命令列表,并被结果替换。

    图2.使用括号来运行一个子shell

    要创建别名或快捷方式,请创建fish函数。

    一个函数可以包含一个或多个命令,特殊变量$argv自动扩展到在原始命令行上传递的参数列表。

    您可以使用命令functions列出所有定义的functions 。 要删除功能,请使用functions --erase name ,如functions --erase ll 。

    您还可以立即保存在命令行上编写的任何函数。 代码完成后,键入funcsave name ,例如funcsave ll 。 该功能可立即用于所有当前正在运行的Shell和将来的所有Shell。 命令funced name交互方式编辑现有功能。 funced命令具有完整的语法突出显示,制表符funced全和自动缩进功能。 funcsave和funced使自定义外壳变得容易。

    要设置变量,请输入set variable name value 。 与内置functions ,键入set --erase variable name以“取消”或擦除变量。 要检索存储在变量中的值,请键入美元符号( $ ),然后键入变量的名称, 如图3所示。

    图3.测试变量是否存在

    聪明的是, fish提供了--query选项来测试是否定义了变量。 如果设置了变量,则set --query返回状态码0,表示未发生任何错误; 否则,它返回1。语句6使用or运算符链接两个命令:第二个命令( echo )仅在第一个命令失败时执行。

    那么, fish如何处理可怕的$var , '$var' , "$var"和`$var` ? 从形式上讲,它遵循一些简单的规则:

    如果变量包含空格,则始终保留空格,并且变量始终求值为单个参数(参见图4) 。

    图4. Fish使字符串保持完整的嵌入空格

    如果双引号是最外面的引号,则会扩展所有变量。如果单引号是最外面的引号,则不会扩展任何变量。

    让我们看看这些规则在实践中如何工作。

    命令1创建四个文件,最后一个文件的名称中带有空格。 命令3和4删除以变量file命名的file 。 命令6和7删除twofiles变量中命名的两个文件。 仔细查看命令6:由于该值未放在引号(单引号或双引号)中,因此空白不受保护。 因此,命令7将变量扩展为两个参数,并删除两个文件。 命令9和10重申了命令6和7中的方案。

    命令11和12演示了空白规则。 尽管变量是由双引号中的命令12不包围, fish保持在命令11 很不错的空白集。

    命令14至16展示了fish的嵌套引用规则。 现在,再次浏览命令11、15和16。shell使用颜色代码来显示平衡的引号并增强正确的语法。 同样,请查看命令9和11。后一个命令在文件名下划线,表示该文件存在。 命令9中缺少下划线的一个大暗示是您做错了什么。

    友好是fish的名字。

    陆地润滑脂的一大特色

    谈到友好的功能, fish的制表符完成功能是UNIX新用户和专家发现非常有用的另一种新颖性。 要查看实际完成情况,请在下面的示例中输入。 单击每行末尾的Tab键。

    如果不确定命令名称,可以在输入几个字母后单击Tab ,以查看可能的完成列表, 如图5所示。 (系统上的完成列表可能与此处显示的列表不同。该列表取决于PATH环境变量和UNIX系统的内容。)

    图5.单击Tab以完成命令名称

    注意CLI中的红色文本。 如果fish无法识别命令名称,则会以红色显示。 单击“ 选项卡”将显示所有应用程序名称以及简短说明,这些名称以您到目前为止输入的内容开头。 您也可以在空提示下单击“ 选项卡”以查看PATH中的所有应用程序。

    如果您想知道命令可用的选项,请在连字符( - )或双连字符( -- )后面单击Tab , 如图6所示。

    图6.您还可以单击Tab来完成一个选项

    在这里, fish告诉您哪些选项可用。 Shell维护着大量常用命令和选项的索引,很可能您可以获得所需的帮助。 但是,自定义或更深奥的实用程序可能缺少此类数据。 您可以阅读fish文档以了解有关编写自己的修整的更多信息。

    您还可以在键入几个字母后单击Tab , 如图7所示。 外壳会显示所有可能的匹配项。

    图7.您也可以键入选项的一部分

    如果您不知道命令将操作哪种操作数,则fish可以提供帮助-在许多情况下,但不是全部。 例如,如果键入set (或vared , fish变量编辑器),一个空格,然后按Tab,则fish将显示可用变量列表。 set的操作数是一个参数。 同样,如果键入type ,一个空格,然后单击Tab ,则fish显示一个内建函数列表,这些函数扩展了文件系统上可以使用的实用程序。

    通常, fish附带的所有内置函数都具有上下文相关的操作数完成。 例如,尝试使用cd , 如图8所示。

    图8.许多命令是上下文敏感的,并提供合适的参数

    cd函数是fish函数,并且知道其操作数是现有目录。 在键入cd后单击Tab时 , fish将显示CDPATH中每个目录中包含的所有现有目录。

    另一个智能补全与ssh相关联。 键入ssh后跟一个空格,然后单击Tab以查看从您的Secure Shell已知主机文件中获取的已知主机名列表(通常在〜/ .ssh / known_hosts中找到):

    fish-1) ssh login.example.com (Hostname) host1.example.com (Hostname)

    该fish外壳也完成了文件名和目录名。 同样,当您键入路径名时,它会突出显示正确的元素。

    fish和其他贝壳之间的一个显着区别是缺少历史速记,例如! !! 和!$ 。

    投更多的鱼

    如果您喜欢fish并希望将其用作登录shell,则将fish的路径添加到shell的正式列表/ etc / shells中,然后运行chsh :

    bash-1) type fish fish is /usr/bin/fish bash-2) sudo vi /etc/shells 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

    结论

    在fish有很多值得发现和喜欢的东西。 我敢说吗? “ fish有很多C 。”

    您可以在语法突出显示中调整颜色。 您可以通过编辑〜/ .config / fish / config.fish来自定义启动。 您可以使用通用变量和fishd在外壳实例之间共享变量。 该外壳程序还具有出色的历史记录搜索功能,交互式变量编辑器和交互式命令行编辑器。

    最好的是, fish本身可以提供大量的文档。 如果需要帮助,只需在任何命令提示符下键入help 。

    医生是对的: fish对您有好处。


    翻译自: https://www.ibm.com/developerworks/aix/library/au-spunix_fish/index.html

    Processed: 0.009, SQL: 9