Shell 解释器 / 程序是用C语言编写的程序,是用户使用linux的桥梁。
Shell 语言既是一种命令语言,又是一种程序设计语言。
程序 :实体。语言:规范/规则。
命令语言:交互,敲一条执行一条
程序设计语言:写脚本文件,有变量、循环、判断,实现逻辑、自动批量处理。(python,C++就是程序设计语言)
Shell 脚本(shell script):shell语言写的脚本。
业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念。
脚本:一堆按顺序写好的指令文本文件,人打开可以直接阅读,依赖解释器运行
普通 C++ 程序 VS 脚本:
普通 C++ 程序:写源码(.cpp) → 编译器编译成a.out二进制可执行文件→运行。
脚本:纯文本→解释器程序→实时翻译→CPU执行。没有编译出二进制文件这一步。
解释器:可执行程序,专门用来读取「源代码 / 脚本」,边读边翻译成 CPU 能懂的指令,直接执行,不需要提前编译生成二进制文件。
.sh是bash脚本(shell语言写的),解释器是bash程序(C语言写的程序)(在 /bin/bash 目录下),运行命令:bash run_train.sh
.py是python脚本(python语言写的),解释器是python程序(C语言写的程序)(在服务器原生shell下是:/usr/bin/python3, /usr/bin/python),运行命令:python3 train.py(=调用python3跑代码),python train.py(=调用python2跑代码,对应/usr/bin/python),此时务必写python3 train.py,因为python2是旧版本,官方已废弃淘汰。但是如果使用conda,python/python3 train.py=调用python3,因为conda环境内部只有python3。conda环境中的解释器不在/usr/bin/python(3),而是在envs/env_name/bin/python or /bin/python(base环境)
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
Bash也是大多数Linux 系统默认的 Shell(bash是shell的一种,所以对应有bash语言,bash程序),当登录 Ubuntu/CentOS 这类 Linux 服务器,系统默认启动的那个命令解释器程序,就是 bash。bash解释器所在目录/bin/bash
一个类比:shell→浏览器,那么bash→chrome(一个具体的浏览器程序),
创建 shell 脚本:
一般在项目根目录下的.scripts/下创建.sh脚本。(如:myproject_name/scripts/test.sh)
首先cd ./myproject_name,然后mkdir scripts, vim test.sh
编辑脚本内容的时候,先点i键,进入编辑模式,再编辑。退出的时候要先点Esc键,再输入:wq 按enter键退出(:q!是不保存)。添加可执行权限chmod +x test.sh,运行脚本./test.sh或者是sh tesh.sh。删除脚本文件rm test.sh
接下来写脚本内容:
一般由四部分内容构成:
-
写在脚本第一行,声明是bash脚本:#!/bin/bash
-
环境部分
- CUDA_VISIBLE_DEVICES 指定 GPU 卡号:export CUDA_VISIBLE_DEVICES=0,1
- conda 激活虚拟环境:
source ~/.bashrc #加载用户配置,把conda环境变量读进来,等价于. ~/.bashrc
conda activate env_name #激活conda环境 - 切换工作目录(以下命令正确实现的前提是.sh脚本文件在myproject_name/scripts/下)
SCRIPT_DIR=(cd "(dirname "{BASH_SOURCE\[0\]}")" \&\>/dev/null \&\& pwd) PROJECT_ROOT=(dirname "SCRIPT_DIR") cd "{PROJECT_ROOT}" || exit
-
执行命令:调用 python,传入超参、配置文件、输出路径
-
循环批量实验、打印日志、提示信息
以下是一个例子:
bash
#!/bin/bash
source ~/.bashrc
conda activate mydl_env
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
PROJECT_ROOT=$(dirname "$SCRIPT_DIR")
cd "${PROJECT_ROOT}" || exit
# 循环几组学习率
for lr in 1e-3 5e-4 1e-4
do
echo "===== 开始实验 lr=$lr ====="
export CUDA_VISIBLE_DEVICES=0
python main.py \
--config configs/train_config.yaml \
--lr $lr \
--output_dir outputs/exp_lr_${lr}
done