Linux 学习笔记
1. 常用命令
1.1 文件管理
- CTRL+- C: 取消命令,并且换行
- CTRL+- U: 清空本行命令
- TAB: 补全命令和文件目录,快速双击,显示备选选项
- ls: 列出当前目录下所有文件及目录
- pwd: 显示当前完整路径
- cd XXX: 进入- XXX目录,- cd ..进入上一层目录
- cp A B: 将文件- A复制成- B,- A和- B可以是路径
- mkdir X: 创建目录- X
- rm XXX: 删除普通文件,- rm -r XXX删除文件夹
- mv A B: 将文件- A移动到- B,可用于重命名
- touch: 创建文件
- cat XXX: 显示文件- XXX中的内容
文件权限
- chmod- chmod +x xxx添加执行权限
- chmod -x xxx去除执行权限
- chmod 777 xxx设置 777 权限
- chmod 777 xxx -R给目录设置权限
 
1.2 系统状况
- top查看所有进程信息,(Linux 系统的任务管理器)- 打开后,输入 M:按使用内存排序(M = memory),大写
- 打开后,输入 P:按使用 CPU 排序(P = process)
- 打开后,输入 m:切换内存占用展示模式
- 打开后,输入 q:退出
 
- 打开后,输入 
- df -h查看硬盘使用情况
- free -h查看内存使用情况
- du -sh查看当前目录占用硬盘空间
- ps aux查看所有进程
- kill -9 pid杀死进程编号为- pid的进程,(结束运行)
- netstat -nt查看所有网络连接
- w列出当前登录用户
- ping www.baidu.comping 测试
1.3 文件检索
- find /path/to/directory/ -name '*.py'搜索某个路径下的所有 python 文件
- grep xxx从- stdin中读入若干行数据,如果某行包含- xxx输出该行
- wc统计行数、单词数、字节数- 既可以从 stdin中读入数据,也可以在命令行参数中传入文件名列表
- wc -l -w -c分别是统计行数(line)、单词数(word)、字节数(char)
 
- 既可以从 
- tree展示当前目录结构- tree /path/to/directory/
- tree -a展示隐藏文件
 
- ag xxx搜索当前目录下所有文件,检索- xxx字符串,需要安装- silversearcher-ag
- cut分割一行内容- 从 - stdin中读入多行数据
- echo $PATH | cut -d ':' -f 3,5输出- PATH中用- :分割的字符串的第三个和第五个,仍然保留- :间隔,相当于:- 1 
 2
 3
 4
 5
 6
 7- // javascript 
 const str = 'aaa:bbb:ccc:ddd:eee';
 const arr = str.split(':'); // 分割成数组
 const l = 3;
 const r = 5;
 const res1 = arr[l - 1] + ':' + arr[r - 1];
 console.log(res1); // ccc:ddd
- echo $PATH | cut -d ':' -f 3-5输出- PATH中用- :分割的字符串的第三个到第五个,仍然保留- :间隔,相当于:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- const str = 'aaa:bbb:ccc:ddd:eee'; 
 const arr = str.split(':');
 const l = 3;
 const r = 5;
 res2 = '';
 for (let i = l - 1; i < r; i++) {
 if (i === r - 1) {
 res2 += arr[i];
 } else {
 res2 += arr[i] + ':';
 }
 }
 console.log(res2); // ccc:ddd:eee
- echo $PATH | cut -c 3,5输出- $PATH的第三个和第五个字符,-c(char)
- echo $PATH | cut -c 3-5输出- $PATH的第三个到第五个字符,相当于:- 1 
 2
 3
 4
 5- const str = 'aaa:bbb:ccc:ddd:eee'; 
 const l = 3;
 const r = 5;
 // string.slice 方法,截取下标 l-1 至 r,但不包含 r
 console.log(str.slice(l - 1, r));
 
- sort将每行内容按字典序排列- 可以从 stdin中读取多行数据
- 可以从命令行参数中读取文件名列表
 
