簡(jiǎn)單優(yōu)雅的shell–fish~

Fish—a friendly interactive shell

fish剛出來(lái)時(shí)我就被它強(qiáng)大的命令參數(shù)補(bǔ)全和顏色高亮所吸引,一度作為我的默認(rèn)shell,但由于語(yǔ)法不與bash兼容以及一些其他缺陷,還是放棄了,轉(zhuǎn)投z shell,最近fish更新到了2.0,看了下,基本是個(gè)成熟的shell了,決定與它重修舊好~

與Z shell強(qiáng)大的diy比較,它強(qiáng)調(diào)的是用戶友好、開(kāi)箱即用,無(wú)需配置(官方強(qiáng)調(diào)了了一點(diǎn):配置性是萬(wàn)惡之源),但還是可以配置的,譬如有第三方的oh-my-fish

下面對(duì)比bash給出fish除了命令參數(shù)補(bǔ)全和顏色高亮給我的一些的驚喜:

1.統(tǒng)一的變量定義
在bash里,變量定義混亂,一般定義是: var=value
也可以這樣定義
declare var=value
如果希望子shell也能繼承,還需export
export var=value
但在fish里,一個(gè)set命令搞定一切,譬如:
定義全局變量:
set -U var=value
export一個(gè)變量:
set -x var=value

2.類似高級(jí)語(yǔ)言的循環(huán)判斷
bash語(yǔ)法被無(wú)數(shù)程序員吐槽的一個(gè)就是惡心的循環(huán)判斷結(jié)尾:

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

但在fish里,沒(méi)了fi,esca,done沒(méi)了,取而代之是高級(jí)語(yǔ)言通用的end

3.取消古怪變量
在bash里,哪些是古怪變量呢,譬如位置變量用$0,$1…..$#,$*;又譬如錯(cuò)誤狀態(tài)號(hào)$?,看起來(lái)實(shí)在很惡心~
但在fish里,全換為有意義的變量名:
譬如位置變量是數(shù)組變量$argv,這樣當(dāng)傳遞一個(gè)變量時(shí):
fish test.fish var1
$argv就是var1
傳遞多個(gè)變量時(shí):
fish test.fish v1 v2 v3 v4
$argv 就是數(shù)組[v1 v2 v3 v4],當(dāng)需要取出特定的位置變量,可以使用$argv[n]來(lái)取 fish里錯(cuò)誤狀態(tài)也用$status來(lái)替代$?

4.DRY原則的函數(shù)體現(xiàn)
fish里雖然也有alias,但那是為了兼容posix,官方建議舍用alias,why?因?yàn)楹瘮?shù)可以實(shí)現(xiàn)alias,為什么還需alias一個(gè)單獨(dú)命令?
定義一個(gè)ls -al的別名ll很簡(jiǎn)單: 4.二元邏輯判斷
command1 && command2 || command3
這種簡(jiǎn)潔的二元判斷是bash的一大特色,但在fish稍顯麻煩:
command1; and command 2; or command 3
其實(shí)就是&&換成and,||換成or,fish犧牲語(yǔ)法的簡(jiǎn)潔換來(lái)語(yǔ)義的簡(jiǎn)單,哪個(gè)好?仁者見(jiàn)仁,智者見(jiàn)智吧~

以上只是fish給我留的一些比較深的印象,事實(shí)上,在用fish時(shí),仍有其他小的閃光點(diǎn)給我驚喜和感動(dòng)假如厭倦了bash的一些古老的特性,不妨嘗嘗fish這條鮮美的魚(yú)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容