avatar


1.简介、目录和VIM

Linux到底应该怎么读?
一种常见的读音是"林尼克斯",但或许更准确的读音是"林纳克斯"。至少Linus本人,似乎是这么读的。
"证据"如下:

简介

狭义的Linux特指Linux内核(Linux Kernel),广义的Linux是指基于Linux内核的各种操作系统,也被称为Linux的发行版。

Linux发行版

如图,是Linux操作系统几个常见的发行版。
本文基于的是CentOS。

实际上,安卓(Android),也是基于Linux内核的。所以,安卓也可以算作Linux系统,但是一般语境下常见的Linux发行版不包括安卓。

目录

树状结构

Linux的文件系统是采用层级式的树状目录结构,最上层是根目录/,然后在此目录下再创建其他的目录。
如下,Linux的目录结构示意图。
目录结构

说明:

  1. 箭头代表"文件夹的链接",在上图中,我们可以理解为/bin是一个快捷方式,指向/usr/bin
  2. 不一定每台机器的目录结构和上图都完全一致,但是大致结构是这样的。
    我们可以看看CentOS 7.9中目录结构,示例代码:
    1
    ll /
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    total 66
    lrwxrwxrwx. 1 root root 7 Jun 23 07:41 bin -> usr/bin
    dr-xr-xr-x. 6 root root 1024 Jun 23 07:53 boot
    drwxr-xr-x. 21 root root 3340 Jul 2 19:30 dev
    drwxr-xr-x. 147 root root 12288 Jul 2 23:27 etc
    drwxr-xr-x. 4 root root 4096 Jun 23 07:48 home
    lrwxrwxrwx. 1 root root 7 Jun 23 07:41 lib -> usr/lib
    lrwxrwxrwx. 1 root root 9 Jun 23 07:41 lib64 -> usr/lib64
    drwx------. 2 root root 16384 Jun 23 07:41 lost+found
    drwxr-xr-x. 3 root root 4096 Jun 23 07:51 media
    drwxr-xr-x. 2 root root 4096 Apr 11 2018 mnt
    drwxr-xr-x. 3 root root 4096 Jun 23 07:45 opt
    dr-xr-xr-x. 229 root root 0 Jul 2 18:11 proc
    dr-xr-x---. 3 root root 4096 Jun 23 07:53 root
    drwxr-xr-x. 47 root root 1400 Jul 2 23:27 run
    lrwxrwxrwx. 1 root root 8 Jun 23 07:41 sbin -> usr/sbin
    drwxr-xr-x. 2 root root 4096 Apr 11 2018 srv
    dr-xr-xr-x. 13 root root 0 Jul 2 18:11 sys
    drwxrwxrwt. 20 root root 4096 Jul 2 19:31 tmp
    drwxr-xr-x. 13 root root 4096 Jun 23 07:41 usr
    drwxr-xr-x. 21 root root 4096 Jun 23 07:53 var
    liblib64等,在上图就没有体现。

各目录的作用

  1. /bin:存放着最经常使用的命令("bin"是"Binary"的缩写)。
  2. /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
  3. /dev:是机器硬件设备的映射,例如cpudisk。("dev"是"Device"的缩写)。
  4. /etc:存放所有的系统管理所需要的配置文件和子目录,例如/etc/profile("etc"是"Etcetera"的缩写)。
  5. /home:普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。注意是普通用户,不包含root
  6. /lib:存放着系统最基本的动态连接共享库("lib"是"Library"的缩写)。
  7. /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
  8. /media:用于挂载外部设备,例如在macOS上通过ParallelDesktop安装Linux后并共享文件夹,macOS上被共享的文件夹就会以挂载设备的形式,出现这个目录下。
  9. /mnt:也是用于挂载外部设备,在Windows上通过VMwar安装Linux后并共享文件夹,Windows被共享的文件夹就会以挂载设备的形式,出现这个目录下。
  10. /opt:为额外安装软件所预留的位置,例如Tomcat就可以安装在这个目录下("opt"是"optional"的缩写)。
  11. /proc:一个虚拟的目录,是系统内存的映射,我们可以通过访问这个目录来获取系统信息("proc"是"Processes"的缩写)。
  12. /root:系统管理员用户的主目录。
  13. /sbin:存放系统管理员使用的系统管理程序(“s"的含义是"SuperUser”)。
  14. /srv:存放一些服务启动之后需要提取的数据("srv"是"service"的缩写)。
  15. /sys:系统文件。
  16. /tmp:用来存放一些临时文件("tmp"是"temporary"的缩写)。
  17. /usr:存放用户的应用程序和文件。("usr"是"unix shared resources"的缩写)。例如:
    /usr/bin:普通用户使用的应用程序。
    /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
    /usr/src:内核源代码默认的放置目录。
    /usr/local:额外安装软件所安装的目录,例如MySQL的默认安装路径/usr/local/mysql
  18. /var:存放着在不断扩充着的东西,我们可以将经常被修改的文件放在这个目录下,例如各种日志文件("var"是"Variable"的缩写)。

