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

VS Code 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

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 表

虽然不应该写在这,但是没地方放了

asciiascii