操作系统lab0
1.Linux操作
1.1 查看文件
ls
用法: ls [选项]… [文件]…
选项(常用):
-a 不隐藏任何以 . 开始的项目
-l 每行只列出一个文件
示例:ls -al
1.2 创建一个新的空文件
touch
用法: touch [选项]… 文件…
示例:touch hello_world.c成功创建一个新的文件
1.3 (创建并打开一个文件)
vim [文件名]
1.4 创建文件目录
mkdir
用法:mkdir [选项]… 目录…
示例:mkdir newdir在目录下创建了一个名为newdir的目录
1.5 进入目录
cd
用法:cd [目录]
示例:cd newdir进入newdir目录,cd ..返回上一级目录,cd返回主目录,cd -返回上一次所在的目录
输入pwd可以查看当前所在的绝对路径。
1.6 删除一个空目录
rmdir
用法:rmdir [选项]… 目录…
示例:rmdir newdir删除newdir目录
1.7 删除
rm
用法:rm [选项]… 文件…
选项:
-r 递归删除目录及其内容
-f 强制删除。忽略不存在的文件,不给出提示
示例:rm -rf newdir删除newdir目录及其内容
rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删
除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。 rm命令还有-i选项,这个选项在使用文
件扩展名字符删除多个文件时特别有用。使用这个选项,系统会要求逐一确定是否要删除。这时,必须输入Y并
按回车键,才能删除文件。 示例:rm -rf /-可强制递归删除全盘文件!!!
可以考虑在家目录下创建回收站目录,删除文件时先移动到回收站,再删除
1.8 复制文件
cp
用法:cp [选项]… 源文件 目标文件
选项:
-r 递归复制目录及其内容
示例:cp hello_world.c hello_world2.c复制hello_world.c文件为hello_world2.c
该命令的第一个参数为原文件路径,命令的第二个参数为目标文件路径。如果目标文件路径不存在,则会创建一个新的文件。
1.9 移动文件
mv
用法:mv [选项]… 源文件 目标文件
选项:
-i 若目标文件已经存在,询问是否覆盖
示例:mv hello_world2.c newdir将hello_world2.c移动到newdir目录下
mv oldname newname可以重命名文件
1.10 回显
echo
示例:echo "hello world"输出hello world
1.11 查看文件内容
cat
用法:cat [选项]… [文件]…
选项:
-n 显示行号
-b 显示行号,空行不显示
-A 显示所有字符,包括控制字符
-E 显示行尾的$
-T 显示制表符
-v 显示不可见字符
-s 合并多个空行为一个空行
-e 显示行尾的$
示例:cat hello_world.c查看hello_world.c文件内容
cat -n file1 > file2 将file1的内容输出到file2中,并且在每一行前加上行号
cat -b file1 file2 >> file3 将file1和file2的内容输出附加到file3中,并且在每一行前加上行号
### 1.12 帮助
man -manual
用法:man [选项]… [命令]…
选项:
-f 显示命令的简短说明
示例:man ls查看ls命令的帮助
通过man命令可以查看命令的详细用法和参数说明
1.13 查找
find
用法:find [选项]… [路径]… [表达式]…
选项:
-name 按文件名查找
-type 按文件类型查找
-size 按文件大小查找
-exec 对查找到的文件执行命令
find当前目录下递归查找符合参数所示文件名的文件,并将文件的路径输出至屏幕上
示例:find . -name "hello_world.c"查找当前目录下的hello_world.c文件
grep
用法:grep [选项]… 模式 [文件]…
选项:
-n 显示行号
-v 显示不包含模式的行
-i 忽略大小写
-r 递归查找
-l 只显示文件名
-c 显示匹配行数
-w 匹配整个单词
-A 显示匹配行及后面的n行
grep使用正则表达式匹配文件内容,并把匹配的行输出至屏幕上。可以从文件中查找包含pattern部分字符串的行,并将该文件的路径和该行输出值屏幕
示例:grep "hello" hello_world.c查找hello_world.c文件中包含hello的行
tree
用法:tree [选项]… [目录]…
选项:
-d 只显示目录
-L 显示目录的深度
-a 显示所有文件
-f 显示完整路径
tree可以以树状图的形式显示目录结构
示例:tree显示当前目录的树状图
1.14 权限
chmod
用法:chmod [选项]… 模式 文件…
选项:
-R 递归修改
模式:
u 用户
g 用户组
o 其他用户
a 所有用户
‘+’ 添加权限
‘-’ 减少权限
= 设置权限
r 读权限
w 写权限
x 执行权限
s 设置用户ID
t 粘滞位
示例:chmod u+x hello_world.c给hello_world.c文件的用户添加执行权限
chmod 777 hello_world.c给hello_world.c文件的所有用户添加读写执行权限
chmod 755 hello_world.c给hello_world.c文件的用户添加读写执行权限,用户组和其他用户添加读执行权限(对应二进制111b=7, 101b=5)
chmod -w hello_world.c删除hello_world.c文件的写权限
chown
用法:chown [选项]… 用户:用户组 文件…
选项:
-R 递归修改
用户:文件的所有者
用户组:文件的所属用户组
文件:要修改的文件
该命令可以修改文件的所有者和所属用户组
示例:chown root:root hello_world.c将hello_world.c文件的所有者和所属用户组修改为root
1.15 比较文件差异
diff
用法:diff [选项]… 文件1 文件2
选项:
-c 以上下文的方式显示差异
-u 以统一的方式显示差异
-r 递归比较目录
-b 忽略空格
-B 忽略空行
-q 只显示是否有差异
该命令可以比较两个文件的差异
1.16 文件处理
sed
用法:sed [选项]… [脚本]… [文件]…
选项:
-n 安静模式,只显示脚本处理后的结果
-e 多个脚本处理
-f 从文件中读取脚本
脚本:
- s/old/new/g 替换old为new
- d 删除匹配行
- p 打印匹配行
- a 在匹配行后添加
- i 在匹配行前添加
- c 替换匹配行
- r 从文件中读取
- w 写入文件
- q 退出
-i 直接修改文件,而不是输出到屏幕。否则,只输出不编辑
示例:sed -i 's/old/new/g' hello_world.c将hello_world.c文件中的old替换为new
[行号]a[内容] 新增,在行号后新增一行相应内容。行号可以是“数字”,在这一行之后新增,也可以是“起始行,终止行”,在其中的每一行后新增。当不写行号时,在每一行之后新增。使用$表示最后一行。后面的命令同理
[行号]c[内容] 取代。用内容取代相应行的文本
[行号]i[内容] 插入。在当前行的上面插入一行文本
[行号]d 删除当前行的内容
[行号]p 输出选择的内容。通常与选项-n一起使用
s/re/string 将 re(正则表达式)匹配的内容替换为 string
示例
sed -i '1a\hello' hello_world.c #在第一行后添加hello
sed -i '1,3d' hello_world.c #删除第一行到第三行
sed -i '1,3p' hello_world.c #输出第一行到第三行
# 输出 my.txt 的第三行
sed -n '3p' my.txt
# 删除 my.txt 文件的第二行
sed '2d' my.txt
# 删除 my.txt 文件的第二行到最后一行($ 符号表示到最末尾)
sed '2,$d' my.txt
# 在整行范围内把 str1 替换为 str2
# 如果没有 g 标记,则只有每行第一个匹配的 str1 被替换成 str2
sed 's/str1/str2/g' my.txt
# -e 选项允许在同一行里执行多条命令。例子的第一条是第四行后添加一个 str, 第二个命令是将
str 替换为 aaa。命令的执行顺序对结果有影响。
sed -e '4a\str' -e 's/str/aaa/' my.txt
awk
用法:awk [选项]… [脚本]… [文件]…
选项:
-F 指定分隔符
脚本:
- print 打印
- printf 格式化打印
- NR 行号
- NF 列数
- $1 第一列
- $0 整行
- $NF 最后一列
- $NR 最后一行
- BEGIN{…} 开始时执行
- END{…} 结束时执行
- FS 分隔符
- OFS 输出分隔符
- RS 输入行分隔符
- ORS 输出行分隔符
- FILENAME 文件名
- FNR 当前文件的行号
- ARGIND 当前文件的序号
- ARGV 当前文件的名字
- ENVIRON 环境变量
- length() 字符串长度
- substr() 截取字符串
- index() 查找字符串
- match() 匹配字符串
- split() 分割字符串
- tolower() 转小写
- toupper() 转大写
- system() 执行系统命令
- getline 读取下一行
- close 关闭文件
- delete 删除数组
- next 跳过当前行
- exit 退出
-f 从文件中读取脚本
-v 定义变量
示例
awk '{print $1}' my.txt #输出 my.txt 的第一列
awk -F: '{print $1}' /etc/passwd #以:为分隔符输出/etc/passwd的第一列
awk '{print $1,$2}' my.txt #输出 my.txt 的第一列和第二列
awk '{print $1,$2}' OFS=":" my.txt #输出 my.txt 的第一列和第二列,以:为分隔符
awk '$1>2 {print$1,$3}' my.txt #输出 my.txt 的第一列大于2的行的第一列和第三列
$n 代表每一行中用空格分隔后的第n项
awk -F , '{print $2}' my.txt #以,为分隔符输出 my.txt 的第二列
1.17 压缩解压
tar
用法:tar [选项]… [文件]…
选项:
-c 创建压缩文件
-x 解压文件
-z 使用gzip压缩
-j 使用bzip2压缩
-v 显示详细信息
-f 指定文件名
-C 指定目录
-t 显示压缩文件内容
-r 向压缩文件中添加文件
-u 更新压缩文件
-d 从压缩文件中删除文件
-A 合并压缩文件
-W 确认压缩文件
-p 保留文件权限
-P 保留绝对路径
-m 不保留文件修改时间
-l 保留符号链接
-k 保留已存在文件
-N 指定时间
-X 指定排除文件
-T 指定文件列表
-U 更新压缩文件
-M 多卷压缩文件
-h 显示帮助
示例
tar -cvf file.tar file1 file2 #将file1和file2打包成file.tar
tar -xvf file.tar #解压file.tar
tar -zcvf file.tar.gz file1 file2 #将file1和file2打包成file.tar.gz
1.18 管道
管道符号
|可以将一个命令的输出作为另一个命令的输入
command1 | command2 | command3
示例
ls -al | grep "hello" #查找当前目录下包含hello的文件
# 为将my.sh的内容输出给grep命令,grep在其中查找字符串
cat my.sh | grep "Hello"
# 将 my.sh 的内容作为 cat 命令参数,cat 命令 stdout 发给 grep 命令的 stdin,grep 在其
中查找字符串,最后将结果输出到 output.txt
cat < my.sh | grep "Hello" > output.txt
1.19 重定向
- 标准输入(stdin):0
- 标准输出(stdout):1
- 标准错误(stderr):2
重定向符号
>可以将命令的输出重定向到文件中
重定向符号>>可以将命令的输出追加到文件中
重定向符号<可以将文件的内容作为命令的输入
重定向符号2>可以将错误输出重定向到文件中
重定向符号&>可以将标准输出和错误输出重定向到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中
重定向符号&>>可以将标准输出和错误输出追加到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中
重定向符号&>>可以将标准输出和错误输出追加到文件中
重定向符号2>&1可以将错误输出重定向到标准输出中
1.20 环境变量
环境变量是一些系统的配置信息,可以通过环境变量来控制系统的行为
PATH环境变量:用于指定系统的可执行文件的路径HOME环境变量:用于指定用户的家目录USER环境变量:用于指定当前用户的用户名SHELL环境变量:用于指定当前用户的shellPWD环境变量:用于指定当前用户的工作目录LANG环境变量:用于指定当前用户的语言TERM环境变量:用于指定当前用户的终端类型EDITOR环境变量:用于指定当前用户的编辑器PS1环境变量:用于指定当前用户的命令提示符PS2环境变量:用于指定当前用户的命令提示符的续行符PS3环境变量:用于指定当前用户的选择提示符PS4环境变量:用于指定当前用户的调试提示符HISTSIZE环境变量:用于指定当前用户的历史记录的大小HISTFILESIZE环境变量:用于指定当前用户的历史记录文件的大小HISTCONTROL环境变量:用于指定当前用户的历史记录的控制HISTIGNORE环境变量:用于指定当前用户的历史记录的忽略
export命令可以将一个变量导出为环境变量
unset命令可以将一个环境变量删除
env命令可以查看当前的环境变量
set命令可以查看当前的所有变量
echo $变量名可以查看变量的值
echo $PATH可以查看PATH环境变量的值
1.21 常用快捷键
Ctrl+C中断当前命令Ctrl+D退出当前shell,相当于exitCtrl+L清屏Ctrl+Z挂起当前命令,使用fg命令恢复
1.22 通配符
*匹配任意多个字符,ls *.txt匹配所有以.txt结尾的文件?匹配一个字符,ls ?.txt匹配所有以一个字符加.txt结尾的文件[]匹配指定范围内的字符,ls [a-z].txt匹配所有以一个小写字母加.txt结尾的文件!取反,排除匹配的文件,ls !(*.txt)匹配所有不以.txt结尾的文件{},ls {*.txt,*.c}匹配所有以.txt或.c结尾的文件()可以改变优先级,ls (a|b).txt匹配所有以a.txt或b.txt结尾的文件|或,ls a.txt|b.txt匹配所有以a.txt或b.txt结尾的文件^匹配行首,ls ^a.txt匹配所有不以a.txt开头的文件$匹配行尾,ls a.txt$匹配所有以a.txt结尾的文件\<匹配单词开头,\>匹配单词结尾,ls \<a.txt匹配所有以a.txt开头的文件**,递归匹配,ls **/*.txt匹配所有以.txt结尾的文件
1.23 tmux
tmux是一个终端复用工具,可以在一个终端中同时运行多个终端
详情看另一个文件
2. 使用工具
2.1 编译器
gcc是一个C语言编译器g++是一个C++语言编译器
语法:gcc [选项]... [文件]...
选项:
-c 仅编译,不链接
-o 指定输出文件
-E 预处理
-S 汇编
-l 指定库文件
-L 指定库文件路径
-I Path/to/head/file 指定头文件路径
-D 定义宏
-wall 显示所有警告
-g 生成调试信息
-std=c99 指定C语言标准
参数:
file.c 源文件
示例
gcc -o hello_world hello_world.c #编译hello_world.c文件为hello_world可执行文件
gcc -c hello_world.c #编译hello_world.c文件为hello_world.o目标文件
gcc -E hello_world.c #预处理hello_world.c文件
gcc -S hello_world.c #汇编hello_world.c文件
gcc -o hello_world hello_world.c -lm #编译hello_world.c文件为hello_world可执行文件,并链接数学库
同时编译多个文件
gcc -o hello_world hello_world.c hello_world2.c #编译hello_world.c和hello_world2.c文件为hello_world可执行文件
gcc -c hello_world.c hello_world2.c #编译hello_world.c和hello_world2.c文件为hello_world.o和hello_world2.o目标文件
选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。o是output的意思,不是目标的意思。结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。
Makefile
Makefile是一个用于编译程序的工具,可以自动化编译程序
基本格式
target: dependencies
command 1
command 2
target是要生成的目标文件dependencies是生成target所需要的依赖文件command是生成target所需要执行的命令
示例
hello_world: hello_world.c
gcc -o hello_world hello_world.c
shell脚本
shell脚本是一个用于执行命令的脚本文件
- 在脚本中在第一行添加
#!/bin/bash可以指定脚本使用的shell - 运行脚本
- 通过
chmod +x script.sh添加执行权限后,./script.sh运行脚本 sh script.sh运行脚本./script.sh运行脚本source script.sh运行脚本
- 通过
- 参数
$0脚本名$1第一个参数$2第二个参数$#参数个数$*所有参数,所有参数都是一个字符串$@所有参数,每个参数都是一个独立的字符串$$脚本的进程号$?上一个命令的返回值$!后台运行的最后一个进程的进程号
- 函数
function_name(){...}定义函数function_name调用函数return返回值
- 控制结构
if...then...fi条件语句case...esac多条件语句for...do...done循环语句while...do...done循环语句until...do...done循环语句break跳出循环continue跳过本次循环exit退出脚本trap捕获信号eval执行命令exec执行命令let执行算术运算select选择语句shift移动参数source执行脚本test测试语句time计时type查找命令ulimit设置资源限制
- 关系运算符
-eq等于-ne不等于-gt大于-lt小于-ge大于等于-le小于等于=字符串相等!=字符串不相等-z字符串为空-n字符串不为空-e文件存在-f文件存在且是普通文件-d文件存在且是目录-s文件存在且不为空-r文件存在且可读
ctags是一个用于生成代码索引的工具
ctags -R生成当前目录的代码索引ctags -R /path/to/dir生成指定目录的代码索引ctags -R /path/to/dir/*生成指定目录的代码索引- vim 下使用
Ctrl+]跳转到定义处,Ctrl+t返回 - vim 下使用
:ts查找定义处,:tn下一个,:tp上一个
Git
3.1 基本操作
git init初始化一个仓库git clone克隆一个仓库git add添加文件到暂存区git commit提交文件到仓库git status查看仓库状态git diff查看文件差异git log查看提交日志git reset重置仓库git rm删除文件git mv移动文件git branch查看分支
3.2 分支操作
git branch查看分支git checkout切换分支git merge合并分支git rebase变基分支git cherry-pick挑选提交git tag标记提交git stash暂存工作区git fetch获取远程分支git pull拉取远程分支git push推送远程分支git remote管理远程仓库git submodule管理子模块git worktree管理工作树git reflog查看引用日志git bisect二分查找git blame查看文件作者git grep查找文件内容git log查看提交日志git show查看提交详情
3.3 高级操作
git filter-branch过滤分支git subcommand子命令git rerere重用冲突解决git gc垃圾回收git fsck检查仓库git prune删除无用对象
git 版本回退
git reset --hard HEAD^回退到上一个版本git reset --hard HEAD^^回退到上上一个版本git reset --hard HEAD~100回退到上100个版本git reset --hard commit_id回退到指定版本git reflog查看命令历史git reset --hard commit_id回退到指定版本git reset --hard HEAD@{n}回退到指定版本git reset --hard ORIG_HEAD回退到上一个版本git reset --hard回退到上一个版本
配置
git config --global user.name "Your Name"设置用户名- `git config --global user.email "
git config --global core.editor "vim"设置编辑器git config --global merge.tool "vimdiff"设置合并工具git config --global color.ui true设置颜色git config --global alias.st status设置别名git config --global alias.co checkout设置别名git config --global alias.ci commit设置别名git config --global alias.br branch设置别名git config --global alias.unstage "reset HEAD"设置别名