一切皆文件

在Linux中,有这么一句话,一切皆文件。我们来体会一下这句话。

设备是文件

在上文我们讨论了/dev文件夹,这个文件夹中就有机器的硬件设备信息。

示例代码:

1
ll /dev/

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

【部分运行结果略】

lrwxrwxrwx. 1 root root 11 Jul 2 18:11 core -> /proc/kcore
drwxr-xr-x. 4 root root 80 Jul 2 18:11 cpu
crw-------. 1 root root 10, 61 Jul 2 18:11 cpu_dma_latency
crw-------. 1 root root 10, 62 Jul 2 18:11 crash
drwxr-xr-x. 5 root root 100 Jul 2 18:11 disk

【部分运行结果略】

brw-r-----. 1 root kmem 1, 1 Jul 2 18:11 mem
drwxrwxrwt. 2 root root 40 Jul 2 18:11 mqueue
drwxr-xr-x. 2 root root 60 Jul 2 18:11 net
crw-------. 1 root root 10, 60 Jul 2 18:11 network_latency
crw-------. 1 root root 10, 59 Jul 2 18:11 network_throughput

我们看到有cpudiskmen
再看看cpu内部的东西,示例代码:

1
ll /dev/cpu

运行结果:

1
2
drwxr-xr-x. 2 root root 80 Jul  2 18:11 0
drwxr-xr-x. 2 root root 80 Jul 2 18:11 1

有两个文件夹,印证了CPU的配置,双核CPU。

进程是文件

在上文,我们讨论了/proc目录,这个目录的内容不在硬盘上而是在内存里。我们可以通过直接访问这个目录来获取系统信息,也可以直接修改里面的某些文件。

例如,禁PING,示例代码:

1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

如果想恢复,示例代码:

1
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

VIM

介绍

在讨论VIM之前,我们先提一下VIVI是Unix操作系统和类Unix操作系统中最通用的文本编辑器,所有的Linux系统都会内建VI编辑器。
VIMVI的增强版本,例如,可以根据文档类型(Java、Python、Shell、Properties),主动设置为字体设置颜色。

打开方式

VIM打开文件的三种常用方式:

  1. vim 文件路径:打开指定的文件。
  2. vim +数字 文件路径:打开指定的文件,并且将光标移动到指定行。
  3. vim +/关键词 文件路径:打开指定的文件,并且高亮显示关键词。

还有一种方式,确实不常用,vim 文件路径1 文件路径2 文件路径3:同时打开多个文件。

实际上这些都是"命令格式"的体现,在《2.命令》,我们会做更多讨论。

三种模式

  1. 一般模式
  2. 命令模式
  3. 编辑模式

一般模式

一般模式,也有资料称之为"一般命令模式",“正常模式”,“普通模式”,直接通过VIM命令打开文件,即进入一般模式。

示例代码:

1
vim A\ New\ Day\ Has\ Come-新的一天已经来临.txt
  • 解释说明:\的是空格转义。

光标移动

  1. 光标移动到行首:shift + 6(T字母上面的6,不要按小键盘的6)
  2. 光标移动到行尾:shift + 4(R字母的上面的4,不是小键盘的4)
  3. 光标移动到首行:g + g
  4. 光标移动到末行:G
  5. 向上翻屏:ctrl + b
  6. 向下翻屏:ctrl + f
  7. 光标移动到指定的行:数字 + G
  8. 向上/向下移动指定行:数字 + 数字 +
  9. 向左/向右移动指定字符:数字 + 数字 +

: + 数字,也可以移动光标至指定行,这个实际上是命令模式。

复制粘贴

粘贴的方法是:p

复制:

  1. 复制单个字符:y
  2. 复制当前行:y + y
  3. 复制多行:数字 + y + y,以当前行(包含当前行),向下复制指定的行。
  4. 可视化复制:
    1. 可视块:ctrl + vv小写,然后通过方向键来选中需要复制的区块,y进行复制。
    2. 可视行:ctrl + VV大写,然后通过方向键来选中需要复制的区块,y进行复制。
    3. 取消复制:esc + esc

剪切删除

严格意义上,只有剪切,没有删除。但是如果剪切之后不粘贴,就是删除。

  1. 剪切单个字符:
    1. 光标所在的被删除:x
    2. 光标所在的前一个被删除:Xd + delete的效果相同。
  2. 剪切/删除当前行:d + d
  3. 剪切/删除多行:数字 + d + d,以光标所在行为准(包含当前行),向下删除/剪切指定的行。
  4. 剪切/删除当前行的光标之后的内容:D
  5. 可视化删除,ctrl + v可视块,ctrl + V可视行;然后通过方向键来选中;D删除行,d删选中块。

撤销恢复

  1. 撤销:u
  2. 恢复:ctrl + r;恢复上一步的撤销操作。

: + u,也可以撤销,这个实际上是命令模式。

