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这条鲜美的鱼