简单优雅的shell–fish~

Fish—a friendly interactive shell

fish刚出来时我就被它强大的命令参数补全和颜色高亮所吸引,一度作为我的默认shell,但由于语法不与bash兼容以及一些其他缺陷,还是放弃了,转投z shell,最近fish更新到了2.0,看了下,基本是个成熟的shell了,决定与它重修旧好~

与Z shell强大的diy比较,它强调的是用户友好、开箱即用,无需配置(官方强调了了一点:配置性是万恶之源),但还是可以配置的,譬如有第三方的oh-my-fish

下面对比bash给出fish除了命令参数补全和颜色高亮给我的一些的惊喜:

1.统一的变量定义
在bash里,变量定义混乱,一般定义是: var=value
也可以这样定义
declare var=value
如果希望子shell也能继承,还需export
export var=value
但在fish里,一个set命令搞定一切,譬如:
定义全局变量:
set -U var=value
export一个变量:
set -x var=value

2.类似高级语言的循环判断
bash语法被无数程序员吐槽的一个就是恶心的循环判断结尾:

if.......fi
case......esac
for .........done
while.......done

但在fish里,没了fi,esca,done没了,取而代之是高级语言通用的end

3.取消古怪变量
在bash里,哪些是古怪变量呢,譬如位置变量用$0,$1…..$#,$*;又譬如错误状态号$?,看起来实在很恶心~
但在fish里,全换为有意义的变量名:
譬如位置变量是数组变量$argv,这样当传递一个变量时:
fish test.fish var1
$argv就是var1
传递多个变量时:
fish test.fish v1 v2 v3 v4
$argv 就是数组[v1 v2 v3 v4],当需要取出特定的位置变量,可以使用$argv[n]来取 fish里错误状态也用$status来替代$?

4.DRY原则的函数体现
fish里虽然也有alias,但那是为了兼容posix,官方建议舍用alias,why?因为函数可以实现alias,为什么还需alias一个单独命令?
定义一个ls -al的别名ll很简单: 4.二元逻辑判断
command1 && command2 || command3
这种简洁的二元判断是bash的一大特色,但在fish稍显麻烦:
command1; and command 2; or command 3
其实就是&&换成and,||换成or,fish牺牲语法的简洁换来语义的简单,哪个好?仁者见仁,智者见智吧~

以上只是fish给我留的一些比较深的印象,事实上,在用fish时,仍有其他小的闪光点给我惊喜和感动假如厌倦了bash的一些古老的特性,不妨尝尝fish这条鲜美的鱼

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Bash内置基本变量 PWD : 显示当前的工作目录 OLDPWD : 显示上一次的工作目录 ~:用户家目录 - ...
    魏镇坪阅读 1,559评论 0 6
  • 概述 首先,咱们来了解一下,什么是Shell。操作系统内核给我们提供了各种接口,同时也提供了各种用户层的库,理论上...
    keysaim阅读 1,415评论 0 0
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 3,372评论 0 1
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,739评论 3 70
  • 1.建立和运行shell程序 什么是shell程序呢? 简单的说shell程序就是一个包含若干行shell或者li...
    运维阿文阅读 1,516评论 0 9