shell脚本

Shell 教程 | 菜鸟教程

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

接下来写脚本内容:

一般由四部分内容构成:

  1. 写在脚本第一行,声明是bash脚本:#!/bin/bash

  2. 环境部分

  • 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
  1. 执行命令:调用 python,传入超参、配置文件、输出路径

  2. 循环批量实验、打印日志、提示信息

以下是一个例子:

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
相关推荐
Thanks_ks19 小时前
【第 008 讲】在终端中运行 Python 程序:交互模式与脚本模式 | 绝对路径与相对路径 | 以模块方式运行 | 常见报错的识别与排查
python·异常处理·终端·脚本·命令行·cmd·python 解释器
谙弆悕博士2 天前
在文件夹右键直接打开 Kali WSL:一条 `wsl --cd` 注册表脚本
windows·脚本·wsl·右击·ksli
AnxiangLemon13 天前
Warp Lite :一个专注本地使用的开源终端
终端·shell·warp·warp lite
sbjdhjd16 天前
从污点追踪断点到 PHP-FPM 请求队列:HIDS PHP WebShell 样本复盘
开发语言·网络安全·数据挖掘·渗透测试·开源·php·shell
Shell运维手记19 天前
Shell 结构化命令知识点总结(case、for、while)
运维·microsoft·shell·脚本
云计算练习生19 天前
什么是 Bash?Linux 默认 Shell 的核心功能
linux·操作系统·bash·shell·命令解释器
猫咪很可爱20 天前
MySQL 5.7 备份恢复后函数与存储过程丢失:原因分析与正确备份姿势
数据库·mysql·bug·shell
qetfw21 天前
Linux 文件清理:find、mtime 与安全传参验证
linux·shell·1024程序员节
Lsetea22 天前
curl下载HTTPS文件报23:证书验证成功与本地写入失败分层排查
linux·https·shell·ssl证书·curl
DogDaoDao24 天前
Windows 双 Shell 全面对比:CMD 与 PowerShell 的技术剖析
windows·shell·测试·powershell·cmd·程序员开发