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 directory
  • cp: 复制 + 粘贴 + 重命名
  • 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 rows
    • grep -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,相当于删除+光标移动,就是删到第几行(上下均可)

Linux Learning
https://blogoasis.github.io/post/49b9d038.html
作者
phInTJ
发布于
2022年10月31日
许可协议