Linux Learning
本文最后更新于:2023年1月29日 晚上
Linux
内核
功能:
- 系统内存管理(对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。)
- 软件程序管理(init进程启动其他)
- 硬件设备管理(eg将驱动插入运行中的内核,之前需重新编译,如今不需,使用内核模块)
- 文件系统管理(支持不同类型的文件系统)
GNU
Unix实用工具
GNU是一个操作系统,多使用Linux内核
基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils),GNU调试器(GDB)、GNU二进制实用程序(binutils)等
shell
指操作系统中提供访问内核服务的程序,也用于泛指所有为用户提供操作界面的程序(CLI和GUI)
多个shell命令放到一个文件中,作为一个程序执行,称为shell脚本
桌面环境
X Window
与显示器和显卡交互
KDE Plasma桌面
GNOME桌面
ubuntu可见
Linux = 内核 + GNU工具 + shell + 桌面环境(软件)
完整的Linux系统就是发行版
- 核心发行版(大量可选配置,但繁琐)
- 特定用途的(有自动检测和自动配置)ubuntu属于此类
shell
终端
- 控制台终端
- 图形化终端:终端仿真软件包,在图形化窗口中模拟控制台终端
shell中的文件系统
linux将文件存储在名为虚拟目录的单个目录结构中,虚拟目录将计算机中所有存储设备的文件路径都纳入单个目录结构
Linux使用‘/’而不是‘\’来分隔文件路径,主要是因为\在Linux中用作转义符
Linux系统中安装的第一块硬盘为根驱动器,包含了虚拟目录的核心
Linux使用根驱动器上一些特别目录作为挂载点,挂载点是虚拟目录中分配给额外存储设备的目录,会让这些文件出现在挂载目录下,即使处于其他物理驱动器
链接文件
- 符号链接,软链接。是一个文件,指向另一个地方的文件。要创造符号链接,原始文件必须事先存在。类似于快捷方式
- 硬链接,一个独立的虚拟文件,包含了原始文件的信息以及位置,但是根本上与原文件是一个文件。因此原始文件也必须先存在。
- 硬链接只能对处于同一存储设备文件创建
文件权限
dr-xr-xr-x:共10位,第1位表示文档类型,d
表示目录,-
表示文件,l
表示链接文件,d
表示可随机存取的设备,如U盘等,c
表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。
常见目录
- /bin:二进制文件,存放用户级GNU工具
- /boot:引导文件
- /dev:设备目录,创建设备节点
- /etc:系统配置文件
- /home:主目录,可在此创建用户目录
- /lib:库目录,系统和应用程序的库文件
- /media:媒介目录,可移动存储设备的挂载点
- /mnt:挂载目录,临时挂载文件系统的常用挂载点
- /opt:可选目录,存放第三方软件包
- /proc:进程目录,现有内核与系统的信息
- /root:root用户的主目录,可选
- /run:系统运行时数据
- /sbin:系统二进制文件目录
- /srv:本地服务相关文件
- /sys:系统目录,存放设备、驱动及部分内核特性信息
- /tmp:临时目录
- /usr:用户目录,为次目录层级结构
- /var:可变目录,存放经常变化的文件,比如日志文件
常用命令
cd -
: return last directorycp
: 复制 + 粘贴 + 重命名mv
: 剪切 + 粘贴 + 重命名mkdir a/b/c -p
: -p: make parent directory as needed.ls
:列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件- ●ㅤls -a:查看所有文件包括隐藏文件(以.开头的文件就是隐藏文件)
- ㅤㅤㅤ●ㅤls -l:查看当前路径下文件的读、写、执行权限ㅤ
- ls -h,字节为单位显示大小
- Ls -l “name”:查看某个目录
- ls -dl “name”:仅查看该目录信息
- ㅤㅤ●ㅤls | wc -l:查看ls下有多少个文件
history
:查看历史输入指令tree
: 以树形显示文件目录结构- 过滤器:?为任意单个字符,*代表任意个任意字符。[]内字母表示候选,[!]表示除了
file {filename}
: 查看文件类型、显示二进制文件所需平台和库more
: 分页显示文件 内容,比cat更友好,less也可以tail -n {number} {filename}
: 显示文件最后n行,默认十行head -n {number} {filename}
: 显示文件前n行,默认十行
进程相关
- ps:默认显示运行在当前终端的,属于当前用户的进程
- ps支持三种类型的命令行选项,即选项前加单连字符(Unix风格),不加连字符(BSD风格),双连字符(GNU风格)
- top:实时监测进程
- 进程之间的通信是通过信号完成的
磁盘相关
- mount:显示当前挂载的存储设备(设备名,挂载点,文件系统类型,已挂载设备访问状态)
- 手动挂载设备:
mount -t type device directory
,需要root用户权限 - ubuntu中挂载磁盘:
sudo apt-get install open-vm-tools open-vm-tools-desktop
sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000
- 查询所有可以挂载的磁盘:
vmware-hgfsclient
数据处理工具
sort:排序
sort -n <filename>
: 将数字按值排序,-nr:降序排序sort -M
: 将内容按月排序sort -k number
: 按照第k列排序sort -t 'char'
: 字段分隔符,只支持单个字符,不能用字符串分隔
grep:搜索
grep [options] pattern [file]
grep -v
: 反向搜索,输出不符合条件的行grep -n
: 输出行号grep -c
: numbers of matched rowsgrep -e [pattern1] -e[pattern2]
: multi-pattern match
gzip: 压缩
tar:归档
- -c:创建新的归档文件
- -x:从tar归档文件中提取文件
- -v:处理文件时显示文件名
- -f:结果输出到文件
- -t:列出tar归档文件的内容
- tar是归档格式,gzip才是压缩格式,归档压缩一般步骤:先使用tar命令对文件夹进行归档,然后再使用gzip命令对归档文件进行压缩,得到tar.gz或tgz的文件
- 常见命令组合:
- -cvf:创建归档,显示名称,并输出到文件
- -tf:显示归档文件的内容
- -xvf:提取归档文件,显示文件名,输出结果
- 注意都需要f选项
类型
- etc/shells
- shell文件存在于bin和/usr/bin中,因为现代Linux系统中,/bin是指向/usr/bin的符号链接
- 显示当前的shell:echo $0
- 可以通过直接输入shell的名称,来改变当前shell,再使用exit命令退出
父子关系
进程就是执行着的程序,因此bash本身,以及诸如ps等命令,都是进程
- ps -f
- ps –forest
- exit退出当前bash
进程列表
用一系列的;可以依次执行一系列的命令,但是仍然是在当前shell里面运行;如果在最外面加上(),那么就是新建一个shell,之后再运行这些命令
子shell常用于多进程处理,但是创建成本较高,容易拖慢进度,在交互式shell中,子shell并非真正多进程处理,因为终端与子shell的I/O绑定在了一起
而通过将进程列表置入后台,可以在子shell中进行多进程处理,因为终端不再和子shell的I/O绑定在一起
外部命令
存在于bash shell之外的命令,并不属于shell。当执行外部命令时,就会创建一个字进程,称为fork(衍生)
外部命令消耗较高
内部命令不需要新建子进程,已经与shell编译为一体
使用type判断是否为内建命令
- 有的命令有多种实现,既有内建也有外部
内建命令
- history:存储在~/.bash_history中
- alias:为命令创建别名,alias -p查看当前所有别名。如果自定义,由于是内建命令,因此只在定义的shell进程中才有效
环境变量
- 全局:对所有shell均可见
- 局部:仅对创建者可见
- 可以使用=直接设置用户自定义的局部变量
- 设置完自定义局部变量后,再使用export即可变为全局变量,在该进程及所有子进程中均可见。但如果子进程修改了该值,则不会影响到父进程
- unset命令取消环境变量
- 对于$什么时候用:读变量需要,写变量不需要
- 删除与修改,以及export,都是从上到下,无法从下到上
- PATH环境变量:shell查找命令时使用的目录列表,以冒号分隔
启动shell
启动shell时,在几个文件中查找命令,称为启动文件。启动文件取决于启动shell的方式。有三种方式:
- 登录时作为默认登录shell
- 通过/etc/profile启动,用for循环去迭代/etc/profile.d下面的所有文件,从而启动
- 再执行用户自定义的启动文件
- 交互式shell,生成子shell启动
- 不检查/etc/profile,而是仅检查用户自定义的启动文件(bashrc文件)
- 运行脚本的非交互式shell
- 有一个BASH_ENV环境变量,当shell启动非交互式时,会检查这个文件
父shell设置并导出的,子shell都可以继承;其他不可以继承
用户想要持久化的环境变量不建议放在/etc/profile中,因为更新后就没了
推荐放在HOME文件夹下面的.bashrc
文件中
用户的alias设置也往往设置在这里面
tmux
- 分屏
- 后台运行
一个tmux可以包含多个session,一个session可以包含多个window,一个window可以包含多个pane。
操作
tmux
: 新建一个session,内嵌window,内嵌pane,pane里有个shell- 左右分屏:
ctrl + a , %
- 上下分屏:
ctrl + a , "
- 关闭pane:
ctrl + d
- 选择pane:
ctrl + a , direction key
- 改变pane大小:鼠标拖
- 全屏/取消:
ctrl + a , z
- 挂起session:
ctrl + a , d
- 打开之前的session:
tmux a
- 选择其他session:
ctrl + a, s , direction key
- 创建新window:
ctrl + a , c
- 选择其他window:
ctrl + a , w
- 复制粘贴:
ctrl + a , [ , select text, ctrl + a , ]
Vim
操作
- i:编辑
- esc:进入一般命令
- 光标移动:方向键
- n+space:光标右移n个字符,自动换行
- n+enter:光标下移n行
- 0/home:光标到本行开头
- $/end:本行结尾
- G:最后一行
- :n/nG:光标移动到第n行
- gg:光标到第一行, == 1G
- /word:光标以后查找word字符串
- ?word:光标前查找word字符串
- n:重复前一个查找
- N:重复后一个查找
- :n1,n2s/word1/word2/g:在n1行到n2行之间寻找word1,并将该字符串替换为word2
- :1,$s/word1/word2/g:全文word1换成word2
- :1,$s/word1/word2/gc:全文替换,并且替换前需要用户确认
- v:选择文本
- d:删除文本
- dd:删除当前行
- y:复制选中的文本
- yy:复制当前行
- p:将复制的数据在光标下一行 / 下一个位置粘贴
- u:撤销
- ctrl + r:取消撤销
- 大于号 > :选中的文本整体向右缩进,小于号相反
- : ——进入命令行模式
- :w:保存
- :w!:强制保存
- :q :退出
- :q! :强制退出
- :wq:保存并退出
- :set nu:显示行号
- :set nonu :隐藏行号
- gg=G:全文格式化
- :noh : 关闭查找关键词高亮
- ctrl + q :vim卡死,强制退出
- 快速删除:先按d,然后按一个数字,回车,代表删几行(因为数字+回车代表下移几行);如果先按d,再按数字,此时按G,相当于删除+光标移动,就是删到第几行(上下均可)