0%

Linux基础

  • 这篇文章涉及到的都是本人用到的知识,没用到的我都没写。
  • 学会这些算是一个计算机学生的基本素养吧。
  • 比如以后进厂打工可嫩会接触到Linux环境,那么tmux、nano、Linux常用命令,总得会吧。
  • 然后工作或者租算力服务器或者连学校服务器,可能会用到SSH吧,所以ssh也总得会吧。
  • 然后因为自己平时也可能会写工程,所以Git、类github软件总得会用吧。
  • 然后可能偶尔在Linux或者Win下写点脚本来批处理文件,所以shell语法也得会一点吧。
  • 最后是docker,到时候别人传一个docker给你,你都不会配环境,这说不过去,所以docker也得会用吧。

tmux

学这个是为了可以在一个终端里开多个屏来工作,提高生产效率。

  • tmux ls:显示所有session列表
  • tmux attach -t [id]:进入到某个session中
  • tmux:新建一个session并进入
  • ctrl + b, s:显示session、window、pane树形结构
  • ctrl + d:删除当前pane/window/session
  • ctrl + b, d:在不删除session的前提下退出tmux
  • ctrl + b, %:左右分屏
  • ctrl + b, ":上下分屏
  • ctrl + b, ↑←↓→:在pane中切换
  • ctrl + b不松开 + ↑←↓→:调整当前pane大小
  • ctrl + b,[:进入复制模式,在此模式下按上下左右可控制光标移动。按q退出该模式

nano/vim

学这个是为了在Linux系统下处理文本。本质上就是学如何用记事本。

关于vim我能不用尽量不用,但是迫不得已的时候使用的时候还是要会它的基本操作。按Esc回到命令模式,命令模式下dd删除本行,:wq保存退出,:q!强制退出,i进入编辑模式。下面是关于nano的操作

另外,在/etc/nanorc里可以配置nano

  • ctrl + x:退出
  • ctrl + o:保存
  • ctrl + k:剪切
  • ctrl + u:粘贴
  • alt +6:复制
  • alt + u:撤销
  • alt + a:开启选中模式(注意这个快捷键与微信截图冲突了,记得把vx的改了)
  • alt + m:开始鼠标模式
  • alt + shift + 3:开启行号
  • ctrl + a:回到行首;ctrl + e:回到行末;alt + /:跳转到文末;alt + :跳转到开头
  • ctrl + shift + v:将windows文本复制到nano/vim/shell里

Linux常用命令

系统状况

  • top:查看所有进程的信息
    • 输入M:按使用内存排序
    • 输入P:按使用CPU排序
    • 输入q:退出
  • df -h:查看硬盘使用情况
  • free -h:查看内存使用情况
  • du -sh:查看当前目录所占硬盘空间
    • du -sh 文件名:查看当前目录下某文件所占硬盘空间
  • ps aux:查看所有进程
  • kill -9 pid:杀死编号为pid的进程
  • ping www.baidu.com:检查是否联网

文件检索

  • find path -name "filename":在某个路径下搜索目标文件
  • grep xxx:从stdin中读入若干行参数,如果某行包括xxx,则输出该行,否则忽略该行
  • xargs:从stdin接受数据,并以空格分割形式转换为命令行参数
    • 例如,find . -name "*.cpp" | xargs cat,读取当前目录下所有.cpp文件的内容
    • find . -name "*.cp" | xargs cat | grep "cout":找出当前目录下的.cpp文件中所有包含cout的行
  • wc -l filename:统计文件的行数
    • wc既可以接收文件名参数,也可以从stdin读入内容
    • find . -name "*.cpp" | wc -l:统计当前目录下有多少个.cpp文件
    • find . -name "*.cpp" | xargs wc -l:统计当前目录下每个.cpp文件有多少行

工具

  • |:管道符
    • 将前一个command的stdout重定向到后一个command的stdin
    • 在文件检索中经常用到
  • history:展示历史操作
    • history 数字:展示最后num条操作
  • tar -zcvf xxx.tar.gz 文件1 文件2:压缩
  • tar -zxvf xxx.tar.gz:解压
  • diff xxx yyy:比较xxx与yyy的不同点
  • sudo apt update:更新可用软件包列表
  • sudo apt install 包名:安装

ssh

这个ssh以后自己租服务器的时候用得上。就是学会如何登录,以及主机和服务器之间如何传文件即可。

  • ssh user@hostname:登录

  • 在~/.ssh/config里写配置文件,格式如下

    1
    2
    3
    Host name1
    HostName IP地址
    User 用户名

    那么在下次使用服务器时,就可以ssh name1来登录

  • ssh-keygen:创建密钥(密钥文件存储在~/.ssh/下)

  • ssh-copy-id 服务器别名:向服务器添加自己的公钥,这样以后登录服务器可以免密登录

  • scp source destinatino:跟cp一样,本机与服务器传文件

    • 例如scp /etc/nanorc 服务器别名:/etc/nanorc
    • 注意在传文件夹时要加-r,而且-r必须紧跟在scp后

git

  • git config --global user.name xxx:设置全局用户名
  • git config --global user.email xxx@xxx.com:设置全局邮箱地址
  • 上述信息都会记录在~/.gitconfig文件中
  • git init:将当前目录配置成git仓库,信息记录在.git文件夹中
  • git status:查看仓库状态
  • git add xx:将xx文件添加到暂存区
    • git add .:将全部改动添加到暂存区
  • git rm --cached xx:将xx改动从暂存区中移出
  • git commit -m "备注信息":将暂存区中的内容提交到当前分支
  • git log:查看当前分支从根到HEAD指针的所有版本
    • git log --oneline:简洁显示
  • git relog:查看HEAD指针的移动历史
  • git reset --hard HEAD~:回滚到上一个版本
    • git reset --hard HEAD~~:回滚到上两个版本
    • git reset --hard 版本号(7位hash值):回滚到目标版本
  • git remote add origin git@git.acwing.com:Error666/test.git:将本地仓库与acgit绑定
  • git push -u origin master:将本地仓库推送到acgit上
    • 第一次需要向上面这么写,至于用master还是main,用git branch查看本地分支。是什么就用什么。以后推送直接git push即可
  • 更多有关git的命令:传送门

shell

shell语言主要学来用来批处理文件的,比如建立多个文件夹,改名多个文件夹啥的。学完后在window里也用得上。比如打竞赛出题的数据的时候,就可以用shell写个脚本统一创建文件/改名。在windows里用git的git bash运行脚本即可。

基本

  • su - root/zhou:换用户
  • mkdir/touch/cp/mv/rm/cat:基本操作
  • chmod +x+x+x [filename]:给权限(3个x对应user,group,others,如果只给user写1个x即可)
    • chmod +x dirname -R:递归的给权限
  • .sh为shell脚本后缀,在文件里第一行应为#! /bin/bash。执行方式有两种,bash filename.sh或者./filename.sh
  • echo:输出
    • 加参数-e:可在输出内容中识别转移字符,例如echo -e "hello"。
    • 加参数echo默认会输出换行,在结尾处加(要加-e)
    • echo ${a[@]}:输出数组中的数,以一行形式
    • echo ${a[@]:1:n}:输出数组下标为1 ~ n的数
  • “”:可将有空格的名字看作一个整体

变量

  • 变量=xxx:定义变量
  • ${变量}:使用变量
  • $0, $1, $2, ...:为传入的参数($0为文件名)
  • $#:传入的参数个数
  • $?:返回上一条command的exit code
  • `command`:返回command的stdout(不支持嵌套)
  • $(command):作用同``,但是支持嵌套

运算

  • expr $a +/- $b:进行a±b的运算
  • expr $a \* $b:进行a*b的运算
  • expr $a / $b:进行a/b的运算
  • expr $a % $b:进行a%b的运算
  • ()可以改变优先级,但要加\转义,同时记得打括号

循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# for法一
for var in val1 val2 val3
do
....
done

# for法二
for var in `seq 1 10`
do
...
done

# for法三
for var in {1..10}/{10..1}/{a..z}/{z..a} # 这种写法{}里面只能是常量
do
...
done

# for法四(跟C++一样,只不过多了层括号)
for ((expreesion; condition; expression))
do
...
done

# while
while condition
do
...
done

# break/continue
跟C++一样

判断

  • shell里的if看的是exit code的状态。如果exit code为0,则为真。否则为假
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# if
if condition
then
...
fi

# if-else
if condition
then
...
else
...
fi

# if-elif-else
if condition
then
...
elif
then
...
else
...
fi

test/[ ]

  • [ $a -[参数] $b ]:整数a与b的比较
    • -eq:是否相等(equal)
    • -ne:是否不相等(not equal)
    • -gt:是否大于(greater than)
    • -ge:是否大于等于(greater than or equal)
    • -lt:是否小于(less than)
    • -le:是否小于等于(less than or equal)
  • [ -[参数] filename ]:文件类型判断
    • -e:文件是否存在
    • -f:是否为文件
    • -d:是否为目录
  • [ -[参数] filename ]:文件权限判断
    • -r:是否可读
    • -w:是否可写
    • -x:是否可执行
    • -s:是否为非空文件
  • 可用&&、||、!拼接

函数

1
2
3
4
fun_name() {
...
...
}
  • 调用方式:fun_name val1 val2 val3
  • 函数内部默认参数从1开始,没有0,即$1
  • 在函数里面return的是exit code。echo的是stdout
  • 不管在函数还是函数外部直接使用的变量默认都是全局变量,所以若想使用局部变量,需要用local关键字声明

文件重定向

  • >:将原本输出到stdout的内容以覆盖形式输出到指定文件
  • <:原本从stdin读入数据,现在从指定文件中读入数据
  • >>:将原本输出到stdout的内容以追加形式输出到指定文件

其它

  • 导入外部脚本:source filename(本质就是将外部脚本粘贴复制到本脚本中)
  • 更多shell语法:传送门

docker

首先要安装docker,搜docker ubuntu,进官网,按照官网指示装就行了。

然后如果在用docker命令时发现每次都要加sudo权限,可以将当前用户加入到docker用户组中:sudo usermod -aG docker $USER。然后退出服务器,重进,即可解决这个问题

记住,docker中区分image可以用id或者名字(image名字是name:版本号)。区分container可以用id或者name。

镜像

  • docker pull 名称:拉取一个镜像
  • docker images:列出本地所有镜像
  • docker rmi id/名字:删除某个镜像
  • docker save -o xxx.tar id/名字:把某个镜像导出
  • docker load -i xxx.tar:导入某个镜像

容器

  • docker ps -a:查看本地的所有容器
  • docker create -it 镜像id/名字:利用某镜像创建一个容器
  • docker rm id/name:删除某容器
  • docker rename name1 name2:重命名容器
  • docker start id/name:启动某容器
  • docker stop id/name:停止某容器
  • docker exec -it id/name /bin/bash或者/bin/zsh:进入某容器
    • ctrl + d:退出并停止该容器
    • ctrl + p, ctrl + q:退出该容器但不停止它

租服务器 & thrift

待填