Skip to content

CVEQ (一款快速切换虚拟环境的交互式 shell 脚本)

约 983 字大约 3 分钟

Linuxcondamicromambaminiforge

2024-10-23

前情提要

  • 诚然,使用 condamicromamba 之类的虚拟环境与包管理器安装软件是很方便快捷,不用解决“依赖地狱”。
  • 但是,随着我们的深入使用发现,如果将所有软件装在同一个环境(比如: base) 里面,会使得单个环境过于臃肿,以后每次安装新软件的时候会大大拖慢包管理器计算依赖所需的时间。
  • 如果像我之前的教程所写那样,一个虚拟环境装一个/一类软件,可以避免之后安装软件时计算复杂的软件依赖。但是,难免会有些冗余,并且像我这样喜欢给虚拟环境起很长名字的人,在激活环境的时候需要 activate 一个很长的名字,导致使用起来不够便利。
  • 因此,为了解决这个问题,我编写了一个 shell 脚本,用于快速选择 + 切换虚拟环境。

使用说明

下载

# 确保 .local 文件夹已建立
mkdir -p ~/.local
# 下载
curl "https://r2-hugo.meteor-oxalis3.com/03_Linux/cveq.sh" > ~/.local/cveq.sh

配置

# mm 可以换成你喜欢的名字
echo "alias mm='source ~/.local/cveq.sh'" >> ~/.bashrc
source ~/.bashrc

使用

  • 注意!使用本脚本前请确保:
  1. 你已经顺利初始化 shell
  2. 你有创建过除了 base 环境之外的虚拟环境
  • 第一次使用本脚本时,会询问你所使用的环境管理工具:
# 你刚刚设置的别名,我这里是 mm
mm

# 请选择你所使用的环境管理工具:
# (1) anaconda
# (2) micromamba
# (3) mamba
# (4) miniforge
# (5) miniconda

# 请输入 (1 或 2 或 3 或 4 或 5): 1

# 已选择 anaconda

# 可激活的虚拟环境:

# (1) gatk4
# (2) seqkit2
# (3) sra-tools
# (4) multiqc
# (5) fastqc
# (6) fastp
# (7) trimmomatic
# (8) test
# (9) assemble

# 请输入要激活的虚拟环境序号: 1
# (gatk4) saturn@debian:~#
  • 以后使用只需要:
  1. 输入 mm,回车;
  2. 输入你要选择的虚拟环境前的数字,回车;

就可以快速切换你的虚拟环境啦~

Q & A

Q1: 如果我第一次使用本脚本时,不小心选错了包管理器怎么办?

  • A1: 不用担心,使用 rm ~/.cveq 删除脚本的配置文件,重新运行脚本,再次选取即可

源代码

#!/bin/bash
BLUE="\033[0;34m"
RESET="\033[0m"

# 定义保存用户选择的文件路径
CONFIG_FILE="$HOME/.cveq"

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
    # 如果文件不存在,询问用户使用的是 Anaconda 还是 Micromamba
    echo -e "请选择你所使用的环境管理工具:\n"
    echo "(1) anaconda"
    echo -e "(2) micromamba"
    echo -e "(3) mamba"
    echo -e "(4) miniforge"
    echo -e "(5) miniconda\n"
    read -p "请输入 (1 或 2 或 3 或 4 或 5): " choice

    # 保存用户选择
    if [ "$choice" -eq 1 ]; then
	touch $CONFIG_FILE
        echo "conda" > "$CONFIG_FILE"
        echo -e "\n已选择 ${BLUE}anaconda${RESET}"
    elif [ "$choice" -eq 2 ]; then
	touch $CONFIG_FILE
        echo "micromamba" > "$CONFIG_FILE"
        echo -e "\n已选择 ${BLUE}micromamba${RESET}"
    elif [ "$choice" -eq 3 ]; then
	touch $CONFIG_FILE
        echo "mamba" > "$CONFIG_FILE"
        echo -e "\n已选择 ${BLUE}mamba${RESET}"
    elif [ "$choice" -eq 4 ]; then
	touch $CONFIG_FILE
        echo "mamba" > "$CONFIG_FILE"
        echo -e "\n已选择 ${BLUE}miniforge${RESET}"
    elif [ "$choice" -eq 5 ]; then
	touch $CONFIG_FILE
        echo "conda" > "$CONFIG_FILE"
        echo -e "\n已选择 ${BLUE}miniconda${RESET}"
    else
        echo "无效的选择,退出脚本。"
        exit 1
    fi
else
    # 如果配置文件存在,读取并输出用户的选择
    pm=$(cat "$CONFIG_FILE")
fi

# 读取环境列表并为每个环境名称添加序号
env_list=$(grep "envs" ~/.conda/environments.txt | awk -F'/' '{print "(" NR ") " $NF}')

# 输出带有序号的环境列表
echo -e "\n可激活的虚拟环境:\n"
echo "$env_list"

echo ""

# 读取用户输入的序号
read -p "请输入要激活的虚拟环境序号: " choice

# 读取包管理器
pm=$(cat "$CONFIG_FILE")

# 根据用户输入的序号激活对应的环境
selected_env=$(echo "$env_list" | awk -v num=$choice 'NR==num {print $2}')

if [ -n "$selected_env" ]; then
     "$pm" activate "$selected_env"
else
    echo "无效的序号,请输入正确的序号。"
fi