為什麼要用fish shell

  • 2020 年 2 月 20 日
  • 筆記

一、Fish跟默認的bash shell有什麼不一樣

什麼是fish,Fish又稱為Friendly shell for interactive use。Fish設計之初能兼容其他shell的命令, 並且會比其他shell更友好而且又高效。在一些特性上,fish做了改進,這和其他shell比如bashl是有區別的。體現在一些標識符,一些命令擴展和易用上。

1.1 單引號和雙引號

fish這裡對待單引號和雙引號的方式和bash不太一樣。fish對待兩種引號區別:能不能進一步展開$變數。雙引號可以,單引號不可以。

圖一、單引號和雙引號的區別

另一這裡其實還有個大括弧,{$PATH}xxx,這裡$PATH是個列表變數,他和xxx形成笛卡爾積,也就是展開成[PATH1xxx,PATH2xxx,…,PATHnXXX]

1.2 命令的嵌套:小括弧和$和重音符

fish的小括弧的含義如同重音符。比如

圖二、嵌套命令

1.3 輸出重定向和錯誤重定向,>和^

這裡的^file是寫錯誤輸出到目標文件,^^file是追加錯誤到目標文件。錯誤重定向這個跟版本有關係,在fish2是有這個功能。Bash是2>, fish也可以使用^,但是在新版本fish已經遺棄了

另外在file前追加?代表操作之前先判斷該文件存不存在。

圖三、判斷有效的重定向

1.4 And和or

And和or相當於bash的&&和||。

用法是command1; and command2 這裡有個分號。

這個和command1;command2不一樣,這裡command2無論command1是否成功都會被執行到。或者這裡分號可以用回車符替代

1.5、命令名字一樣,但是功能更強大

通配符:*,**,***

  • 擴展了*號,有兩個**。比如以下例子:
  • ? 一個字元
  • ???名字3個字元
  • *任意字元串但不包含/
  • **任意字元串包含/,可以包含子文件夾,但是好像是文件名不能帶有/(這個對嗎)
  • ***包含子文件夾,包含名字,不受任何限制

二、更強大的功能

2.1 改變當前工作路徑

除了常規的Cd、pwd(print working dir),fish還擴展了以下關於工作路徑相關的命令:

. / ~都不是一個有效的字元,所以在命令中都可以看做特殊符號來對待

  • Dirh:列印曾經訪問過的目錄路徑。Dir history
  • Cdh 的fish2.7版本好像不存在
  • Prevd:目錄後退
  • Nextd:目錄前進
  • Pushd和popd +-1
  • Dirs.當前push和pop操作的dir stack

2.2 增強版的命令history

所有會話的命令保存在 ~/.local/share/fish/fish_history。不保存空格開頭的隱形命令。不保存重複的命令。只留下最近的命令。fish_history文件保存了命令和執行時間。

  • 命令保存在記憶體中,之後才保存在硬碟fish_history文件,一個會話不能看到另一個沒關閉會話的命令,需要手動執行history merge(這個試了沒用,可能跟fish版本支不支援有關係)
  • History 模糊字元串
  • History -t顯示時間,需要fish 3
  • History -n 最大數量,需要fish 3
  • History clear清除命令

2.3 Fish shell的debug

Bash -x script

Fish -d 3 script.fish

正常的debug一般用echo,但是fish有更強大的debug指令breakpoint

三、fish的設計原則

顏色和文件夾字體都更易於閱讀

默認起始顏色都是紅色的,直到遇到正確的文詞才會變成藍色

顏色可配置有default、foregroud color

圖四、fish的字體顏色