Skip to main content
  1. CheatSheet/

CheatSheet

Shell
#

image-20241024164920306

Shell是用户和操作系统之间的媒介,它提供了丰富的接口,以帮助用户使用操作系统。

Shell命令的基本格式是“命令+参数”,参数可以缺省,这些参数随后会被执行该命令的解释器所解析。

命令本质上是可执行文件,可以通过路径来调用,但大部分时候是以别名的形式调用

pwd
sh *.sh
python main.py

当连续执行多条命令时,如果用"&&“连接,则多条命令依次执行,报错则终止;如果用“||”连接则当任意一条命令执行成功,后续命令都不执行

Shell脚本
#

尽管Linux系统中已经实现了大量的Shell脚本供用户调用,但有些时候我们仍然需要自己编写Shell脚本,以实现定制化的需求。

如果希望shell脚本可以作为可执行文件调用,则需要在第一行指定解释器

#!/bin/bash 当作为

否则,只需要在调用该脚本时,显式地指定解释器即可;bash和zsh的语法比sh更全

sh *.sh
bash *.sh
zsh *.sh

变量的定义和使用
#

变量通过=定义,通过${}调用,通过echo可以将变量输出到控制台

Shell中有两类特殊的变量,字符串和数组。

字符串区分单引号和双引号,单引号无视一切转义字符和变量引用,双引号则支持转义字符和变量;多个字符串可以拼接,中间不加空格即可

数组通过()定义,通过${数组名[下标]}访问,${数组名[@]}可获取数组中全部元素

${#变量名}可以获取指定变量的长度

环境变量通常是大写,一般定义在~/.bashrc中,每次启动shell时都会导入;export可以显式环境变量,也可以定义临时的环境变量

定义环境变量的方式 作用域
写在~/.bash_rc里 全局有效,每次启动shell都会导入
export PATH=$PATH:/data/xuzhang/bin 仅当前shell和子进程有效
CUDA_VISIBLE_DEVICES=1,3 python train.py 仅子进程有效

运算符
#

算数运算符一般通过expr命令或者$(())$来实现,运算符的两边需要有空格,双括号中的变量可以不使用$符号前缀

逻辑运算符一般通过test命令或者[[]]来实现,中括号和运算符的两边需要有空格,双中括号支持更多的逻辑运算符

流程控制
#

和其他语言类似,包括分支和循环

分支包括ifcase

if的结束词是fi,即if倒过来

if condition1
then
	command1
elif condition2
then
	command2
else
	commandN
fi

此外也有case,结束词同样是倒过来esac

case 变量 in
	1)
	command1
	...
	commandN
	;;
	2)
	...
esac

循环包括forwhile,两者都支持breakcontinue

for

for 变量 in 数组
do
	command
done

while

while condition
do
done

输入输出
#

输出有echoprintf,其中echo默认不开启转义,需要通过-e开启转义,而printf则支持转义

两者的输出都可以通过>(覆盖写)或者>>(追加写)重定向到指定的文件

可以通过反引号来获取指定命令的输出,以字符串的形式返回,

ssh:安全的shell
#

建立连接 ssh 用户名@服务器IP
断开连接 ctrl+dexit断开连接

内网免密登录

  1. 本地生成公钥ssh-keygen -t rsa
  2. 上传公钥到服务器的授权列表

跳板机登录

方式1:两步登录

首先通过ssh连接跳板机(如果端口号不是ssh的默认端口22,则需要手动指定),然后在跳板机上选择要登录的服务器

方式2:一步登录

ssh xuzhang@xuzhang@172.16.120.1@bacteria.tech -p2222

local和跳板机之间的免密是通过跳板机的用户界面设置,跳板机和服务器之间的免密是由跳板机的管理员设置。

Mac/Linux OS
#

文件系统
#

路径分为绝对路径和相对路径,相对路径是相对于当前工作路径,可通过pwd查看

备注
绝对路径 /data/xuzhang/…
相对路径 ~/... 用户根目录
./ 当前目录
../ 上一级目录
../../ 上上一级目录

不涉及文件内容的查看

ls dir # 查看dir内的文件
du -sh # 查看dir的磁盘占用情况
find -name filename # 搜索

对文件的增删改查

touch filename # 创建文件
mv raw_file new_dir/new_file # 移动/重命名
cp file1 file2 # 复制,文件夹需要-r
rm file/dir # 删除
chmod +x filename # 修改文件的读写权限r (只读)w (写入)x (执行)

对文件内容的查看和修改

cat file # 本义是“concatenate and print files”,连接和查看多个文件内容,实际多用于查看单个文件内容
head -n 10 # 前10行
tail -n 10 # 后10行
grep -c [exp] # 与正则表达式匹配的行,-c返回计数
wc file # 字数

进程管理
#

查看 ps
htop
结束 kill PID``kill name
挂载后台 nohup command &
显卡 gpustat -i pip安装
端口号 netstat -tuln 查看占用情况
`netstat -tuln grep 6006`
ssh -L 8008:127.0.0.1:8008 xuzhang@172.16.120.1 重映射

用户管理
#

用户名 whoami``echo $USER
root权限 sudo apt install gimp sudo cd /root/ 安装软件或编辑用户主目录以外的文件
修改权限 chmod [num][num][num] 6表示读写,7表示读写和执行;三个数字分别对应用户、用户组、其他用户
修改密码 passwd
退出登录 exit Ctrl+D
关机 shutdown

常用软件
#

Zip
#

压缩 解压
zip & unzip
gzip & gunzip gunzip -r dir 解压文件夹下所有.gz文件

Tmux
#

Tmux 使用教程

将会话(Section)和窗口(Terminal Window)解绑

  • 会话可以随时解绑(不随窗口的关闭而终止)和重新接入
  • 可以同时发起多个会话,并进行任意的垂直和水平拆分