- 可以从 
- xargs将- stdin中的数据用空格或者回车分割成命令行参数,可以用于删除文件- 1 
 2
 3
 4
 5- find test/ -name '*.js' | xargs cat | wc -l # 查找 test/ 目录下的 js 文件,统计代码行数 
 这里代码行数会比真实行数少一行
 删除全部 js 文件
 find test/ -name '*.js' | xargs rm
1.4 查看文件内容
- more浏览文件内容- 回车:下一行
- 空格 | KeyDown:下一页
- b上一页
- q退出
 
- less与- more类似,功能更全面- 回车:下一行
- y上一行
- Page Down下一页
- Page Up上一页
- q退出
 
- head -3 XX展示 XX 的前三行内容- 支持从 - stdin读入内容
- tail -3 XX展示 XX 末尾三行内容- 支持从 - stdin读入内容
1.5 工具
- md5sum计算- md5哈希值- 可以从 stdin读入内容
- 可以从命令行参数传入文件名列表
 
- 可以从 
- time command统计- command命令执行时间
- ipython3交互式- python3环境,可以当做计算器,或者批量管理文件
- watch -n 0.1 command每- 0.1秒执行一次- command命令
- tar解压缩文件- -c创建压缩文件(create)
- -x解压(extract)
- -f指定归档(需要被压缩)的文件名,一般是命令最后的文件名
- -v显示操作过程(verbose)
- -t查看(list)压缩文件的内容而不解压
- -z使用- gzip压缩或者解压缩- .tar.gz文件
- -j使用- bzip2压缩或者解压缩- .tar.bz2文件
- -J使用- xz压缩或者解压- .tar.xz文件,==高压缩率==
- -C指定解压的目录
- --exclude在归档时拍出某个目录或者文件
 - 常用组合 - 创建 - .tar.gz压缩文件- 1 - tar -czvf archive.tar.gz /path/to/directory 
- 解压 - .tar.xz文件到指定目录- 1 - tar -xJvf archive.tar.xz -C /path/to/destination 
- 仅查看 - .tar文件内容- 1 - tar -tf archive.tar 
 
