Linux Shell
本文章随时可能更新
随着东西越来越多,可能不限于 Linux 了,-_-b
环境配置
bash
.bashrc
快捷键
- Ctrl + A: 移到命令行首
- Ctrl + E: 移到命令行尾
- Ctrl + F: 按字符前移(右向)
- Ctrl + B: 按字符后移(左向)
- Alt + F: 按单词前移(右向)
- Alt + B: 按单词后移(左向)
- Ctrl + XX: 在命令行首和光标之间移动
- Ctrl + U: 从光标处删除至命令行首
- Ctrl + K: 从光标处删除至命令行尾
- Ctrl + W: 从光标处删除至字首
- Alt + D: 从光标处删除至字尾
- Ctrl + D: 删除光标处的字符
- Ctrl + H: 删除光标前的字符
- Ctrl + Y: 粘贴至光标后
- Alt + C: 从光标处更改为首字母大写的单词
- Alt + U: 从光标处更改为全部大写的单词
- Alt + L: 从光标处更改为全部小写的单词
- Ctrl + T: 交换光标处和之前的字符
- Alt + T: 交换光标处和之前的单词
- Alt + Backspace: 与 Ctrl + w
相同类似,分隔符有些差别 - Ctrl + R: 逆向搜索命令历史
- Ctrl + G: 从历史搜索模式退出
- Ctrl + P: 历史中的上一条命令
- Ctrl + N: 历史中的下一条命令
- Alt + .: 使用上一条命令的最后一个参数
- Ctrl + L: 清屏
- Ctrl + O: 执行当前命令,并选择上一条命令
- Ctrl + S: 阻止屏幕输出
- Ctrl + Q: 允许屏幕输出
- Ctrl + C: 终止命令
- Ctrl + Z: 挂起命令
- !!: 执行上一条命令
zsh
安装插件
yay -Syu zsh-syntax-highlighting zsh-autosuggestions zsh-autocomplete-git
zsh 相关配置项
PROMPT='%F{10}%n@%m%f:%F{12}%~%f> ' ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=blue" source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh bindkey '^I' complete-word # tab | complete bindkey '^[[Z' autosuggest-accept # shift + tab | autosuggest ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(buffer-empty bracketed-paste accept-line push-line-or-edit) ZSH_AUTOSUGGEST_STRATEGY=(history completion) ZSH_AUTOSUGGEST_USE_ASYNC=true
vim
" 关闭 vi 兼容 set nocompatible " 历史记录步数 set history=1000 " 自动检查格式 filetype on filetype plugin on filetype indent on " 自动重载文件 set autoread " 允许使用鼠标 set mouse=a set selection=exclusive set selectmode=mouse,key " 激活折叠 set foldenable " 高亮当前行 set cursorline " 语法高亮 syntax on " 显示行号 set nu " 缩进 set tabstop=4 set shiftwidth=4 set expandtab set si " 自动对齐 set autoindent set cindent set smartindent " 显示标尺 set ruler
ssh
Host * ControlMaster auto ControlPath ~/.ssh/%r@%h:%p.socket ControlPersist yes
用户组
usermod -a -G groupA user usermod -a -G docker ohyee usermod -a -G root ohyee
开发环境
依赖于用户目录下的 env
环境自动识别实现
export ENV_FOLDER=$HOME/env:$HOME/env/bin for folder in $(ls -alR $ENV_FOLDER | grep "^l" | tr -s " " | cut -d " " -f 9); do export PATH=$PATH:$ENV_FOLDER/$folder/bin done
使用 ln -s
将不同版本的依赖注册到环境变量里
Java
同时,还需要设置相关的环境变量
export JAVA_HOME=${HOME}/env/openjdk export PATH=${PATH}:${JAVA_HOME}/jre/bin
需要注意的是,全局的 Maven setting.xml
位于 $HOME/env/maven/conf/setting.xml
NodeJS
Go
Python
python3 -m pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
基础命令
yay
-
安装、更新
yay -S vim # 安装软件 yay -Sy vim # 更新列表并安装软件 yay -Syu vim # 更新可更新的包,并安装软件 yay -Syyu vim # 更新系统,并安装软件 yay -Su # 更新所有包 yay -Sw vim # 下载安装包不安装 yay -U xxx.pkg.tar.gz # 安装本地包
-
卸载
yay -R vim # 卸载软件 yay -Rs vim # 卸载软件,并卸载其可卸载依赖 yay -Rsc vim # 卸载软件,卸载其依赖,并卸载依赖其的软件 yay -Ru vim # 卸载软件,同时卸载所有不被依赖的依赖
-
搜索
yay -Ss vim # 搜索软件 yay -Sl archlinuxcn # 从指定仓库搜索 yay -Qs vim # 搜索已安装的软件 yay -Qu # 搜索可更新的软件 yay -Qt # 搜索任何不被依赖的软件 yay -Qi # 搜索并查看信息 yay -Ql # 搜索并查看其安装的文件路径 yay -Sg # 查找软件包 yay -Qg # 查看已安装的软件包
-
清理
yay -Sc # 清理未安装的包缓存 yay -Scc # 清理所有缓存
apt
在部分场景下,可能需要为 apt 设置临时代理(如 docker 内),可以使用
apt-get -o Acquire::http::proxy="socks5h://host.docker.internal:7890" install vim -y
cut
cut
可以对字符串进行分割,并取出特定列的内容
echo "1|2|3|45|6" | cut -d "|" -f 2
如上面的命令,则可以取出用 |
分割的第二部分内容(2
)
echo "1|2|3|45|6" | cut -d "|" -f 2-4
而 -f 2-4
则可以取出 2~4 部分内容(2|3|45
)
tr
tr 可以删除或替换字符
-
大小写转换
使用下面的命令,可以将小写转换为大写,输出ABCD
echo "abcd" | tr a-z A-Z
-
合并相邻字符
可以将字符串中多余的空格合并为一个,输出Hello World !
,通常用于和cut
配合echo "Hello World !" | tr -s " "
-
删除字符
将满足条件的字符删除,输出Hi!
echo "Hi !" | tr -d " "
sed
sed 是用来处理文本文件的命令
-e
: 要执行的操作-n
: 只显示修改的部分-i
: 执行操作,并将改动写入文件
操作指令
a
: 在对应行数后新增一行c
: 修改对应的行d
: 删除对应的行i
: 在对应行数前新增一行p
: 打印对应的行s
: 正则表达式替换
命令格式 {要修改的位置}{命令}{改动后的结果}
要修改的位置可以是行数,也可以是使用 /
包裹的正则表达式。如果要修改 2~5 行,则可以使用 2,5
-
在第一行后新增
$ echo -e "12345\n246810" | sed -e "1aabcdefg" 12345 abcdefg 246810
-
删除第 2 行
$ echo -e "12345\n246810" | sed -e "2d" 12345
-
正则表达式替换
$ echo -e "12345\n246810" | sed -e "s/1/a/" a2345 2468a0
grep
grep -5 'xxx' // 匹配同时输出上下 5 行 grep -C 5 'xxx' // 匹配同时输出上下 5 行 grep -A 5 'xxx' // 匹配同时输出后 5 行 grep -B 5 'xxx' // 匹配同时输出前 5 行 $ a=`for i in {1..10}; do echo "$i"; done`; echo $a | grep -C 2 "5" 3 4 5 6 7
其他命令
rsync
rsync 是一个可以与替换 mv、cp、scp 的工具
-r
: 递归操作(操作文件夹)-a
: 同步元数据-n
、--dry-run
: 不实际执行,只查看可能的结果--delete
: 删除目的文件夹存在,但是源文件夹不存在的文件--exclude
: 排除文件不操作-c
: 检查 checksum,而不是时间戳-h
: 人类可读形式展示-i
: 输出源文件夹和目的文件夹的差异--link-dest
: 增量备份的基准目录-m
: 不同步空目录-v
: 展示详细信息--partial
: 允许断点重传--progress
: 显示进度-z
: 压缩传输-P
:--progress
+--partial
FFMpeg
所有的参数都会作用于参数后的第一个文件
参数解释
基本参数 | 解释 | 音频参数 | 解释 | 视频参数 | 解释 |
---|---|---|---|---|---|
-i |
设定输入流 | -aframes |
音频帧数 | -vframes |
视频帧数 |
-f |
设定输出格式 | -b:a |
音频码率 | -b:v |
视频码率 |
-ss |
开始时间 | -ar |
采样率 | -r |
帧速率 |
-t |
持续长度 | -acodec |
声音解码器 | -vcodec |
视频解码器 |
-an |
不处理音频 | -vn |
不处理视频 | ||
-af |
音频过滤器 | -vf |
视频过滤器 | ||
-ac |
声音频道数 | -s |
画面大小 | ||
-aspect |
横纵比 |
常用命令
-
将
flv
转换为mp4
:ffmpeg -i input.flv output.flv
-
裁剪视频:
- 粗略裁剪(如果没有关键帧则无法精确裁剪):
ffmpeg -ss 00:00:00 -t 00:00:30 -i input.mp4 -vcodec copy -acodec copy output.mp4
- 直接裁剪(无视关键帧,可能会导致黑屏):
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:30 -vcodec copy -acodec copy output.mp4
- 粗略裁剪(如果没有关键帧则无法精确裁剪):
-
帧内编码:
ffmpeg -i input.mp4 -strict -2 -qscale 0 -intra output.mp4
-
视频拼接:
ffmpeg -f concat -i list.txt -c copy output.mp4
-
其中,
list.txt
的内容应该是如下格式file ./split.mp4 file ./split1.mp4
-
-
截图:
- 输入截图(很快):
ffmpeg -ss 00:1:05 -i input.mp4 -frames:v 1 output.jpg
- 输出截图(需要重新编码,较慢):
ffmpeg -i input.mp4 -ss 00:1:05 -frames:v 1 output.jpg
- 输入截图(很快):
-
视频静音:
ffmpeg -i input.mp4 -an output.mp4
-
只要音频:
ffmpeg -i input.mp4 -an output.mp3
ffmpeg -i input.mp4 output.mp3
-
视频转换为图片:
ffmpeg -i input.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
-
音频调整音量:
ffmpeg -i input.mp3 -filter "volume=20dB" output.mp3
screen 命令
参数
screen -ls # 列举所有 screen 会话 screen -d # 后台运行会话 screen -r # 恢复会话 screen -S <name> # 预设会话名称 screen -wipe # 清除宕机的会话 screen -s <shell> # 设定 shell
screen 会话内部
<C-a> d # 后台运行会话 # 窗口相关 <C-a> w # 显示窗口列表 <C-a> c # 启动一个新的 shell 并切换到该窗口 <C-a> <0~9> # 快速切换到指定窗口 <C-a> ' # 交互式切换至指定窗口 <C-a> <C-a> # 上一个使用的窗口 <C-a> p # 前一个窗口 <C-a> n # 后一个窗口 <C-a> Space # 顺序切换窗口 # 分屏相关 <C-a> | # 左右分屏 <C-a> S # 上下分屏 <C-a> X # 关闭当前分屏 <C-a> Tab # 分屏间切换
如果希望使用鼠标切换分屏,可以在~/.screenrc
中修改
mousetrack ondefmousetrack on
添加如下配置,则可以允许鼠标滚轮滚动
termcapinfo xterm* ti@:te@
tmux
tmux 本身包含会话(session)、窗口(window)、窗格(panel)三层概念,其中会话和窗口实际上并没有特别明显的界限(可以使用快捷键直接在不同会话内切换),因此通常根据任务进行逻辑上划分
所有的快捷键都需要使用 ctrl + b 作为前缀(后续省略)
同时,也可以直接在 tmux 内部的终端内执行相应的命令来实现快捷键同样的效果
会话操作
# 新建会话 tmux new [-s {会话名}] [-n {窗口名}] # 列出会话 tmux ls # 进入会话 tmux attach [-t {会话名}] tmux at [-t {会话名}] tmux a [-t {会话名}] # 退出会话 tmux detach tmux det # 结束会话 tmux kill-session # 关闭其他会话 tmux kill-session -t {会话名} # 切换会话 tmux switch -t {会话名} # 重命名会话 tmux rename-session -t 0 {会话名}
- s: 列出所有会话
- $: 重命名当前会话
:new
: 启动新会话- d: 退出会话
- (: 上一个会话
- ): 下一个会话
窗口相关
# 创建窗口 tmux new-window # 切换窗口 tmux select-window -t {窗口编号} # 重命名窗口 tmux rename-window {窗口名}
- c: 创建新窗口
- w: 列出所有窗口
- n: 后一个窗口
- p: 前一个窗口
- f: 查找窗口
- ,: 重命名窗口
- &: 关闭窗口
- number: 切换到对应序号的窗口
窗格相关
# 上下拆分窗格 tmux split-window # 左右拆分窗格 tmux split-window -h # 移动光标 tmux select-pane [-U] [-D] [-L] [-R] # 交换窗格位置 tmux swap-pane [-U] [-D] [-L] [-R]
- %: 左右分割
- ": 上下分割
- arrow key: 切换窗格
- ;: 下个窗格
- o: 上个窗格
- x: 关闭窗格
- !: 将窗格拆分为窗口
- z: 全屏窗格
- ctrl + arrow key: 调整窗格大小
- q: 显示窗格编号
其他
# 查看快捷键 tmux list-keys # 查看命令 tmux list-commands # 查看会话信息 tmux info # 重新加载 tmux 配置 tmux source-file ~/.tmux.conf
- t: 显示时钟
- ?: 列出快捷键
docker
-
删除所有启动中的容器
docker ps | cut -d " " -f 1 | grep -v CONTAINER | xargs docker stop
-
获取特定 Container IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' $ContainerID
-
删除 none 镜像
docker images | grep none | tr -s " " | cut -f 3 -d " " | xargs docker rmi
-
启动一个挂后台的容器,可用于独立开发环境
docker run --name=dev --net=host -it -d -v $(pwd):/data ubuntu tail -f /dev/null
axel
轻量级命令行多线程下载
axel xxx.tar -n 16
清理 vhdx(Docker、WSL)
Optimize-VHD -Path $Env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx -Mode Full Optimize-VHD -Path $Env:LOCALAPPDATA\Packages\yuk7.archwsl_35zwpb4sx6e50\LocalState\ext4.vhdx -Mode Full
其他
ASCII 表
虽然不应该写在这,但是没地方放了