安装
#

# Linux
sudo apt-get install tmux

# Mac
brew install tmux

CLI使用
#

tmux #新建会话
tmux new -s <session-name> #新建会话
tmux detach # 分离会话

tmux ls # 查看所有会话
tmux attach -t 0 #接入会话

tmux rename-session -t 0 <new-name> # 重命名会话
tmux kill-session -t <session-name> # 杀死会话

快捷键
#

Ctrl+b是前缀键,用于表示使用快捷键

Ctrl+b+
d detatch 分离当前会话
s 列出所有会话
$ 重命名当前会话
% 左右分屏(百分号的左和右)
"” 上下分屏(上引号和下引号)
o 切换分屏
x 关闭分屏窗口

VIM
#

vim filename # 我只会这一条
  1. 正常模式(Normal-mode)

    • 狂按<Esc>进入
    • dd剪切一行;yy复制一行;p粘贴;u撤销;
  2. 插入模式(Insert-mode)

    • i 键会进行插入模式,进入编辑状态,通过键盘输入内容。
  3. 命令模式(Command-mode)

    • 先切正常模式,然后按/ 进入
    • 未编辑,按q退出;编辑后,wq保存退出,q!不保存强制退出

CUDA
#

CUDA 是什么 | Chenglu’s Log

image-20240605225234182

Driver:可通过nvidia-smi查看显卡的驱动和CUDA驱动版本,驱动版本需要高于Runtime版本

Runtime: 可通过nvcc -V查看,表示CUDA Toolkit的runtime版本,通过CUDA Toolkit installer安装,见usr/local/cuda/include/cuda.h),一些软件会调用Runtime提供的API

不同应用对CUDA各个层的依赖要求是不同的

  • PyTorch会打包所需要的Runtime依赖,不调用本机的CUDA Toolkit,只需要驱动版本满足要求即可。
  • Tensorflow需要安装相应的Library,例如CuDNN,也会对Runtime有要求

Conda
#

选择合适的conda版本,用wget下载并安装,并移除安装包

mkdir -p ~/miniconda3
wget [url] -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh

配置基本的参数

conda config --set auto_activate_base true # 自动激活conda环境
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple #pip换源就够了,从来不用conda

虚拟环境
#

anyway,本人只用base

conda create -n env_name python=3.9 #新建
conda activate env # 激活
conda deactivate # 取消激活
conda remove -n  需要删除的环境名 --all #删除

Git
#

Git 基本操作 | 菜鸟教程 (runoob.com)

初始化
#

基本配置

git config --global user.name [name]
git config --global user.email [email]

从本地仓库初始化

git init # 创建git仓库
touch .gitignore # 修改.gitignore文件在其中写入需要忽略的文件和目录
# "/"开头,从.gitignore所在目录开始匹配
# "/"结尾,只匹配目录,不匹配文件
# "/../"匹配多级目录
# *.filetype,忽略指定类型的文件
# !filetype,不忽略指定类型的文件(如果文件夹已经被忽略,则文件必然被忽略)

克隆远程仓库

git clone [url] # 复制仓库  

分支管理
#

查看分支

git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支

切换分支

如果是创建新分支,则会保持当前文件状态

git checkout -b <branchname> # 创建并切换到分支

如果是切换到已有的分支,则必须先提交,切换到已有分支后,文件会变成目标分支的最后一次提交

git add . && git commit -m [msg] # 切换分支前,首先提交

git checkout [branchname] # 切换分支
git add . && git commit -m [msg] # 提交分支修改

git checkout main # 切换到主分支
git merge [branch_name] # 合并分支,并手动解决冲突
git add <conflict-file>
git commit -m [msg] # 合并与修改应当视为一次新的提交

远程仓库
#

git remote add [origin_name] [http/ssh] # 添加远程仓库
git remote -v # 查看远程仓库

git fetch && git merge [alias]/[branch] # 拉取远程仓库,将远程仓库的指定分支合并到当前分支
git pull [alias] [branch] #将远程仓库的[branch]拉取并合并到当前分支 

git add <conflict-file> #解决冲突
git commit -m [msg] # 并提交

git push -u [alias] [branch] # 第一次需要指定远程仓库
git push # 将[branch]推送到[alias]的[branch]

GDown
#

gdown [url]

Gdown下载权限错误

Hugo
#

Hugo官方文档

部署
#

将Hugo服务器部署到局域网

hugo server --bind "0.0.0.0" # 将hugo服务器端口向局域网内所有ip开放
ifconfig | grep 192 # 查看本机在局域网的ip

将静态网站部署到Github Pages

hugo && cd public && git add . && git commit -m 'update' && git push && cd ..

主题
#

Theme
PaperMod 配置简单,但功能较少
Blowfish 推荐

定制化功能
#

公式渲染 在layouts/partials中重写主题的某些文件,以blowfish为例,需要在vendor.html中重写katex部分的js脚本
社交图标 Social Icons SVG
站内搜索 Search Tools
原理

Vscode
#

自用配置
#

Theme One Dark Pro
Python 编译器+格式化(black, pip安装)
Matlab 编译器+gb2312
Latex xelatex

Docker
#

image-20241010144153061

Image/镜像 通过Dockerfile将需要部署的应用打包成Image
Container/容器 Docker运行在OS上,Contrainer运行在Docker上
Docker 在相应地OS上安装对应的Docker
Dockerfile 配置脚本

网络
#

获取ip

ifconfig

检查连通性

ping [ip]
ping [url]

下载
#

wget ``http://www.ipcmen.com/testfile.zip``
wget -O wordpress.zip [url]

内网传输
#

# sftp
sftp user@ip
put 文件名
get 文件名

# scp
scp src/... tgt/...