Skip to content

AcWing & Linux



一、常用文件管理命令


  • ctrl + c : 取消命令,并且换行

  • ctrl + u :清空本行命令

  • tab 键 :可以补全命令和文件名,如果补全不了快速按两下 tab 键, 可以显示备选选项

  • : 前一条历史执行命令

  • : 后一条历史执行命令

  • history :显示所有历史执行命令

  • ls :列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件

  • pwd :显示当前路径

  • cd XXX : 进入 XXX 目录下

    • cd .. 为返回上一级目录
    • cd - 返回上一个工作目录(前一个待过的)
    • cd / 切换到系统根目录
    • cd ~ 切换到用户主目录
  • cp XXX YYY : 将 XXX 文件复制成 YYYXXXYYY 可以是一个路径,(cp = 复制 + 粘贴 + 重命名

    关于路径比如 ../dir_c/a.txt,表示上层目录下的 dir_c 文件夹下的文件 a.txt

  • mkdir XXX :创建目录 XXX

  • rm XXX : 删除普通文件 ; rm XXX -r :( 递归 ) 删除文件夹

  • mv XXX YYY :将 XXX 文件移动到 YYY ,和 cp 命令一样,XXXYYY 可以是一个路径;

    重命名也是用这个命令; (mv = 剪切 + 粘贴 + 重命名

  • touch XXX :创建一个文件

  • cat XXX :展示文件XXX 中的内容 (适合展示比较小的文件,长文件会一下输出全部一下刷屏)

  • 复制文本:

    • Windows / Linux 下Ctrl + insert
    • Mac 下command + c
  • 粘贴文本:

    • Windows / Linux 下Shift + insert
    • Mac 下command + v

二、tmux


  • tmux 是一个终端复用器,它允许你在单个终端窗口中创建多个会话、窗口和窗格,从而提高工作效率
  • 功能:
    • 分屏
    • 允许断开 Terminal 连接后,继续运行进程。
  • 结构:

一个 tmux 可以包含多个 session,

一个 session 可以包含多个 window,

一个 window 可以包含多个 pane。

shell
实例:
        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
shell
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 上下平分成两个 pane

  • Ctrl + d : 关闭当前 pane ; 当前 window 的所有 pane 均已关闭,则会自动关闭 window

    如果当前 session 的所有 window 均已关闭,则自动关闭 session 。

  • 按下 Ctrl + a 后手指松开, 然后按方向键 :选择相邻的 pane

  • 鼠标拖动 pane 之间的分割线, 可以调整分割线的位置

  • 按住 Ctrl + a 后手指松开,然后按 d :挂起当前 session

  • tmux 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 : 光标移动到最后一行

    • :nnG : n 为数字,光标移动到第 n

    • gg :光标移动到第一行,相当于 1G

    • n<Enter> : n 为数字,光标向下移动 n

    • /word :向光标之下寻找第一个值为 word 的字符串

    • ?word :向光标之上寻找第一个值为 word 的字符串

    • n :重复前一个查找操作

    • N :反向重复前一个查找操作

    • :n1,n2s/word1/word2/gn1n2 为数字,在第 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 / tcshC 风格语法,较少用/usr/bin/csh

📌 shengbang 是什么 ?

  • Shebang(也称为 Hashbang)是一个由井号和叹号开头的字符序列 #!

    后面接上解释器路径, 用于告诉操作系统这个脚本应该由哪个 解释器 来执行。

  • 例如:

txt
#! /bin/bash
  • 当我们加上 shebang , 在想运行这个脚本文件的时候就可以用 ./文件名 的方式(需要是可执行文件),

    操作系统会自动去调用解释器来执行这个脚本文件。而如果没有 shebang 则是 bash 文件名 这种方式


  • Linux 系统中一般默认使用 bash,所以后面讲解 bash 中的语法。

  • 学习技巧:不要死记硬背,遇到含糊不清的地方,可以在 AC Terminal 里实际运行一遍。

  • 脚本示例:新建一个 test.sh 文件,内容如下:
shell
#! /bin/bash
echo "Hello World!"

  • 运行方式:
    1. 作为可执行文件,具有 shebang
shell
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!  # 脚本输出
    1. 手动指定解释器运行 (解释器执行不需要有可执行权限)
shell
acs@9e0ebfcd82d7:~$ bash test.sh
Hello World!  # 脚本输出

4.2 注释


  • 单行注释:每行中 # 之后的内容均是注释。
shell
# 这是一行注释

echo 'Hello World'  #  这也是注释

  • 多行注释:

  • 格式:

shell
:<<EOF
第一行注释
第二行注释
第三行注释
EOF
  • 其中 EOF 可以换成其它任意字符串。例如:
shell
:<<abc
第一行注释
第二行注释
第三行注释
abc

:<<!
第一行注释
第二行注释
第三行注释
!

4.3 变量


  • 定义变量:不需要添加 $ 符号 , 例如
shell
name1='irai'  # 单引号定义字符串
name2="irai"  # 双引号定义字符串
name3=irai    # 也可以不加引号,同样表示字符串

📌 注意点:定义变量时,等号两边不能有空格!!!


  • 使用变量:

  • 需要加上 $ ,或者 ${} 。花括号是可选的,主要是为了帮助解释器识别变量边界

shell
name=irai
echo $irai  # 输出irai
echo ${irai}  # 输出irai
echo ${name}only  # 输出iraionly

  • 只读变量:
  • 使用 readonly 或者 declare 可以将变量变为只读
shell
name=irai

readonly name
declare -r name  # 两种写法均可

name=abc  # 会报错,因为此时name只读

  • type + 命令 可以解释该命令的来源(内嵌命令。第三方命令等)
shell
acs@a3330f1d2061:~$ type readonly
readonly is a shell builtin
acs@a3330f1d2061:~$ type expr
expr is /usr/bin/expr

  • 删除变量:unset 可以删除变量 (被声明为只读的变量无法被 unset 删除)
shell
name=irai
unset name
echo $name  # 输出空行

  • 变量类型:

    • 自定义变量(局部变量):子进程不能访问的变量
    • 环境变量(全局变量):子进程可以访问的变量
  • 自定义变量改成环境变量:

shell
acs@9e0ebfcd82d7:~$ name=irai  # 定义变量
acs@9e0ebfcd82d7:~$ export name  # 第一种方法
acs@9e0ebfcd82d7:~$ declare -x name  # 第二种方法
  • 环境变量改为自定义变量:
shell
acs@9e0ebfcd82d7:~$ export name=irai  # 定义环境变量
acs@9e0ebfcd82d7:~$ declare +x name  # 改为自定义变量

4.4 字符串


  • 字符串可以用单引号,也可以用双引号,也可以不用引号
  • 单引号和双引号的区别:
    • 单引号中的内容会原样输出,不会执行,不会取变量;
    • 双引号中的内容可以执行,可以取变量;
shell
name=irai  # 不用引号
echo 'hello, $name \"hh\"'  # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\""  # 双引号字符串,输出 hello, irai "hh"

  • 获取字符串长度:
shell
name="irai"
echo ${#name}  # 输出4

  • 提取子串:
shell
name="hello, irai"
echo ${name:0:5}  # 提取从0开始的5个字符

4.5 默认变量


  • 文件参数变量:

    • 在执行 shell 脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。

      特殊的,$0 是文件名(包含路径)。

    • 需要注意的是,如果参数超过个位数,比如 10,那么就需要大括号告诉范围 ${10}

  • 例如:

创建文件 test.sh :

shell
#! /bin/bash

echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
  • 然后执行该脚本:
shell
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 基本用法


  • 远程登录服务器:
shell
ssh user@hostname
  • user :用户名
  • hostnameIP 地址 或 域名

  • 第一次登录的时候会提示:
shell
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。如果想登录某一特定端口:
shell
ssh user@hostname -p 22

5.1.2 配置文件


  • 创建文件 ~/.ssh/config
  • 然后在文件中输入:
shell
Host myserver1
    HostName IP地址或域名
    User 用户名

Host myserver2
    HostName IP地址或域名
    User 用户名
shell
ssh user@hostname
  • 之后再使用服务器时,上面那一串就可以直接使用别名 myserver1myserver2 如下:
shell
ssh myserver1

5.1.3 密钥登录


  • 创建密钥:
shell
ssh-keygen
  • 然后一直回车即可。

    执行结束后,~/.ssh/ 目录下会多两个文件:

    • id_rsa :私钥
    • id_rsa.pub :公钥

  • 之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。

    • 例如,想免密登录 myserver 服务器。则将公钥中的内容,

      复制到 myserver 中的 ~/.ssh/authorized_keys 文件里即可。


  • 也可以使用如下命令一键添加公钥:
shell
ssh-copy-id myserver

5.1.4 执行命令


  • 命令格式:( 效果 :把 command 传给 ssh 的服务器运行然后 stdout 重定向回本地服务器输出)
shell
ssh user@hostname command
  • 例如:
shell
ssh user@hostname ls -a
  • 或者:
shell
# 单引号中的 $i 传过去的是echo $i, 所以可以正常在对方服务器求值
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'
  • 或者:
shell
# 双引号中的 $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
shell
scp source destination

  • 一次复制多个文件:
shell
scp source1 source2 destination

  • 复制文件夹:(将本地家目录的 tmp 文件夹复制到 myserver 服务器中的 /home/acs/ 目录下)
shell
scp -r ~/tem myserver:/home/acs/

( 递归 -r recusion


  • 将本地家目录中的 tmp 文件夹复制到 myserver 服务器中的 ~/homework/ 目录下
shell
scp -r ~/tmp myserver:homework/

  • myserver 服务器中的 ~/homework/ 文件夹复制到本地当前路径下
shell
scp -r myserver:homework .

  • 指定服务器的端口号:( ssh 默认端口号是 22
shell
scp -P 22 source1 source2 destination
  • 注意:scp-r -P 等参数一定要加在 sourcedestination 之前

  • 使用 scp 配置其他服务器的 vimtmux
shell
scp ~/.vimrc ~/.tmux.conf myserver:

六、git



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 — XXgit 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:查看栈中所有元素