命令模式

该模式提供相关指令以完成读取、存盘、替换、退出VIM、显示行号等。

模式切换

  1. 进入命令模式::/或者?
    1. :是指令
    2. /?是搜索
  2. 退出命令模式:
    1. esc,需要大概1秒左右。
    2. esc + esc,立即退出。
    3. 删除命令行的所有字符(包括:)

保存

  1. 保存文件:: + w
  2. 另存为:: + w + 空格 + 路径

退出

退出文件:: + q

保存并退出

保存并且退出:: + w + q

强制

强制的符号:!
例如,强制退出,刚才做的修改操作不做保存:q + !

搜索

注意:区分大小写。

  1. 向光标之下搜索:/ + 关键词
  2. 向光标之上搜索:? + 关键词
  3. 在搜索结果中切换结果:N(上一个),n(下一个)
  4. 取消高亮:: + nohl(no highlight)

替换

  1. 替换光标所在行的第一处符合条件的内容:: + s + / + 关键词 + / + 新的内容
  2. 替换光标所在行的全部符合条件的内容:: + s + / + 关键词 + / + 新的内容 + / + g
  3. 替换整个文档中每行第一个符合条件的内容:: + % + s + / + 关键词 + / + 新的内容
  4. 替换整个文档的符合条件的内容:: + % + s + / + 关键词 + / + 新的内容 + / + g

解释说明:

  • s:String
  • %:整个文件
  • g:全局(global)

显示行号

  1. 显示:: + set nu
  2. 取消显示:: + set nonu

显示行号

代码着色

  1. 着色:: + syntax on
  2. 取消着色:: + syntax off

效果如图:
代码着色

编辑模式

编辑模式,也有资料称其为"插入模式"。

  1. 进入编辑模式
    1. i:在光标所在字符前开始插入。
    2. a:在光标所在字符后开始插入。
    3. o:在光标所在行的下面另起一新行插入。
    4. I:在光标所在行的行首开始插入,如果行首有空格则在空格之后插入。
    5. A:在光标所在行的行尾开始插入。
    6. O:在光标所在行的上面另起一行开始插入。
    7. S:刪除光标所在行并开始插入
  2. 退出编辑模式:esc

模式间的切换

模式间的切换

更多

异常退出

在编辑文件之后并没有正常的去wq(保存退出),而是直接关闭终端,再次打开文件,则会显示下面的效果,这个情况称之为异常退出。

异常退出

解决办法:将交换文件删除掉即可。

示例代码:

1
ls -a

运行结果:

1
2
3
4
5
6
7

【部分运行结果略】

Milan Milan 米兰米兰.txt
.Milan Milan 米兰米兰.txt.swp

【部分运行结果略】

删除.Milan Milan 米兰米兰.txt.swp,示例代码:

1
rm  -f .Milan Milan 米兰米兰.txt.swp

(当然未保存的内容也丢失了。)

退出方式

在上文我们讨论过,再VIM中退出编辑的文件可以使用: + q: + w + q
除了上面的这个语法之外,Vim还支持另外一个保存退出方法:: + x

x在文件没有修改的情况下,表示直接退出,在文件修改的情况下表示保存并退出。

而对于w + q的话,即使文件没有被修改,使用w + q进行退出的话,文件的修改时间也会被更新;但使用x则不存在这个问题。如果文件没有被修改,使用x进行退出的话,文件修改时间不会被更新的。
所以w + q容易混淆文件修改时间,但是x不会,所以建议使用x
(注意大小写,是x,不是XX是对文件进行加密)

修改jar包

  1. 用vim打开jar包
    示例代码:
    1
    vim test.jar
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8

    【部分运行结果略】

    mapper/mapper.xml
    mybatis-config.xml
    spring-mybatis.xml

    【部分运行结果略】
  2. 修改文件
    将光标移动到需要修改的文件,按下回车键,打开文件,进行修改。
  3. 保存文件
    : + w+ q保存文件。
  4. 退出jar包
    : + q + !退出jar包。

当我们需要紧急修改生产服务器上jar包时,这个小技巧会很有用。

中文乱码

解决步骤:

  1. 用vim打开.vimrc配置文件:

    1
    vim ~/.vimrc
  2. .vimrc中加入如下内容:

    1
    2
    3
    set termencoding=utf-8
    set encoding=utf8
    set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

    解释说明:

    • encoding是Vim内部使用的字符编码方式,一般设置为utf8。
    • termencoding是Vim所工作的终端(或者 Windows的Console窗口)的字符编码方式,一般设置为utf8。
    • fileencodings是Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式。
    • 这些设置需要set命令来进行设置生效。
  3. 执行:wq保存退出vim,再次用vim打开文件即可。

文章作者: Kaka Wan Yifan
文章链接: https://kakawanyifan.com/11001
版权声明: 本博客所有文章版权为文章作者所有,未经书面许可,任何机构和个人不得以任何形式转载、摘编或复制。

评论区