操作系统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,相当于exit
Ctrl+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"
设置别名