Appearance
命令行 101
输入端口杀死进程
bash
kill -9 $(lsof -t -i:1080)tldr
全称是 "Too Long; Didn't Read",即“太长,不想读”
bash
tldr findtmux
tmux 概念:Session(会话)、Window(窗口)、Pane(面板)
bash
tmux ls
# 脱离会话
Ctrl+B D
# 返回会话
tmux attach -t 0
tmux a -t 0
# 新建会话
tmux new -s Session1
# 新建窗口
Ctrl+B C
# 切换窗口 Next
Ctrl+B N
# 切换窗口 Previous
Ctrl+B P
# 切换窗口 按序号
Ctrl+B (1,2,3)
# 重命名窗口
Ctrl+B ,
# 窗口导航
Ctrl+B W
# 移动光标
Ctrl+B 方向键
# 关闭分屏
Ctrl+B X
# 左右分屏
Ctrl+B %
# 上下分屏
Ctrl+B "自定义 tmux 状态栏(.tmux.conf)
conf
set -g status-bg cyan
set -g window-status-style bg=yellow
set -g window-status-current-style bg=red,fg=whitegit
bash
# commit 合并 add 和 commit
git commit -am "update"
# checkout 首次检出远程分支到本地
git checkout -b <本地分支名> origin/<远程分支名>
# alias
git config --global alias.ac "commit -am"
git ac "update"
# amend 修正 commit 消息
git commit --amend -m "nick"
git commit --amend --no-edit
# log
git log --oneline --graph -- decorate
## 1. by date: `--before`/`--after`
git log --after="2021-7-1" --before="2021-7-5"
## 2. by msg: `--grep`
git log --grep="refactor"
## 3. by author: `--author`
git log --author="Heinemeier"
## 4. by file: `-- <filename>`
git log -- README.md
## 5. by branch: `<branch-A>`
git log feature/login..main # 在main分支,但不在login分支的提交
# revert
git revert better-day
git revert s2a2309
# stash
git stash
git stash pop
git stash save coolstuff
git stash list
git stash apply 0
# interactive rebase
git rebase -i HEAD~3
git log --oneline
# cherry-picking
git cherry-pick asd12as
git rebase --hard HEAD~1
# reflog 1. 恢复被删 commit 2. 恢复被删分支
git reflog
git branch happy-end a23adsf
# 查看所有远程仓库的地址
git remote -v- 13 Advanced (but useful) Git Techniques and Shortcuts
- Git for Professionals Tutorial - Tools & Concepts for Mastering Version Control with Git
- Advanced Git Tutorial - Interactive Rebase, Cherry-Picking, Reflog, Submodules and more
tree
目录
sh
# 只显示2层深度
tree -L 2
# 显示3层深度的目录结构,不包含文件
tree -L 3 -dsort
TODO
uniq
TODO
xargs
把前一个命令的输出转成参数,交给下一个命令用
bash
# 找到名字里有 `tmp` 的文件并删除。
fd tmp | xargs rm -f
# 找所有 `.go` 文件,并统计行数
fd . -e go | xargs wc -l
# 配合 `echo` 验证参数流向
echo "foo bar baz" | xargs -n1tee
一边输出内容到终端,一边保存一份到文件
sh
# 看 build 结果,还顺手存一份
kustomize build . | tee /tmp/build.yaml
# 应用前手动备份一手
kustomize build . | tee preview.yaml | kubectl apply -f -heredoc
在 shell 中写多行字符串的语法
sh
# 标准输出
cat <<EOF
兄弟你这发言,像极了成长型人格的典范!
一开口我就感觉你是要起飞的人。
EOF
# 写文件(覆盖模式)
cat > kubernetes.conf <<EOF
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
EOF
# 写文件(增量模式)
cat >> config.yaml <<EOF
# 新增的配置项
new_key: new_value
EOF
# 多行脚本内嵌内容
mysql -u user -p <<EOF
USE mydb;
SELECT * FROM users;
EOF
# 保留变量(默认行为)
name="宝"
cat <<EOF
你好,$name!
EOF
# 不展开变量 / 禁止替换(注意引号)
cat <<'EOF'
你好,$name!
EOF| 场景 | 用法 | 说明 |
|---|---|---|
| 写入多行文件 | cat <<EOF > file | 最常见 |
| 传多行内容给命令 | cmd <<EOF | SQL、邮件、curl |
| 不想变量展开 | <<'EOF' | 加引号保留原样 |
| 想缩进清爽 | <<-EOF | 支持 tab 缩进 |
sed
sh
# -i: s/模式/替换/g
sed -i 's/^SELINUX=.*/SELINUX=enable/' config.ini
sed -i '/ swap /s/^\(.*\)$/#\1/g' config.iniawk
TODO
grep
TODO
fd
比 find 更牛逼的文件查找命令
记住,
fd找文件名,rg找文件内容
sh
# 在当前目录下查找所有文件/目录名中包含 main 的文件
fd main
# 在 internal/settings 下找名字里含 config 的文件
fd config ./internal/settings
# 在 app/ 目录下找名字里含 login 的 .go 文件
fd -e go login ./app
# 忽略大小写搜索
fd -i login ./app
# 仅查找文件
fd service --type f
# 仅查找目录
fd service --type dripgrep
https://github.com/BurntSushi/ripgrep
查找文件中的指定内容,平替 grep
bash
# 在 config/settings.yml 文件里搜索包含关键词 port 的行
rg port config/settings.yml
# 在 internal/ 目录下递归搜索所有包含 login 的行
rg login internal/
# 匹配整个词
rg -w login
# 禁用正则
rg -F 'a+b'
# 支持正则表达式
echo -e "line1\nlineN\nline3" | rg "^line[0-9]$"fzf
搜索过滤器,不自带搜索文件内容功能
bash
# 查历史命令
history | fzf
# 结合 fd
fd | fzf
# 结合 rg
rg --files | fzf
# 结合 git
git ls-files | fzf
# 切换 Git 分支
git checkout $(git branch --all | fzf)
# 搜索文件
find . -type f | fzf
# 搜索 Git 提交记录
git log --oneline --pretty=format:"%d %h %s %ad %an" --date=short --graph | fzfvenv
TODO
uv
下一代 Python 包管理器
bash
# 初始化 Python 项目
uv init myproject
# 激活虚拟环境
uv venv
source .venv/bin/activate
# 下载依赖
uv sync
# 运行程序
uv run main.py
# 清理缓存
uv cache cleanconda
bash
# 禁止自动激活 base 环境
conda config --set auto_activate_base false
conda env list
conda create -n project_name python=3.10
source /opt/anaconda3/bin/activate # 避免报错
conda activate project_name
conda install tensorflow
conda deactivatewget
TODO
curl
TODO
grpcurl
TODO
wrk
bash
# 启动 2 个线程共同处理 100 个并发连接,压测 5 秒
wrk -t2 -c100 -d5s https://baidu.com
# 显示详细的延迟信息
wrk -t2 -c100 -d5s --latency https://baidu.comab
TODO
top
P按 CPU 使用率降序排序M按内存使用率排序T按进程运行时间排序k终止一个进程
htop
TODO
btop
TODO
df
- disk free
- 主要用于查看整个文件系统的磁盘使用情况,让你了解磁盘的整体容量和剩余空间。
df -h
dust
- 侧重于以直观的可视化方式展示指定目录下各个子目录和文件的磁盘使用情况,方便快速定位大文件和大目录。
dust /home/user/Documents
du
du(disk usage)用来查看文件或目录所占用的磁盘空间大小,是排查“空间去哪了”的工具
sh
# `~/.cache/` 目录下所有文件夹大小汇总,单位易读
du -sh ~/.cache/* | sort -h
du -sh ~/dev/* | sort -h # 很实用!
# 当前整个目录占用多大空间
du -sh .lsof
bash
# 查看占用端口的进程
lsof -i:1087nc
TODO
homebrew
sh
# 更新 Homebrew
brew update
# 升级所有已安装的软件包
brew upgrade
# 升级特定软件包
brew upgrade jq
# 列出所有安装的软件包
brew list --version
# 查看软件包信息
brew info jqnpm
TODO
asdf
sh
# 安装语言插件
asdf plugin add golang https://github.com/asdf-community/asdf-golang.git
# 安装特定版本
asdf install golang 1.22.6
# 应用于工作目录的版本
asdf set golang 1.22.6
# 应用于所有目录的默认版本
asdf set -u golang 1.22.6apt
新一代推荐命令,替代 apt-get,操作更简洁
yum
TODO
ssh
bash
ssh luca@192.168.10.70反向代理 + 远程翻墙
bash
# 本地机开启反向隧道
ssh -N -R 1087:127.0.0.1:1087 root@192.168.10.70
# 云主机配置代理
export http_proxy=http://127.0.0.1:1087 https_proxy=http://127.0.0.1:1087 all_proxy=socks5://127.0.0.1:1087
# 云主机取消代理
unset http_proxy https_proxy all_proxy no_proxyssh-keygen
bash
ssh-keygen -t rsa -b 4096 -C "luca@gmail.com"
# 清除旧服务器的指纹记录(~/.ssh/known_hosts),避免连不上
ssh-keygen -R 192.168.10.70ssh-copy-id
bash
ssh-copy-id luca@192.168.10.70scp
bash
# 上传文件
scp /local/source/file.txt luca@192.168.10.70:~/destination/
# 上传文件夹
scp -r /local/source luca@192.168.10.70:~/destination/
# 下载文件
scp luca@192.168.10.70:~/source/file.txt /local/destination/ffmpeg
bash
# 文件基本信息
ffmpeg -i input.mp4
# 播放视频
ffplay -i video.mp4
# 静音播放
ffplay -an input.mp4
# 仅播放音频
ffplay -vn input.mp4gdb
TODO
delve
TODO
bat
https://github.com/sharkdp/bat
平替 cat 命令
eza
平替 ls 命令
zoxide
平替 cd 命令
bash
brew install zoxide
# 使用 z 命令代替 cd
z projects终端快捷键
- 移动到行首:
C-a - 移动到行尾:
C-e - 删除光标前的一个单词:
C-w - 删除光标前的文本:
C-u - 删除光标后的文本:
C-k
nvim
通用
- 懒人包:https://www.lazyvim.org
- 字体:https://www.nerdfonts.com
- 主题:https://github.com/folke/tokyonight.nvim
- 语法高亮:https://github.com/nvim-treesitter/nvim-treesitter
- 标签页:https://github.com/akinsho/bufferline.nvim
- 状态栏:https://github.com/nvim-lualine/lualine.nvim
- 首页:https://github.com/nvimdev/dashboard-nvim
文本操作
- 撤销:
u - 回退:
C-R - d 删除
- y 复制
- d 删除
- x 剪切
- dw 删除字符
文件目录管理
https://github.com/nvim-tree/nvim-tree.lua
- 打开、关闭目录
<leader>e - 焦点切换 Ctrl + w
- 新建文件/目录 a
- 重命名文件/目录 r
- 剪切移动文件/目录 x
- 删除文件/目录 d
- 拷贝文件/目录 y
- 粘贴文件/目录 p
插件管理
https://github.com/folke/lazy.nvim
:Lazy:Lazy install:Lazy update:Lazy sync(相当于 install 和 update)
LSP
TODO
Telescope
https://github.com/nvim-telescope/telescope.nvim
<leader>f + f或:Telescope find_files查找文件<leader>f + g或:Telescope live_grep查找内容
文件内搜索
/<pattern>向下搜索模式?<pattern>向上搜索模式n下一个匹配项N上一个匹配项
Git
https://github.com/jesseduffield/lazygit
移动
单词移动:
- 替换单个字符:
r - w
- b
- e
- ge
行内移动:
- 0 行首
- ^ 行首非空字符
- $ 行尾
行间移动:
4j向下移动 4 行12k向上移动 12 行gg跳转到顶部G跳转到底部:50或50G跳转到第 50 行
可视模式移动:
- v 可视模式(字符选择)
- V 可视行模式(行选择),使用场景:拷贝/剪切/粘贴多行
- Ctrl+v 可视块模式(块选择),使用场景:添加/删除多行注释
- 块前缀插入:
Ctrl+v→ 多行 →Shift+i→ 输入 → Esc- 场景 1:批量添加注释
- 块前缀替换:
Ctrl+v→ 多行 →c→ 输入 → Esc- 场景 1:
git rebase -i合并 commit - 场景 2:批量删除注释
- 场景 1:
其它移动:
%在括号匹配之间跳转}移动到下一个段落的开头{移动到上一个段落的开头
分屏
- sh 代表水平分屏(Split Horizontally)
- sv 代表垂直分屏(Split Vertically)
- sc 关闭窗口 (Close)
- so 关闭其他 (Others)
- Alt + h/j/k/l 窗口之间跳转
<C-w>方向键光标切换
其它
- shift+k 查看类模块/函数文档
so %或source %wqa- Neovim 配置实战:从 0 到 1 打造自己的 IDE 掘金小册
- https://neovimcraft.com/
- Zero to IDE with LazyVim
- 2024 年 NeoVim Web 开发环境搭建
systemd
systemd 是现代 Linux 系统的启动大管家,用好 systemctl 和 unit 文件,你能精准控制服务、定时、启动流程、日志,全系统为你打工
.service 文件模版
service
[Unit]
Description=My App Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp --config /etc/myapp.conf
Restart=on-failure
User=www-data
WorkingDirectory=/usr/local/myapp
[Install]
WantedBy=multi-user.target常用命令
| 命令 | 作用 |
|---|---|
systemctl start foo.service | 启动服务(临时) |
systemctl stop foo.service | 停止服务 |
systemctl restart foo.service | 重启服务 |
systemctl reload foo.service | 重载配置 |
systemctl enable foo.service | 开机自启 |
systemctl disable foo.service | 禁止开机自启 |
systemctl status foo.service | 查看状态 |
systemctl is-enabled foo.service | 是否开机自启 |
systemctl list-units --type=service | 列出当前服务 |
journalctl -u foo.service | 看服务日志 |
systemctl daemon-reload | 配置文件改了要 reload 一下 |
systemd 服务启动流程图