- diff XX YY查看文件- XX和- YY的不同点
1.6 管道 |
简单来说管道就是重定向,可以将前一个命令的 stdout 重定向到下一个命令的 stdin 。
注意事项
- 管道命令只对 stdout处理,不处理stderr
- 管道右边命令必须接受 stdin
- 多个管道可以串联
与文件重定向的区别
- 文件重定向:左边是命令,右边是文件
- 管道:左右两边都是命令,左边开启了 stdout,右边开启了stdin
示例
统计当前目录下所有 js 文件中行内包含字符串 const 的行数
| 1 | 合并 xargs grep,但是 xargs 必须在 grep 左边 | 
2. Vim 使用
2.1 三种模式
2.1.1 一般命令模式
默认模式,按 ESC 键进入一般命令模式,命令输入方式:按不同字符即可进行不同操作,可以复制、粘贴、删除等。
2.1.2 编辑模式
在一般命令模式下按 I 键进入编辑模式。
2.1.3 命令行模式
在一般命令模式下按 : 、/ 、? 三个按键中任意一个进入命令行模式,可以进行查找、替换、保存、退出、配置编辑器等。
2.2 操作
2.2.1 一般命令模式
- 0或者- HOME键,光标移动到当前行的第一个字符前
- $或者- END键,光标移动到当前行的最后一个字符前
- n<SPACE>输入数字加空格,光标将右移到光标当前位置的第 n 个字符后
- n<>ENTER输入数字加回车,光标将下移到光标当前行以下第 n 行第一个非空?字符前
- G键,光标移动到最后一行,区分大小写
- nG键,光标移动到第 n 行,区分大小写
- gg相当于- 1G,光标移动到第一行
- n键,用于命令行模式的查询,查询后按下- N键重复上一次查询,区分大小写
- N键,用于命令行模式的查询,查询后按下- N键反向重复上一次查询,区分大小写
- v键,选中文本,结合方向键及其他上述切换光标位置命令使用
- d键,删除选中的文本,删除时会自动复制删除的内容
- dd键,删除当前行,复制同上
- y键,复制选中的文本
- yy键,复制当前行
- p键,将复制的数据在光标的下一行或下一个位置粘贴
- u键,撤销
- CTRL + R,取消撤销,无懈可击
- >键,将选中的文本整体向右缩进一次
- <键,向左缩进
- gg=G,四个字符均需要输入,全文代码格式化
- CTRL + Q, 取消正在执行的命令
2.2.2 命令行模式
- :n,冒号+数字,同- nG,将光标移动到第 n 行
- /word,向光标以下查找第一个- word
- ?word,向光标以上查找第一个- word
- :n1,n2s/word1/word2/g,在第 n1 行与 n2 行之间寻找- word1并替换为- word2
- :1,$s/word1/word2/g,将全文的- word1替换为- word2
- :1,$s/word1/word2/gc,将全文的- word1替换为- word2,但替换前需要手动确认
- :w保存
- w!强制保存
- :q退出,常用
- :q!强制退出,常用
- :wq保存并退出,常用
- :set paste设置成粘贴模式,取消代码自动缩进
- :set nopaste取消粘贴模式,开启代码自动缩进
- :set nu显示行号
- :set nonu隐藏行号
- noh关闭查找关键词高亮
3 Shell 语法
3.1 概述
Linux 中常见的 Shell 脚本有很多种,包括:
- Bourne Shell /usr/bin/sh或者/bin/sh
- Boume Again Shell /bin/bash
- zsh
- ······
文件头部写明 #! /bin/bash 指定运行使用的解释器
执行方式:
- 赋予执行权限:chmod +x test.sh
- 相对路径运行 ./test.sh
- 绝对路径运行 /root/test.sh
- 家目录运行 ~/test.sh
- 解释器运行 bash ./test.sh
3.2 变量
3.2.1 注释
注释分为单行注释(行尾注释),多行注释
单行注释
| 1 | 单行注释 | 
多行注释,其中 EOF 可以成对用其他字符串替换
| 1 | :<<EOF # 冒号也可有可无 | 
3.2.2 变量
定义变量
定义变量不需要向 PHP 脚本一样使用 $ 符,注意等号两边不要有空格
变量名限制为常规限制(不能数字开头,不能是保留字等等)
| 1 | name='applepine' | 
使用变量
使用变量要用 $ 符,但最好包裹 {} ,识别变量边界
| 1 | name='applepine' | 
只读变量
使用 readonly 或者 declare 可以将变量设置只读属性
| 1 | name='applepine' | 
删除变量
使用 unset 删除变量
| 1 | name='applepine' | 
变量类型
- 自定义变量(局部变量):子进程无法访问 
- 环境变量(全局变量):子进程可以访问 
自定义变量改成环境变量:
| 1 | name='applepine' | 
环境变量改成自定义变量:
| 1 | export name | 
字符串
字符串可以不用引号,可以用单引号也可以用双引号
单引号的内容不做解析,双引号会解析内部变量
| 1 | name=applepine | 
获取字符串长度 #
| 1 | name=applepine | 
截取字符串
| 1 | name=applepine | 
文件参数变量
执行 shell 脚本时可以向脚本传递参数供脚本使用,$1 是第一个参数,$2 是第二个参数,依次类推。
$0 是执行脚本的文件路径,例如 ./test.sh /root/test.sh
| 1 | ! /bin/bash | 
相关参数
- $#参数个数,不算文件路径,只算传参个数
- $*用空格将各个参数分隔的字符串
- $@用双引号括起来的各个参数字符串
- $$脚本当前运行的进程 ID
- $?上一条命令的退出状态,0 为正常退出
- $(command) 返回 command这条命令的stdout,可以嵌套
- `command` 返回 command这条命令的stdout,不可嵌套
3.3 数组
3.3.1 数组基础
只支持一维数组,初始化不需要指明大小
定义数组
| 1 | array=(1 "def" applepine false) # 用小括号 空格分开 | 
读取数组
| 1 | 读取整个数组 三种均可以 | 
数组长度
| 1 | echo ${#array[@]} | 
3.4 基础命令
3.4.1 expr
expr 用于求表达式的值,expr 表达式
字符串表达式
- length STRING返回- STRING长度
- index STRING CHARSET返回字符串- CHARSET中任意一个字符在- STRING中首次出现的位置,下标从 1 开始,不存在返回 0
- substr STRING POSITION LENGTH返回- STRING字符串中从- POSITION开始,长度最大为- LENGTH的子串,如果- POSITION- LENGTH不是正整数或者不是数值将返回空字符串
| 1 | str="Hello World" | 
整数表达式
expr 支持基础算术表达式。过时了,现代 Shell 用 $(())
- +- -
- *- /- %乘法- *需要使用转义,或者单引号
- ()
- **幂
| 1 | a=3 | 
逻辑关系表达式
- |- 如果第一个参数非空且非 0,则返回第二个参数,否则返回第二个参数,但需要非空且非 0,否则返回 0,如果第一个参数非空且非 0,则不会计算第二个表达式 
- &- 如果两个参数都非空且非 0,则返回第一个参数,否则返回 0,如果第一个参数为 0 或 空,则不会计算第二个表达式 
- < <= == != >= >- 比较两端的参数,如果为 true 则返回 1,否则返回 0。 - expr首先尝试将两端参数转化为整数,并做算术比较,如果转化失败,按照字符集排列顺序比较
- ()- 可以改变优先级,需要反斜杠转义,或者使用单引号 
| 1 | a=3 | 
3.4.2 read
read 命令从标准输入中读取单行数据,当读到文件结束符时,exit code 为 1,否则为 0.
参数:
- -p后面接提示信息,部分- shell不支持,比如- zsh
- -t后面接秒数,等待时间
| 1 | root@applepine-work:~# read -p "输入用户名" -t 30 name | 
3.4.3 echo
echo 用于输出字符串,echo STRING
显示普通字符串
| 1 | echo "Hello World" | 
显示转义字符
| 1 | echo "\"Hello World\"" # "Hello World" | 
显示变量
| 1 | name=zhangsan | 
显示换行
| 1 | echo "Hi\nMike" | 
显示不换行 , 取消 echo 默认换行
| 1 | echo -e "Hello \c" # 最好开启转义,否则不同 shell 效果不一 | 
显示原样字符串,不解释变量和转义,单引号
| 1 | a=World | 
显示命令执行的结果
| 1 | echo `date` # Fri Oct 25 02:13:10 PM CST 2024 | 
3.4.4 printf
默认不会在字符串末尾加换行符 printf format-string [arguments]
| 1 | printf "%10d.\n" 123 # 10 位 右对齐 | 
| 1 | 123. | 
3.4.5 test 命令与判断符号[]
逻辑运算符 && 和 ||
- &&表示与,- ||表示或
- 二者具有短路原则: - expr1 && expr2当- expr1为假时直接忽略- expr2- expr1 || expr2当- expr1为真时直接忽略- expr2
- 表达式的 - exit code为 0, 表示真,为非 0, 表示假
test 命令
| 1 | ➜ ~ ls | 
- 文件类型判断 - test -e filename判断文件是否存在- -e文件是否存在
- -f是否是文件
- -d是否是目录
 
- 文件权限判断 - test -r filename判断是否可读- -r是否可读
- -w是否可写
- -x是否可执行
- -s是否为非空
 
- 整数间比较 - test ${a} -eq ${b}判断 a 是否等于 b- -eqa == b
- -nea != b
- -gta > b
- -lta < b
- -gea >= b
- -lea<= b
 
- 字符串比较 - test -z STRING判断是否为空,为空返回 true
- test -n STRING是否非空
- test str1 == str2是否相同
- test str1 != str2是否不同
 
- 多重条件判定 - test -r filename -a -x filename- -a两条件是否同时成立
- -o是否至少一个成立
- !取反,如- test ! -x test.sh不可执行时返回 true
 
判断符号
[] 与 test 用法几乎一致,更常用于 if 语句中,另外 [[]] 是 [] 的加强版,支持特性更多
| 1 | [2 -lt 3] # 为真,返回 0 | 
| 1 | ➜ ~ [ -e proxy.sh ] && echo "exist" || echo "Not exist" | 
注意事项:
- []中的每一项都要空格隔开
- []中的变量要用双引号括起来
- []中的常数用单引号或者双引号括起来
| 1 | root@applepine-work:~# str="apple pine" | 
3.4.6 exit 命令
exit 命令用来退出当前 shell 进程,并返回一个退出状态,使用 $? 可以接收这个退出状态。
exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为 0.
exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其他值都表示失败。
| 1 | ! /bin/bash | 
3.4.7 文件重定向
每一个进程默认打开了三个文件描述符:
- stdin标准输入,从命令行读入数据,文件描述符为 0
- stdout标准输出,向命令行输出数据,文件描述符为 1
- stderr标准错误输出,向命令行输出错误,文件描述符为 2
可以用文件重定向将这三个内容重定向到其他文件中
重定向命令
- command > file将- stdout重定向到- file,即写入- file中
- command < file将- stdin重定向到- file,即从- file中读入
- command >> file将- stdout以追加方式重定向到- file即向- file尾部写入数据
- command n> file将文件描述符- n重定向到- file中
- command n>> file将文件描述符以追加方式重定向到- file中
| 1 | echo -e "Hello World\nApplepine" > output.txt | 
同时重定向输入和输出
- test.js 文件 - 1 
 2
 3
 4
 5
 6- const str = 'aaa:bbb:ccc:ddd:eee'; 
 const arr = str.split(':');
 const l = 3;
 const r = 5;
 const res1 = arr[l - 1] + ':' + arr[r - 1];
 console.log(res1); // ccc:ddd
- 执行命令 - 1 
 2
 3
 4- 1 
 echo $(<test.js) > test1.js
 2
 echo "$(<test.js)" > test2.js
- 结果 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- // test1.js 
 const str = "aaa:bbb:ccc:ddd:eee" const arr = str.split(':') const l = 3 const r = 5 const res1 = arr[l - 1] + ":" + arr[r - 1] console.log(res1) // ccc:ddd
 // test2.js
 const str = "aaa:bbb:ccc:ddd:eee"
 const arr = str.split(':')
 const l = 3
 const r = 5
 const res1 = arr[l - 1] + ":" + arr[r - 1]
 console.log(res1) // ccc:ddd
逻辑: 总体逻辑是 $() 通过 < 读入 stdin ,echo 开启 stdout 通过 > 将内容重定向到 test1.js | test2.js ,但是两者有些许差异。前者写入到 test1.js 的内容没有换行符,后者原封不动的复制了 test.js 的内容到 test2.js ,这是 echo 的原因,如果没有用引号包裹变量或者命令替换结果,如 echo $(<test.js) ,echo 会将内容视为单个参数,将所有换行符当做空格处理,而 "" 的使用会告诉 echo 保留文本的原始格式,包括换行符。
3.4.8 include
bash 中可以引入外部文件
| 1 | . filename # 点和文件之间有空格 | 
示例
- 创建 - test1.sh- 1 
 2
 3- ! /bin/bash 
 name="applepine"
- 创建 - test2.sh- 1 
 2
 3
 4
 5- ! /bin/bash 
 source test1.sh
 echo "My name is: " ${name}
3.5 基础语句
3.5.1 判断语句
单层 if 形式
| 1 | if condition | 
| 1 | a=3 | 
单层 if-else 形式
| 1 | if condition | 
| 1 | a=7 | 
多层 if-elif-elif-else 形式
| 1 | if condition | 
| 1 | a=7 | 
case···esac 形式
| 1 | case ${变量名} in | 
3.5.2 循环语句
for…in…do…done 形式
| 1 | for var in val1 val2 val3 | 
示例 1,输出 a 2 “applepine”,不换行
| 1 | for i in a 2 "applepine" | 
示例 2,输出当前路径所有文件名
| 1 | for file in `ls` | 
示例 3,输出 1-10
| 1 | for i in $(seq 1 10) | 
示例 4,使用{1..10} 或者 {a..z}
| 1 | for i in {a..z} #是两个点 | 
for((…;…;…)) do …done 形式
| 1 | for ((expression; condition; expression)) | 
示例,输出 1-10
| 1 | for ((i=1; i<= 10; i++)) | 
while…do…done 形式
| 1 | while condition | 
示例,文件结束符为 CTRL + D,输入结束符后 read 指令返回 false
| 1 | while read name | 
until…do…done 形式
| 1 | until condition | 
| 1 | until [ "${word}" == "yes" ] || [ "${word}" == "YES" ] | 
break 命令
跳出==当前一层循环==
| 1 | while read name | 
continue 命令
跳出==当前一次循环==
| 1 | for ((i=1; i<=10; i++)) | 
3.5.3 函数
bash 中的函数类似于 C/C++ 中的函数,但 return 的返回值与 C/C++ 不同,返回的是 exit code,取值为 0-255,0 表示正常结束。
如果想获取函数的输出结果,可以通过 echo 输出到 stdout 中,然后通过 $(function_name) 来获取 stdout 中的结果。
函数的 return 值可以通过 $? 来获取。
| 1 | [function] func_name() { # function 关键字可以省略 | 
不获取 return 值和 stdout 值
| 1 | func() { | 
获取 return 值和 stdout 值
| 1 | func() { | 
函数的输入参数
在函数内, $1 表示第一个输入参数, $2 表示第二个输入参数,依次类推。
注意:函数的 $0 仍然为文件路径,而不是函数名。
| 1 | func() { | 
函数内的局部变量
可以在函数内定义局部变量,作用范围仅在该函数内部。
可以在递归函数中定义局部变量。
local 变量名=变量值
| 1 | ! /bin/bash | 
4. SSH
4.1 远程登录
4.1.1 登录服务器
| 1 | ssh user@hostname -p port | 
第一次登录会提示:
| 1 | The authenticity of host '123.57.47.211 (123.57.47.211)' can't be established. | 
输入 yes 回车后,服务器信息会保存在 ~/.ssh/know_hosts 文件中,然后输入密码即可登录
4.1.2 配置文件
创建文件 ~/.ssh/config 写入:
| 1 | Host myserver1 | 
之后再使用服务器,可以直接通过 myserver1 连接服务器
4.1.3 配置密钥登录
- 创建密钥 - 1 - ssh-keygen -t rsa -f "~/.ssh/id_rsa" -C "备注信息,可以是邮箱" - -t密钥类型,可选- dsa、- ecdsa、- ed25519、- rsa
- -f密钥文件位置,目录默认是- ~/.ssh/文件默认是- id_rsa
- -C备注信息
 
- 免密登录 - 将==公钥==上传到服务器 - 1 - ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@127.0.0.1 
- 执行命令 - 1 
 2
 3- ssh user@hostname command 
 ssh myserver 'for ((i=0; i<10; i++)) do echo ${i}; done'
4.2 scp 命令
scp 用于传送文件,将 文件 source 下的文件复制到 destination 中
| 1 | scp source destination | 
复制文件夹
| 1 | scp -r ~/tmp myserver:/home/acs # 将 tmp 目录传到 /home/acs 下即 /home/acs/tmp | 
批量复制文件夹下的文件(夹):
| 1 | scp -r ~/tmp/* myserver:/home/acs | 
5. Git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
5.1 基本概念
- 工作区:仓库的目录,工作区是独立于各个分支的。
- 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区,暂存区是独立于各个分支的。
- 版本库,存放所有已经提交到本地仓库的代码版本。
- 版本结构:树结构,树中没一个节点代表一个代码版本。
5.1 基础命令
- git config --global user.name xxx:设置全局用户名,信息记录在- ~/.gitconfig文件中
- git config --global user.email xxx@xxx.com:设置全局邮件地址
- git init:将当前目录配置成 git 仓库,信息记录在隐藏的- .git文件夹中
- git add xx:将 xx 添加到暂存区- git add .: 将所有待加入暂存区的文件加入暂存区
- git rm --cached xx: 将文件从仓库索引目录中删除
- git commit -m "备注信息": 将暂存区的内容提交到当前分支
- git status: 查看仓库状态
- git diff xx: 查看 xx 文件相对于暂存区修改了哪些内容
- git log: 查看当前分支所有版本
- git relog: 查看 HEAD 指针的移动历史(包括被回滚的版本)
- git reset --hard HEAD^或者- git reset --hard HEAD~: 将代码库回滚到上个版本- git reset --hard HEAD^^: 回滚两次,以此类推
- git reset --hard HEAD~100: 回滚一百次
- git reset --hard 版本号: 回滚到特定版本
 
- git checkout - xx或者- git restore xx: 将 xx 文件尚未加入暂存区的修改全部撤销
- git remote add origin git@xxx:xxx/xxx.git: 将本地仓库关联到远程仓库
- git push -u (第一次需要 -u 以后不需要): 将当前分支推送到远程仓库- git push origin branch_name: 将本地某个分支推送到远程仓库
 
- git clone git@xxx:xxx/xxx.git: 将远程仓库下载到当前目录下
- git checkout -b branch_name: 创建并切换到- branch_name分支下
- git branch: 查看所有分支和当前所处分支
- git checkout branch_name: 切换到- branch_name这个分支
- git merge branch_name: 将分支- branch_name合并到当前分支上
- git branch -d branch_name: 删除本地仓库- branch_name分支
- git branch branch_name: 创建新分支
- git push --set-upstream origin branch_name: 设置本地- branch_name分支对应的远程仓库的- branch_name分支
- git push -d origin branch_name: 删除远程仓库的 branch_name 分支
- git pull: 将远程仓库的当前分支与本地仓库的当前分支合并- git pull origin branch_name: 将远程仓库的- branch_name分支与本地仓库的当前分支合并
- git branch --set-upstream-to=origin/branch_name1 branch_name2: 将远程的- branch_name1分支与本地的- branch_name2分支对应
- git checkout -t origin/branch_name: 将远程- branch_name分支拉取到本地
- git stash: 将工作区和暂存区中尚未提交的修改存入栈中
- git stash apply: 将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
- git stash drop: 删除栈顶存储的修改
- git stash pop: 将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
- git stash list: 查看栈中的所有元素
5.2 常用命令
- git init初始化
- git config --global user.name xxx- git config --global user.email xxx全局用户信息
- git remote add origin xxx@xxx:xxx/xxx.git添加远程仓库
- git add .- git add $file加入暂存区
- git commit -m "备注"加入本地分支
- git status仓库状态
- git log查看当前仓库所有版本
- git push -u origin master推送到远程 master 分支
- git push -d origin master删除远程 master 分支
- git clone xxx@xxx:xxx/XX.git克隆远程仓库到本地
- git branch查看所有分支和当前分支
5.3 查看命令
- git diff XX查看 XX 文件相对与暂存区修改了哪些内容
- git status查看仓库状态
- git log查看当前分支所有版本
- git log --pretty=oneline用一行来显示
- git reflog查看 HEAD 指针的移动历史
- git branch查看所有分支和当前分支
5.4 删除命令
- git rm --cached XX将文件从仓库索引目录中删掉,不希望管理这个文件
- git restore --staged XX将 XX 从暂存区删除
- git checkout - XX或者- git restore XX将 XX 尚未加入暂存区的修改全部撤销
5.5 代码回滚
- git reset --hard HEAD^或者- git reset --hard HEAD~将代码回滚到上一个版本
- git reset --hard HEAD^^回滚两次,依次类推
- git reset --hard HEAD~100回滚一百次
- git reset --hard 版本号回滚到指定版本
5.6 远程仓库
- git remote add origin xxx@xxx:xxx/XX.git将本地仓库关联到远程仓库
- git push -u origin master将 master 分支推送
- git push -u推送当前分支
- git clone xxx@xxx:xxx/XX.git克隆远程仓库到本地
- git push --set-upstream origin branch_name设置本地的- branch_name对应到远程仓库的- branch_name
- git push -d origin master删除远程仓库的 master 分支
- git checkout -t origin/master将远程仓库 master 拉取到本地
- git pull将远程仓库当前分支与本地仓库当前分支合并
- git pull origin master将远程仓库 master 分支与本地仓库当前分支合并
- git branch --set-upstream-to=origin/branch_name1 branch_name2将远程的- branch_name1与本地- branch_name2对应
5.7 分支相关
- git branch查看所有分支和当前分支
- git branch dev创建新分支- dev
- git checkout -b dev创建并切换到分支- dev
- git checkout dev切换到分支- dev
- git merge branch_name将分支- branch_name与当前所在分支(- git branch)合并
- git branch -d branch_name删除本地分支
- git branch --set-upstream-to=origin/branch_name1 branch_name2将远程的- branch_name1与本地- branch_name2对应
- git push -d origin master删除远程 master 分支
- git push --set-upstream origin branch_name设置本地- branch_name分支对应远程同名分支
- git pull拉取远程仓库当前分支合并
- git pull origin branch_name将远程- branch_name分支与本地当前分支合并
5.8 stash 暂存
- git stash将工作区和暂存区尚未提交的修改存入栈中
- git stash apply将栈顶存储的修改恢复到当前分支,不删除栈顶
- git stash pop将栈顶存储的修改恢复到当前分支,删除栈顶
- git stash drop删除栈顶
- git stash list查看栈中所有元素
6. 环境变量
6.1 概念
Linux 系统中有很多环境变量来记录配置信息,环境变量类似于全局变量,可以被各个进程访问,可通过修改环境变量来修改系统配置。
6.1 查看环境变量
- env查看当前用户的变量
- set显示当前 shell 的变量,包括当前用户的变量
- export显示当前导出成用户变量的 shell 变量
- echo $PATH输出某个环境变量的值
6.2 修改环境变量
7. 五花八门的软件
7.1 第一个当然非 Docker 莫属啦
7.1.1 添加用户组
为了避免每次使用 docker 命令都需要加上 sudo 权限,可以将当前用户加入安装中自动创建的 docker 用户组
| 1 | sudo usermod -aG docker $USER | 
7.1.2 镜像 (image)
- docker pull ubuntu:22.04拉取镜像
- docker images列出本地所有镜像
- docker image rm ubuntu:22.04或者- docker rmi ubuntu:22.04删除镜像
- docker [container] commit CONTAINER IMAGE_NAME:TAG创建某个- container对象
- docker save -o ubuntu_22_04.tar ubuntu:22.04将镜像导出到本地压缩文件中
- docker load -i ubuntu_22_04.tar将镜像- ubuntu:22.04从压缩文件- ubuntu_22_04.tar中加载出来
7.1.3 容器(container)
- docker [container] create -it ubuntu:22.04利用镜像创建容器
- docker ps -a查看本地所有容器
- docker [container] start CONTAINER启动容器
- docker [container] stop CONTAINER停止容器
- docker [container] reatart CONTAINER重启容器
- docker [container] run -itd ubuntu:22.04创建并启动容器
- docker [container] attach CONTAINER进入容器- 先按 - CTRL + p再按- CTRL + q可以挂起容器
- docker [container] exec CONTAINER COMMAND在容器中执行命令
- docker [container] rm CONTAINER删除容器
- docker container prune删除所有停止的容器
- docker export -o xxx.tar CONTAINER将容器导出到本地压缩文件中
- docker import xxx.tar image_name:tag将本地压缩文件导入成镜像并将镜像命名为- image_name:tag
- docker export/import与- docker save/load的区别:- export/import会丢弃历史记录和元数据信息,仅保存容器当时快照
- save/load会保存完整记录,体积较大
 
- docker top CONTAINER查看某个容器所有进程
- docker stats查看所有容器统计信息,包括 CPU、内存、储存、网络等
- docker cp xxx CONTAINER:xxx或者- docker cp CONTAINER:xxx xxx在本地和容器间复制文件
- docker rename CONTAINER1 CONTAINER2重命名容器
- docker update CONTAINER --memory 500MB修改容器限制
实践
| 1 | 0 | 
