fish shell使用心得

阴差阳错的,就用上了 fish,然后就不想换别的了,但是 fish 不兼容很多的 bash 脚本,与网上主流教程有一些区别,在这里记录我使用 fish 踩的坑

一、fish shell 简介

1
sudo apt install fish

二、基本配置

1. 颜色主题

1
fish_config

    进入网页端设置界面,设置自己喜欢的颜色主题
    我的配置: fish_prompt.fish

2. 欢迎页面

1
2
3
4
5
6
7
# ~/.config/fish/functions/fish_greeting.fish
function fish_greeting
echo "欢迎文本"
# 可选项:
# date (当前时间信息)
# neofetch (显示运行状态,需要安装 neofetch ,换成 screenfetch 同理)
end

三、函数

1. 基本格式

仿照前面欢迎界面的格式

1
2
3
function hello
echo "hello fish shell"
end

当你直接运行 bash 脚本时,fish 会提示不兼容的地方以及修改方法

2. 命令行参数

使用$argv[num]的形式获得命令行参数,$status获取返回值,count输出参数数量,示例函数如下

1
2
3
4
5
6
7
function test_argv
echo $argv
echo $argv[1] $argv[2]
echo $argv[3]
echo $status
count $argv
end

调用:

1
test_argv 测试 一下 命令行

输出:

1
2
3
4
5
测试 一下 命令行
测试 一下
命令行
0
3

3. 语法

a. if 语句
1
2
3
4
5
6
7
8
9
function test_if
if [ (count $argv) -eq 0 ]
echo "false"
else if [ "$argv[1]" -eq "$argv[2]" ]
echo $argv[1] "==" $argv[2]
else
echo $argv[1] "!=" $argv[2]
end
end
1
2
3
4
# 输入
test_if 2 3
# 输出
2 != 3
b. switch 语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function test_switch
for string in $argv
switch $string
case "switch"
echo "this is switch"
case "if"
echo "this is if"
case "while"
echo "this is while"
case '*'
echo "none"
end
end
end
1
2
3
4
5
6
7
# 输入
test_switch "if" "while" "switch" "dsads"
# 输出
this is if
this is while
this is switch
none
c. while 语句
1
2
3
4
5
function test_while
while true
echo "fish shell"
end
end

四、一些问题

1.兼容 bash 脚本

正常写命令行脚本,例如test.sh,赋予其运行权限后,用以下指令运行

1
bash -c ./test.sh

如果是经常需要使用的脚本,可以将以下内容写入config.fish

1
alias test "bash -c ./test.sh" #应该修改为全局路径

test即可运行该脚本

2.安装 anaconda

a. 安装脚本

      https://mirrors.ustc.edu.cn/anaconda/archive/
      没错,这个是科大的镜像站,指向的却是北外的源,这何尝不是一种 ntr

b. 具体安装过程

      直接执行该脚本(chmod 赋予权限),然后会让你看一些条例啊,确定安装位置啥的,就 yes/no 选择一下,注意最后面推荐你写入环境变量,选择 no,以及是否安装 vscode,选择 no

c. 兼容性调整

      首先根据这个anaconda/fish-shell,在 bash 内运行以下命令

1
conda install -c mdraw fish-shell #可能需要先添加环境变量(见下方)

      然后打开 config.fish 配置文件,加入两行

1
2
set -x PATH /home/your_name/anaconda3/bin $PATH       #根据安装路径调整
source /home/your_name/anaconda3/etc/fish/conf.d/conda.fish

      重启一下终端,大功告成


二逼青年用 bash,普通青年用 zsh,文艺青年用 fish