AcWing & Linux
基于
AcWing Linux基础课的irai个人笔记记录上课地址(需要有课程权限):https://www.acwing.com/activity/content/57/
一、常用文件管理命令
ctrl + c: 取消命令,并且换行ctrl + u:清空本行命令tab 键:可以补全命令和文件名,如果补全不了快速按两下tab键, 可以显示备选选项↑: 前一条历史执行命令↓: 后一条历史执行命令history:显示所有历史执行命令ls:列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件pwd:显示当前路径cd XXX: 进入XXX目录下cd ..为返回上一级目录cd -返回上一个工作目录(前一个待过的)cd /切换到系统根目录cd ~切换到用户主目录
cp XXX YYY: 将XXX文件复制成YYY,XXX和YYY可以是一个路径,(cp=复制 + 粘贴 + 重命名)关于路径比如
../dir_c/a.txt,表示上层目录下的dir_c文件夹下的文件a.txtmkdir XXX:创建目录XXXrm XXX: 删除普通文件 ;rm XXX -r:( 递归 ) 删除文件夹mv XXX YYY:将XXX文件移动到YYY,和cp命令一样,XXX和YYY可以是一个路径;重命名也是用这个命令; (
mv=剪切 + 粘贴 + 重命名)touch XXX:创建一个文件cat XXX:展示文件XXX中的内容 (适合展示比较小的文件,长文件会一下输出全部一下刷屏)复制文本:
Windows / Linux 下:Ctrl + insertMac 下:command + c
粘贴文本:
Windows / Linux 下:Shift + insertMac 下:command + v
二、tmux
tmux是一个终端复用器,它允许你在单个终端窗口中创建多个会话、窗口和窗格,从而提高工作效率- 功能:
- 分屏
- 允许断开
Terminal连接后,继续运行进程。
- 结构:
一个 tmux 可以包含多个 session,
一个 session 可以包含多个 window,
一个 window 可以包含多个 pane。
实例:
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2
...📌 后面的操作基于这个配置:
tmux的配置文件是~/.tmux.conf,可以在这个文件中自定义快捷键、主题、布局等。- 例如,可以通过以下配置将前缀键从
Ctrl + b改为Ctrl + a:
unbind C-b
set -g prefix C-a
bind C-a send-prefix- 后面全部操作的前缀键都是
Ctrl + a!
tmux: 新建一个 session ,其中包含一个 window,window 中包含一个pane ,pane 里打开了一个 shell 对话框。按下前缀键
Ctrl + a后手指松开,然后按%: 将当前 pane 左右平分成两个 pane按下前缀键
Ctrl + a后手指松开, 然后按": 将当前 pane 上下平分成两个 paneCtrl + d: 关闭当前 pane ; 当前 window 的所有 pane 均已关闭,则会自动关闭 window如果当前 session 的所有 window 均已关闭,则自动关闭 session 。
按下
Ctrl + a后手指松开, 然后按方向键 :选择相邻的 pane鼠标拖动 pane 之间的分割线, 可以调整分割线的位置
按住
Ctrl + a后手指松开,然后按d:挂起当前 sessiontmux a: 打开之前挂起的 session按下
Ctrl + a后手指松开,然后按s:选择其它 session- 方向键
↑:选择上一项 session/window/pane - 方向键
↓:选择下一项 session/window/pane - 方向键
→:展开当前项 session/window - 方向键
←:闭合当前项 session/window
- 方向键
按下
Ctrl + a后手指松开,然后按c:在当前 session 中创建 (create) 一个新的 window按下
Ctrl + a后手指松开, 然后按w: 选择其它 window, 操作方法与Ctrl + a然后s相同按下
Ctrl + a后手指松开,然后按PageUp/PageDown: 翻阅当前 pane 内的内容鼠标滚轮:翻阅当前 pane 内的内容
在 tmux 中选中文本时,需要按住
shift键。(仅支持 Windows 和 Linux ,不支持 Mac )tmux 中 复制 / 粘贴 文本的通用方式:
- 按下
Ctrl + a后松开手指,然后按[ - 用鼠标选中文本,被选中的文本会被自动复制到 tmux 的剪贴板
- 按下
Ctrl + a后松开手指,然后按],会将剪贴板中的内容粘贴到光标处
- 按下
在
tmux里,把当前窗格(pane)临时放大到全屏再还原的操作是:
| 动作 | 按键 |
|---|---|
全屏当前 pane | (前缀键) Ctrl + a 松开然后按 z (zoom) |
| 撤销全屏 | 再按一次 Ctrl + a 松开然后按 z (zoom) |
说明:这是一个 “ 临时缩放 ” , 不会破坏原有窗口的布局;再次按一次就可以原样恢复
三、vim
- 功能:
- 命令行模式下的文本编辑器
- 根据文件的扩展名自动判别编程语言。支持代码缩进、代码高亮等功能
- 使用方式 :
vim filename- 如果已有该文件,则打开它
- 如果没有该文件,则打开一个新的文件,并命名为
filename
模式:
1). 一般命令模式:
默认模式。 命令输入方式:类似于打游戏放技能,按不同字符,即可进行不同操作。
可以复制、粘贴、删除文本等 ...
2). 编辑模式:
- 在一般命令模式里按下
i, 会进入编辑模式。 - 按下
ESC会退出编辑模式,返回到一般命令模式。
- 在一般命令模式里按下
3). 命令行模式
在一般命令模式里按下
:/?三个字母中任意一个,会进入命令行模式。命令行在最下面。可以查找、替换、保存、退出、配置编辑器等 ...
- 常用操作:
i: 进入编辑模式ESC: 进入一般命令模式h或 左箭头键←:光标向左移动一个字符j或 向下箭头↓:光标向下移动一个字符k或 向上箭头↑:光标向上移动一个字符l或向右箭头→: 光标向右移动一个字符n<Space>:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符0或功能键[Home]: 光标移动到本行开头$或功能键[End]: 光标移动到本行末尾G: 光标移动到最后一行:n或nG:n为数字,光标移动到第n行gg:光标移动到第一行,相当于1Gn<Enter>:n为数字,光标向下移动n行/word:向光标之下寻找第一个值为word的字符串?word:向光标之上寻找第一个值为word的字符串n:重复前一个查找操作N:反向重复前一个查找操作:n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为
word2:1,$s/word1/word2/g: 将全文的word1替换为word2:1,$s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认。v:选中文本d:删除选中的文本ggdG:删除全部文本dd:删除当前行y:复制选中的文本yy:复制当前行p:将复制的数据在光标的 下一行 / 下一个位置 粘贴u:撤销Ctrl + r:取消撤销大于号 >:将选中的文本整体向右缩进一次小于号 <:将选中的文本整体向左缩进一次:w:保存:w!:强制保存:q:退出:q!:强制退出:wq:保存并退出:set paste:设置成粘贴模式,取消代码自动缩进:set nopaste:取消粘贴模式,开启代码自动缩进:set nu:显示行号:set nonu:隐藏行号gg=G:将全文代码格式化:noh:关闭查找关键词高亮Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
异常处理:
每次用
vim编辑文件时,会自动创建一个.filename.swp的临时文件。如果打开某个文件时,该文件的
swp文件已存在,则会报错。此时解决办法有两种: (1) 找到正在打开该文件的程序,并退出
(2) 直接删掉该
swp文件即可
四、shell 语法
4.1 概论
📌 什么是
Shell?Shell是一个命令解释器,它接收用户输入的命令,调用操作系统内核执行,并返回结果。简单来说:“
shell是我们通过命令行与操作系统沟通的语言。”shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。AC Terminal中的命令行可以看成是一个 “shell脚本在逐行执行 ”。
- 常见
shell类型:
Shell 类型 | 说明 | shebang 路径 |
|---|---|---|
bash ( Bourne Again Shell ) | 最常用,Linux 默认 | /bin/bash |
sh ( Bourne Shell ) | 早期标准,兼容性好 | /usr/bin/sh 或 /bin/sh |
zsh | 功能强大,支持插件 | /bin/zsh |
csh / tcsh | C 风格语法,较少用 | /usr/bin/csh |
📌 shengbang 是什么 ?
Shebang(也称为Hashbang)是一个由井号和叹号开头的字符序列#!,后面接上解释器路径, 用于告诉操作系统这个脚本应该由哪个 解释器 来执行。
例如:
#! /bin/bash当我们加上
shebang, 在想运行这个脚本文件的时候就可以用./文件名的方式(需要是可执行文件),操作系统会自动去调用解释器来执行这个脚本文件。而如果没有
shebang则是bash 文件名这种方式
Linux系统中一般默认使用bash,所以后面讲解bash中的语法。
- 学习技巧:不要死记硬背,遇到含糊不清的地方,可以在
AC Terminal里实际运行一遍。
- 脚本示例:新建一个
test.sh文件,内容如下:
#! /bin/bash
echo "Hello World!"- 运行方式:
- 作为可执行文件,具有
shebang
- 作为可执行文件,具有
acs@9e0ebfcd82d7:~$ chmod +x test.sh # 使脚本具有可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh # 当前路径下执行
Hello World! # 脚本输出
acs@9e0ebfcd82d7:~$ /home/acs/test.sh # 绝对路径下执行
Hello World! # 脚本输出
acs@9e0ebfcd82d7:~$ ~/test.sh # 家目录路径下执行
Hello World! # 脚本输出- 手动指定解释器运行 (解释器执行不需要有可执行权限)
acs@9e0ebfcd82d7:~$ bash test.sh
Hello World! # 脚本输出4.2 注释
- 单行注释:每行中
#之后的内容均是注释。
# 这是一行注释
echo 'Hello World' # 这也是注释多行注释:
格式:
:<<EOF
第一行注释
第二行注释
第三行注释
EOF- 其中
EOF可以换成其它任意字符串。例如:
:<<abc
第一行注释
第二行注释
第三行注释
abc
:<<!
第一行注释
第二行注释
第三行注释
!4.3 变量
- 定义变量:不需要添加
$符号 , 例如
name1='irai' # 单引号定义字符串
name2="irai" # 双引号定义字符串
name3=irai # 也可以不加引号,同样表示字符串📌 注意点:定义变量时,等号两边不能有空格!!!
使用变量:
需要加上
$,或者${}。花括号是可选的,主要是为了帮助解释器识别变量边界
name=irai
echo $irai # 输出irai
echo ${irai} # 输出irai
echo ${name}only # 输出iraionly- 只读变量:
- 使用
readonly或者declare可以将变量变为只读
name=irai
readonly name
declare -r name # 两种写法均可
name=abc # 会报错,因为此时name只读type + 命令可以解释该命令的来源(内嵌命令。第三方命令等)
acs@a3330f1d2061:~$ type readonly
readonly is a shell builtin
acs@a3330f1d2061:~$ type expr
expr is /usr/bin/expr- 删除变量:
unset可以删除变量 (被声明为只读的变量无法被unset删除)
name=irai
unset name
echo $name # 输出空行变量类型:
- 自定义变量(局部变量):子进程不能访问的变量
- 环境变量(全局变量):子进程可以访问的变量
自定义变量改成环境变量:
acs@9e0ebfcd82d7:~$ name=irai # 定义变量
acs@9e0ebfcd82d7:~$ export name # 第一种方法
acs@9e0ebfcd82d7:~$ declare -x name # 第二种方法- 环境变量改为自定义变量:
acs@9e0ebfcd82d7:~$ export name=irai # 定义环境变量
acs@9e0ebfcd82d7:~$ declare +x name # 改为自定义变量4.4 字符串
- 字符串可以用单引号,也可以用双引号,也可以不用引号
- 单引号和双引号的区别:
- 单引号中的内容会原样输出,不会执行,不会取变量;
- 双引号中的内容可以执行,可以取变量;
name=irai # 不用引号
echo 'hello, $name \"hh\"' # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\"" # 双引号字符串,输出 hello, irai "hh"- 获取字符串长度:
name="irai"
echo ${#name} # 输出4- 提取子串:
name="hello, irai"
echo ${name:0:5} # 提取从0开始的5个字符4.5 默认变量
文件参数变量:
在执行
shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,
$0是文件名(包含路径)。需要注意的是,如果参数超过个位数,比如 10,那么就需要大括号告诉范围
${10}
例如:
创建文件
test.sh:
#! /bin/bash
echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4- 然后执行该脚本:
acs@9e0ebfcd82d7:~$ chmod +x test.sh
acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4- 其它参数相关变量:
| 参数 | 说明 |
|---|---|
$# | 代表文件传入的参数个数,例如上例中值为 4 |
$* | 由所有参数构成的用空格隔开的字符串,如上例中值为 "$1 $2 $3 $4" |
$@ | 每个参数分别用双引号括起来的字符串,如上例中值为 "$1" "$2" "$3" "$4" |
$$ | 脚本当前运行的进程 ID |
$? | 上一条命令的退出状态(注意不是 stdout 而是 exit code) 0 是正常退出,其它值表错误 |
$(command) | 返回 command 这条命令的 stdout (可嵌套) |
`command` | 返回 command 这条命令的 stdout (不可嵌套) |
4.6 数组
五、SSH
5.1 ssh 登录
5.1.1 基本用法
- 远程登录服务器:
ssh user@hostnameuser:用户名hostname:IP地址 或 域名
- 第一次登录的时候会提示:
The authenticity of host '123.57.47.211 (123.57.47.211)' can't be established.
ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?输入
yes,然后回车即可。这样会将该服务器的信息记录在
~/.ssh/known_hosts文件中。然后输入密码即可登录到远程服务器中。
ssh默认登录端口号为22。如果想登录某一特定端口:
ssh user@hostname -p 225.1.2 配置文件
- 创建文件
~/.ssh/config - 然后在文件中输入:
Host myserver1
HostName IP地址或域名
User 用户名
Host myserver2
HostName IP地址或域名
User 用户名ssh user@hostname- 之后再使用服务器时,上面那一串就可以直接使用别名
myserver1、myserver2如下:
ssh myserver15.1.3 密钥登录
- 创建密钥:
ssh-keygen然后一直回车即可。
执行结束后,
~/.ssh/目录下会多两个文件:id_rsa:私钥id_rsa.pub:公钥
之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。
例如,想免密登录
myserver服务器。则将公钥中的内容,复制到
myserver中的~/.ssh/authorized_keys文件里即可。
- 也可以使用如下命令一键添加公钥:
ssh-copy-id myserver5.1.4 执行命令
- 命令格式:( 效果 :把
command传给ssh的服务器运行然后stdout重定向回本地服务器输出)
ssh user@hostname command- 例如:
ssh user@hostname ls -a- 或者:
# 单引号中的 $i 传过去的是echo $i, 所以可以正常在对方服务器求值
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'- 或者:
# 双引号中的 $i 是在本地服务器进行展开了
# 其次,变量 i 在本地是没有的,for循环那个i是存在于ssh的那个服务器的bash进程里
# 所以在本地展开 "echo $i" 且没有 i 变量,就会变成 "echo "
ssh myserver "for ((i = 0; i < 10; i ++ )) do echo $i; done"5.2 scp 传文件
- 命令格式:将
source路径下的文件复制到destination中
scp source destination- 一次复制多个文件:
scp source1 source2 destination- 复制文件夹:(将本地家目录的
tmp文件夹复制到myserver服务器中的/home/acs/目录下)
scp -r ~/tem myserver:/home/acs/( 递归
-rrecusion)
- 将本地家目录中的
tmp文件夹复制到myserver服务器中的~/homework/目录下
scp -r ~/tmp myserver:homework/- 将
myserver服务器中的~/homework/文件夹复制到本地当前路径下
scp -r myserver:homework .- 指定服务器的端口号:(
ssh默认端口号是22)
scp -P 22 source1 source2 destination- 注意:
scp的-r -P等参数一定要加在source和destination之前
- 使用
scp配置其他服务器的vim和tmux
scp ~/.vimrc ~/.tmux.conf myserver:六、git
acwing代码托管平台 : https://git.acwing.com
6.1 基本概念
工作区:仓库的目录。工作区是独立于各个分支的。
暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
版本库:存放所有已经提交到本地仓库的代码版本
版本结构:树结构,树中每个节点代表一个代码版本。
6.2 git 常用命令
git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中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 reflog:查看HEAD指针的移动历史(包括被回滚的版本)git reset --hard HEAD^或git reset --hard HEAD~:将代码库回滚到上一个版本git reset --hard HEAD^^:往上回滚两次,以此类推git reset --hard HEAD~100:往上回滚100个版本git reset --hard 版本号:回滚到某一特定版本git checkout — XX或git restore XX:将 XX 文件尚未加入暂存区的修改全部撤销git remote add origin git@git.acwing.com:xxx/XXX.git:将本地仓库关联到远程仓库git push -u (第一次需要 -u 以后不需要):将当前分支推送到远程仓库git push origin branch_name:将本地的某个分支推送到远程仓库git clone git@git.acwing.com:xxx/XXX.git:将远程仓库 XXX 下载到当前目录下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:查看栈中所有元素
