- 这篇文章涉及到的都是本人用到的知识,没用到的我都没写。
- 学会这些算是一个计算机学生的基本素养吧。
- 比如以后进厂打工可嫩会接触到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
3Host 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 | for法一 |
判断
- shell里的if看的是exit code的状态。如果exit code为0,则为真。否则为假
1 | if |
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 | 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
待填