為什麼要用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
