温故而知新,可以为师矣。好久没有再次系统学习 Linux 相关的知识了,总结回顾一下,为了更好的前进。

一、环境搭建

  环境的配置,是我们学习的基础。环境配置会用到的工具及环境:

(1) Inteelij IDEA 2019 + BashSupport插件
(2) Ubuntu 18.04(用的腾讯云服务器)
(3) Git Bash

1.全局配置bash解释器

2.配置bash shell 脚本运行解释器

二、Linux 文件

GitHub示例

1. Linux 内核的四种功能

(1)内存管理默认情况下,运行在Linux系统上的每个进程都有各自的内存页面;进程不能访问其他进程正在使用的内存页面。内核维护着自己的内存区域用户进程不能访问内核进程的内存可以创建一些共享内存页面,多个进程可在同一块共用内存区域进行读取和写入操作;内核负责维护和管理这块共用内存区域并控制每个进程访问这块共享区域。内核的系统内存管理主要是对1.物理内存和虚拟内存(交换空间)2.共享内存的管理
(2)软件程序管理内核创建第一个进程(init进程)来启动系统上所有其他进程内核启动时,将init加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码系统开机自动启动的进程通常位于专门的文件 /etc/inittab 或 /etc/init.d目录中运行级决定init进程运行/etc/inittab文件 或者 /etc/rcX.d目录中定义好的某些特定类型的进程。
(3)硬件管理Linux系统将硬件设备(需要在内核代码中加入其驱动程序代码)当成特殊的文件,称为设备文件,分三种:字符型块网络
(4)文件系统管理Linux内核支持多种不同类型的文件系统来从硬盘中读取或写入数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。Linux内核采用虚拟文件系统(VFS)作为和每个文件系统交互的标准接口。Linux的文件管理系统为:ext4文件管理系统文件管理系统:Fat文件管理系统Windows的文件管理系统:NTFS文件管理系统

GitHub示例

#!/usr/bin/env bash
# @File    :   ${NAME}
# @Time    :   2019/9/9 7:55
# @Author  :   Crisimple
# @Github :    https://crisimple.github.io/
# @Contact :   Crisimple@foxmail.com
# @License :   (C)Copyright 2017-2019, Micro-Circle
# @Desc    :   None# Linux 内核的四种功能# (1)内存管理
# 查看虚拟内存的当前状态
cat /proc/meminfo
# 查看当前系统版本
cat /etc/issue# (2)软件程序管理
# Linux内核创建第一个进程,称之为初始进程,该进程可在系统上启动所有其他进程(在Linux系统上正在运行的程序)
cat /etc/inittabs   #进程表
# 查看Linux系统中当前运行的进程
# PS,是Linux系统命令之一,是在Linux中是查看进程的命令。ps查看正处于Running的进程,ps aux查看所有的进程。
# 参数如下:
#       -e 显示所有进程。
#       -f 全格式。
#       -h 不显示标题。
#       -l 长格式。
#       -w 宽输出。
#       a 显示终端上的所有进程,包括其他用户的进程。
#       r 只显示正在运行的进程。
#       x 显示没有控制终端的进程。
#       --help 显示帮助信息。
#       --version 显示该命令的版本信息。
ps -ax  # 查看全部进程
ps -ef  # 查看全格式的全部进程
ps -ef | grep "进程名" # 查看并筛选 跟进程名有关的进程,该进程名可以是进程的全部或者部分# (3)硬件管理# (4)文件系统管理

2. 文件处理相关 bash

2.1 启动 shell

# (1) 查看系统用户账号组成列表,不同位分别代表:
#      用户名、用户密码、用户的系统用户ID编号、用户的系统组ID编号、用户全名、用户的默认主目录、用户的默认shell程序
cat /etc/passwd# (2) 修改用户启动项 --- shell 启动时加载项的配置文件
# sudo vi /etc/bash.bashrc
#       可自定义启动项:如环境的提示语类【echo -e "\t\t ************* WELCOME CRISIMPLE TO BACK HOME ***************"】
cat /etc/bash.bashrc# (3) 自定义 bash 命令提示符 --- shell 启动后 bash 显示配置文件
# sudo vi ~/.bashrc
# export PS1="Crisimple@129.28.170.125:~$"
cat ~/.bashrc

2.2 Linux 文件系统

#   /       --- 虚拟目录的根目录
#   /bin    --- 二进制目录,存储许多 GUN 用户级别的实用程序
#   /boot   --- 引导目录,存储引导文件
#   /dev    --- 设备目录,Linux 在该目录中创建设备节点
#   /home   --- 主目录,Linux 在该目录中创建用户目录
#   /lib    --- 库目录,存储系统和应用程序库文件
#   /media  --- 媒体目录,可移动设备媒体常用的挂在点
#   /mnt    --- 挂载目录,另一个可移动设备媒体常用的挂在点
#   /opt    --- 可选目录,常用于存储可选软件包
#   /root   --- 根目录
#   /sbin   --- 系统二进制目录,存储许多 GUN 管理级别的实用程序
#   /temp   --- 临时文件,可以在目录中创建或销毁临时工作文件
#   /usr    --- 用户安装软件的目录
#   /var    --- 可变目录,用于经常更改的文件,如日志文件

2.3 文件过滤输出显示

ls -l --time=atime file_name        # 查看文件的访问时间
ls -l file_*                        # 【*代表零个或多个字符】查看文件名开头为 file_ 的所有文件
ls -l file_?                        # 【?代表一个字符】查看文件名开头为 file_ 的所有文件
ls -l file_[ai]pt                   # 文件扩展[]中的a和i字符都匹配
ls -l file_[a-i]pt                   # 文件扩展[]中的a-i字符都匹配
ls -F                               # 查看区分文件和目录
ls -a                               # 显示所有文件和目录,包括隐藏文件和目录
ls -FR                              # 显示文件和文件的递归项
ls -l
# 显示长列表
#   文件类型【目录:d;文件:-;字符型文件:c;或块设备:b】
#   文件权限
#   文件的硬链接总数
#   文件属主的用户名
#   文件属主的组名
#   文件的大小(以直接为单位)
#   文件的上次修改时间
#   文件名或目录名

2.4 处理文件

# (1) 创建文件
touch create_file
# (2) 复制文件
cp create_file copy_create_file
cp -i source_file copy_create_file
# (3) 链接文件# ·符号链接---两个通过符号链接在一起的文件,彼此的内容并不相同,也就是两个文件ln -s create_file copy_create_file# ·硬链接---会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。ln create_file copy_create_file
# (4) 重命名文件 --- inode编号和时间戳保持不变
mv create_file mv_create_file
ls -il mv_create_file
# (5) 删除文件
rm -i mv_create_file
ls -l mv_create_file
mkdir create_floder
rm -i rf create_floder

2.5 处理目录

# (1)创建目录
#       创建但目录mkdir create_floder_twols -ld create_floder_two
#       创建多个目录和子目录mkdir -p test1/test2/test3ls -R test1
# (2) 删除目录
touch new_dir/my_file
ls -li new_dir/
rm -i new_dir/my_file
ls -ld new_dir
rm -rf new_dir/my_file
ls -ld new_dir

2.6 查看文件内容

# (1) 查看文件类型
touch new_file
file new_file
mkdir new_dir
file new_dir
# (2) 查看整个文件cat new_file# -n 参数给所有行加上行号cat -n new_file# -b 参数只给有文本的行加上行号cat -b new_file# 不然制表符出现使用参数 —T# -T参数会用^I字符组合去替换文中的所有制表符。cat -T new_file# 分页文件查看more /etc/bashrc.bash# 分屏显示文件查看less /etc/bashrc.bash
# (3) 查看部分文件# tail 显示文件最后几行的内容,默认情况下显示文件末尾的10行tail new_file# tail -n 参数控制显示文件的第多少行的显示tail -2 new_file# tail -f 实时监测系统日志tail -f new_file.log# ---------------------------# tail 显示文件前几行的内容,默认情况下显示文件开始的10行head new_file# head -n 参数控制显示文件的第多少行的显示head -2 new_file

三、Bash shell

  shell命令有常用的三种风格形式:

(1)Unix 类型参数,前面有一短划线(-A  显示所有进程)
(2)BSD 类型参数,前面没有有短划线(T  显示与该终端的相关的所有进程)
(3)GNU长参数,前面有双短划线(--forest  在层次结构清单中显示进程,以显示父进程)

GitHub示例

1.监测程序

1.1 探测进程

# 显示进程之间的层次信息
ps --forest
# 显示系统上的进程,并扩展输出
ps -ef
# 显示帮助信息
ps --help
# 显示调试信息
ps --info
# 显示 ps 程序的版本
ps --version
# 显示所有进程并进行过滤显示
ps -aux | grep PID
# 长格式输出,长格式输出的各参数的含义
ps -l
#       F:内核分配给进程的系统标记
#       S:进程状态【O-正在进行;S-休眠;R-可运行,正在等待;Z-进程僵化;T-停止】
#       PRI:进程的优先级(越大的数字代表越低的优先级)
#       NI:谦让度值用来参与决定优先级
#       ADDR:进程的内存地址
#       SZ:假如进程被换出,所需交换空间的大致大小
#       WCHAN:进程休眠的内核函数的地址

1.2 实时监测进程

# 显示实时进程的概要信息
top
#   top 输出列表字段信息含义
#   PID:进程的ID
#   USER:进程属主的名字
#   PR:进程的优先级
#   NI:进程的谦让度值
#   VIRT:进程占用的虚拟内存的总量
#   RES:进程占用的物理内存总量
#   SHR:进程和其他进程共享的内存总量
#   S:进程的状态【D-休眠状态;R-运行状态;S-休眠状态;T-停止状态;Z-僵化状态】
#   %CPU:进程使用的CPU时间比例
#   %MEM:进程使用的内存占可用内存的比例
#   TIME+:自进程启动到目前为止的CPU时间总量
#   COMMAND:进程所对应的命令行名称,也就是启动的程序名# 在 top 实时监测可使用的命令t       # 切换到 cpu 信息行显示o       # 更改信息列的显示顺序k       # 杀死特定的进程q       # 退出 top 命令

1.3 结束进程

  Linux进程信号:

信号 名称 描述
1 HUG 挂起
2 INT 中断
3 QUIT 结束运行
9 KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP 停止或暂停,但继续在后台运行
19 CONT 在STOP或TSTP之后恢复执行
# kill 命令
kill PID
# 如果要强制终止,-s参数支持指定其他信号(用信号名或信号值)
kill -s HUP PID
# killall 命令
kill "进程名(支持通配符,如:http*)"

2.监测磁盘空间

2.1 挂载存储媒体

  Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒
体之前,需要把它放到虚拟目录下。这项工作称为挂载(mounting)。

# 显示当前系统挂载的设备列表
mount
# type参数指定了磁盘被格式化的文件系统类型(vfat/ntfs/iso9660)
mount -t type device directory
# mount 挂载参数详解# -a 挂载/etc/fstab文件中指定的所有文件系统  "# -f 使mount命令模拟挂载设备,但并不真的挂载 "# -F 和-a参数一起使用时,会同时挂载所有文件系统 "# -v 详细模式,将会说明挂载设备的每一步 "# -I 不启用任何/sbin/mount.filesystem下的文件系统帮助文件 "# -l 给ext2、ext3或XFS文件系统自动添加文件系统标签 "# -n 挂载设备,但不注册到/etc/mtab已挂载设备文件中 "# -p num 进行加密挂载时,从文件描述符num中获得密码短语 "# -s 忽略该文件系统不支持的挂载选项 "# -r 将设备挂载为只读的 "# -w 将设备挂载为可读写的(默认参数) "# -L label 将设备按指定的label挂载 "# -U uuid 将设备按指定的uuid挂载 "# -O 和-a参数一起使用,限制命令只作用到特定的一组文件系统上 "# -o 给文件系统添加特定的选项 "
# umount命令 umount命令支持通过设备文件或者是挂载点来指定要卸载的设备。如果有任何程序正在使用设备上的文件,系统就不会允许你卸载它
umount [directory | device ]
# 如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。
lsof /path/to/device/node
# 或者
lsof /path/to/mount/point

2.2 使用 df 命令

# 2.2 使用 df 命令
# df  --- df命令可以让你很方便地查看所有已挂载
df
# 相关字段的含义:
#        设备的设备文件位置;
#        能容纳多少个1024字节大小的块;
#        已用了多少个1024字节大小的块;
#        还有多少个1024字节大小的块可用;
#        已用空间所占的比例;
#        设备挂载到了哪个挂载点上。
# 参数是-h,它会把输出中的磁盘空间按照用户易读的形式显示
df -h

2.3 使用 du 命令

# 2.3 使用 du 命令
# du命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,它会以磁盘块为单位来表明每个文件或目录占用了多大存储空间
du
# 相关字段的含义:
#        -c:显示所有已列出文件总的大小。
#        -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节。
#        -s:显示每个输出参数的总计

3.处理数据文件

# 3.1 排序数据
# 对数据进行排序-默认语言的排序规则对文本文件中的数据行排序
# -n按值排序;-M按月排序
sort
# -----------------------------------------------------------------------------------------
# 3.2 搜索数据
# grep [options] pattern [file];-v反向搜索;-n显示匹配模式的行所在的行号;"
# grep 要搜索的内容 目标文件
grep -h maven ./ --max-depth=1
# grep命令可以对文件进行搜索
grep aa file1   # 搜索包含 aa 的文本
grep 1 file1   # 搜索包含 t 的文本
# 反转搜索
grep -v t file1
# 想要获取与模式匹配的数据所在的行号,可以使用 -n
grep -n t file1
# 如果只需要了解有多少包含匹配模式可以用-c
grep -c t file1
# 如果需要指定多个匹配模式,可以使用-e
grep -e t file1 -e 1 file1
# 查找包含t或f字符的数据
grep [tf] file1
# -----------------------------------------------------------------------------------------
# 3.3 压缩数据-----压缩工具:gzip(.gz);zip(.zip)"
#       gzip: 用来压缩文件"
#       gzcat: 用来查看压缩过的文本文件的内容"
#       gunzip: 用来解压文件"
# bxip2工具
#     bxip2:用于压缩文件
#     bzcat:用于显示已压缩的的文件内容
#     bunzip2:用于解压.bz2文件
#     bzip2recover:用于尝试恢复受损的压缩文件
#     $bzip2 文件名
# gzip工具
#     gzip:  用于压缩文件
#     gzcat:用于显示已压缩的的文件内容
#     gunzip:用于解压文件
#     gzip 文件名
#     gzip 可以指定多个文件或者使用通配符一次压缩多个文件
#     gzip my*
# zip工具
#  zip:用于创建包含列出文件和目录的压缩文件
#  zipcloak:用于创建包含列出文件和目录的压缩加密文件
#  zipnote:用于提取zip文件中注释
#  z ipsplit:用于将zip文件分割成指定大小的多个小文件
#  unzip:用于提取压缩zip文件中的文件和目录
#  zip工具的强之处在于能够将文件的整个目录压缩为一个文件
#  zip -r testzip test
# -----------------------------------------------------------------------------------------
# 3.4 归档数据---tar命令【格式:tar function [options] object1 object2 ... 】"
#  tar命令含义:
# -A --concatenate 将一个已有tar归档文件追加到另一个已有tar归档文件"
# -c --create 创建一个新的tar归档文件"
# -d --diff 检查归档文件和文件系统的不同之处"
# --delete 从已有tar归档文件中删除 -r"
# --append 追加文件到已有tar归档文件末尾"
# -t --list 列出已有tar归档文件的内容"
# -u --update 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中"
# -x --ext
# -C dir 切换到指定目录 "
# -f file 输出结果到文件或设备file "
# -j 将输出重定向给bzip2命令来压缩内容 "
# -p 保留所有文件权限 "
# -v 在处理文件时显示文件 "
# -z 将输出重定向给gzip命令来压缩内容 "
#  tar命令用于将文件归档
tar function [options] object1 object2 ...
#  创建一个名称为test.tar的归档文件,其中包含test1目录和test2目录的内容
tar -cvf test.tar test1/ test2
#  列出文件内容但不解压
tar -tf test.tar
#  解压文件内容
tar -xvf test.tar

四、理解 shell

GitHub示例

1. shell的类型

#!/usr/bin/env bash
# @File    :   04_understand_shell.sh
# @Time    :   2019/9/14 10:29
# @Author  :   Crisimple
# @Github :    https://crisimple.github.io/
# @Contact :   Crisimple@foxmail.com
# @License :   (C)Copyright 2017-2019, Micro-Circle
# @Desc    :   None# 1. shell的类型
# 查看用户的默认shell程序
cat /etc/passwd
ls /bin/bash
# 启动bash shell
/bin/bash
bash
exit
#   Shell 的类型
#       Ubuntu 的 GUN bash shell
#       CentOS 的 tcsh shell
#       Debian 的 ash shell

2. shell的父子关系

  在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。子 shell并非真正的多进程处理,因为终端控制着子shell的I/O。

ps -f
bash
bash
bash
# 展示 shell 之间的嵌套结构
ps --forest
# 通过 PPID 列可以显示出是谁的父进程
ps -f
# 退出进程
exit

2.1 进程列表

# 在一行中指定要一次运行的一系列命令,命令之间用英文分号隔开pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls
# 实现命令列表实现要将命令放在括号中执行,生成了一个子 shell 来执行对应的命令
(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
# 查看 "命令列表" 是否生成了子 shell,使用命令 echo $BASH_SUBSHELL;(如果返回是0,就表明没有子shell;如果返回1或者更大的数字,就表明存在子 shell)
(pwd; echo $BASH_SUBSHELL)

2.2 特殊的 shell 用法

  在交互式的shell CLI中,还有很多更富有成效的子shell用法。进程列表、协程和管道都利用了子shell。它们都可以有效地在交互式shell中使用。

  在交互式shell中,一个高效的子shell用法就是使用后台模式。

(1)后台模式

# 会话暂停10s,后台模式等待
sleep 10&
# 查看后台作业, -l显示出命令的PID
jobs -l

(2) 将进程列表置入后台

(sleep 2; echo $BASH_SUBSHELL; sleep 2)&

  将进程列表置入后台模式并不是子shell在CLI中仅有的创造性用法。协程就是另一种方法。

(3) 协程

  协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。

  要进行协程处理,得使用 coproc 命令,还有要在子shell中执行的命令。

coproc My_Job {sleep 10;}
iobs
ps --forest

3. shell的内建命令

3.1 外部命令

  外部命令,也被称为文件系统命令,是存在于 bash shell 之外的程序。外部程序通常位于/bin、/usr/bin、/sbin或/usr/sbin/中。

  当外部命令执行时,会创建出一个子进程,这种操作被称为衍生(forking);例如:ps

which ps
type -a ps
ps
ps -f

3.2 内建命令

  内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。

type cd
type exit
# echo 和 pwd 既有内建命令,也有外建命令
# which只显示外键命令,type -a 既显示内建命令也显示外键命令
which echo
type -a echo
which pwd
type -a pwd
# (1) history命令
history
## !!+回车 --- 显示上一条命令记录
## !20 --- 显示编号为20的命令记录
# 命令历史记录会被写进 .bash_history
cat .bsah_histroy
# (2) 命令命名
# 查看当前可用的别名
alias -p
# 自定义别名
alias li ='ls -li'

五、环境变量

1. 环境变量

  全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的 shell 可见。

  系统环境变量基本上都使用全大写字母,以区别于普通用户的环境变量。
GitHub示例

1.1 全局环境变量

# 1.1 全局环境变量
# 查看全局变量
env
printenv
# 显示个别环境变量的值
printenv HOME
echo $HOME
ls $HOME
# 全局环境变量可用于进程的所有子 shell
bash
ps -ef
echo $HOME
exit

1.2 局部环境变量

  局部环境变量只能在定义它们的进程中可见。在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

set

  set 命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序。env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env和printenv的输出是重复的。

2. 自定义环境变量

2.1 设置局部用户定义变量

# 2.1 设置局部用户定义变量
# 通过等号给环境变量复制,值可以时数字或字符串
my_variable='hello world'
echo $my_variable
# 设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。
bash
echo $my_variable
exit
echo $my_variable

2.2 设置全局环境变量

# 2.2 设置全局环境变量
# 创建全局环境变量的方法先创建一个局部环境变量,然后再把它导出到全局环境中。
my_global_variable='I am Global now'
bash
echo $my_global_variable
exit
export my_global_variable
echo $my_global_variable
bash
echo $my_global_variable
exit
echo $my_global_variable

3. 删除环境变量

# 3. 删除环境变量
# 既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用unset命令完成这个操作。在unset命令中引用环境变量时,记住不要使用$
# 承接2.2中的全局变量赋值
echo $my_global_variable
unset my_global_variable
echo $my_global_variable

4. 默认的 shell 环境变量

# CDPATH              冒号分隔的目录列表,作为cd命令的搜索路径
# HOME                当前用户的主目录
# IFS shell           用来将文本字符串分割成字段的一系列字符
# MAIL                当前用户收件箱的文件名(bash shell会检查这个文件,看看有没有新邮件)
# MAILPATH            冒号分隔的当前用户收件箱的文件名列表(bash shell会检查列表中的每个文件,看看有没有新邮件)
# OPTARG getopts      命令处理的最后一个选项参数值
# OPTIND getopts      命令处理的最后一个选项参数的索引号
# PATH shell          查找命令的目录列表,由冒号分隔
# PS1 shell           命令行界面的主提示符
# PS2 shell           命令行界面的次提示符
# ...
# BASH                      当前shell实例的全路径名 "
# BASH_ALIASES              含有当前已设置别名的关联数组 "
# BASH_ARGC                     含有传入子函数或shell脚本的参数总数的数组变量 "
# BASH_ARCV                     含有传入子函数或shell脚本的参数的数组变量 "
# BASH_CMDS                     关联数组,包含shell执行过的命令的所在位置 "
# BASH_COMMAND              shell正在执行的命令或马上就执行的命令 "
# BASH_ENV                  设置了的话,每个bash脚本会在运行前先尝试运行该变量定义的启动文件 "
# BASH_EXECUTION_STRING     使用bash -c选项传递过来的命令 "
# BASH_LINENO               含有当前执行的shell函数的源代码行号的数组变量 "
# BASH_REMATCH              只读数组,在使用正则表达式的比较运算符=~进行肯定匹配(positive match)时, 包含了匹配到的模式和子模式 B "
# ASH_SOURCE                含有当前正在执行的shell函数所在源文件名的数组变量 "
# BASH_SUBSHELL                 当前子shell环境的嵌套级别(初始值是0) "
# BASH_VERSINFO                 含有当前运行的bash shell的主版本号和次版本号的数组变量 "
# BASH_VERSION              当前运行的bash shell的版本号 "
# BASH_XTRACEFD                 若设置成了有效的文件描述符(0、1、2),则'set -x'调试选项生成的跟踪输出 可被重定向。通常用来将跟踪输出到一个文件中 "
# BASHOPTS                  当前启用的bash shell选项的列表 "
# BASHPID                   当前bash进程的PID COLUMNS 当前bash shell实例所用终端的宽度 "
# COMP_CWORD                COMP_WORDS变量的索引值,后者含有当前光标的位置 "
# COMP_LINE                     当前命令行 "
# COMP_POINT                当前光标位置相对于当前命令起始的索引 "
# COMP_KEY                  用来调用shell函数补全功能的最后一个键 "
# COMP_TYPE                     一个整数值,表示所尝试的补全类型,用以完成shell函数补全 "
# COMP_WORDBREAKS           Readline库中用于单词补全的词分隔字符 "
# COMP_WORDS                含有当前命令行所有单词的数组变量 "
# COMPREPLY                     COPROC 含有由shell函数生成的可能填充代码的数组变量 占用未命名的协进程的I/O文件描述符的数组变量 "
# DIRSTACK                  含有目录栈当前内容的数组变量 "
# EMACS                         设置为't'时,表明emacs shell缓冲区正在工作,而行编辑功能被禁止 "
# ENV                       如果设置了该环境变量,在bash shell脚本运行之前会先执行已定义的启动文件(仅 用于当bash shell以POSIX模式被调用时) "
# EUID                      当前用户的有效用户ID(数字形式) "
# FCEDIT                    供fc命令使用的默认编辑器 "
# FIGNORE                   在进行文件名补全时可以忽略后缀名列表,由冒号分隔 "
# FUNCNAME                  当前执行的shell函数的名称  "
# FUNCNEST                  当设置成非零值时,表示所允许的最大函数嵌套级数(一旦超出,当前命令即被终止)  "
# GLOBIGNORE                冒号分隔的模式列表,定义了在进行文件名扩展时可以忽略的一组文件名  "
# GROUPS                    含有当前用户属组列表的数组变量  "
# histchars                     控制历史记录扩展,最多可有3个字符  "
# HISTCMD                   当前命令在历史记录中的编号  "
# HISTCONTROL               控制哪些命令留在历史记录列表中  "
# HISTFILE                  保存shell历史记录列表的文件名(默认是.bash_history)  "
# HISTFILESIZE              HISTTIMEFORMAT 最多在历史文件中存多少行 如果设置了且非空,就用作格式化字符串,以显示bash历史中每条命令的时间戳  "
# HISTIGNORE                由冒号分隔的模式列表,用来决定历史文件中哪些命令会被忽略  "
# HISTSIZE                  最多在历史文件中存多少条命令  "
# HOSTFILE                  shell在补全主机名时读取的文件名称  "
# HOSTNAME                  当前主机的名称  "
# HOSTTYPE                  当前运行bash shell的机器  "
# IGNOREEOF                     shell在退出前必须收到连续的EOF字符的数量(如果这个值不存在,默认是1)  "
# INPUTRC                   Readline初始化文件名(默认是.inputrc)  "
# LANG                      shell的语言环境类别 LC_ALL 定义了一个语言环境类别,能够覆盖LANG变量  "
# LC_COLLATE                设置对字符串排序时用的排序规则  "
# LC_CTYPE                  决定如何解释出现在文件名扩展和模式匹配中的字符  "
# LC_MESSAGES               在解释前面带有\$的双引号字符串时,该环境变量决定了所采用的语言环境设置  "
# LC_NUMERIC                决定着格式化数字时采用的语言环境设置  "
# LINENO                    当前执行的脚本的行号  "
# LINES                         定义了终端上可见的行数  "
# MACHTYPE                  用“CPU?公司?系统”(CPU-company-system)格式定义的系统类型  "
# MAPFILE                   一个数组变量,当mapfile命令未指定数组变量作为参数时,它存储了mapfile所读入的文本  "
# MAILCHECK                     shell查看新邮件的频率(以秒为单位,默认值是60)  "
# OLDPWD                    shell之前的工作目录 OPTERR 设置为1时,bash shell会显示getopts命令产生的错误  "
# OSTYPE                    定义了shell所在的操作系统  "
# PIPESTATUS                含有前台进程的退出状态列表的数组变量  "
# POSIXLY_CORRECT           设置了的话,bash会以POSIX模式启动  "
# PPID                      bash shell父进程的PID PROMPT_COMMAND 设置了的话,在命令行主提示符显示之前会执行这条命令  "
# PROMPT_DIRTRIM            用来定义当启用了\w或\W提示符字符串转义时显示的尾部目录名的数量。被删除的 目录名会用一组英文句点替换  "
# PS3                       select命令的提示符   "
# PS4                       如果使用了bash的-x选项,在命令行之前显示的提示信息 "
# PWD                       当前工作目录 RANDOM 返回一个0~32767的随机数(对其的赋值可作为随机数生成器的种子) "
# READLINE_LINE                 当使用bind –x命令时,存储Readline缓冲区的内容 "
# READLINE_POINT            当使用bind –x命令时,表示Readline缓冲区内容插入点的当前位置 "
# REPLY                         read命令的默认变量 "
# SECONDS                   自从shell启动到现在的秒数(对其赋值将会重置计数器) "
# SHELL                         bash shell的全路径名 SHELLOPTS 已启用bash shell选项列表,列表项之间以冒号分隔 "
# SHLVL                         shell的层级;每次启动一个新bash shell,该值增加1 "
# TIMEFORMAT                指定了shell的时间显示格式 "
# TMOUT                         select和read命令在没输入的情况下等待多久(以秒为单位)。默认值为0,表示 无限长 TMPDIR 目录名,保存bash shell创建的临时文件 UID 当前用户的真实用户ID "

5. 设置 PATH 环境变量

# 5. 设置 PATH 环境变量
# PATH中各个目录之间使用冒号分隔的
echo $PATH
PATH=$PATH:/home/ubuntu/Scripts
echo $PATH

6. 定位系统环境变量

# 6.1 登录 shell
#   登录Linux系统时,bash shell会作为登录shell启动。会从5个启动文件里读取命令
# /etc/profile                  系统上默认的 bash shell 的主启动文件
# $HOME/.bash_profile
# $HOME/.bashrc
# $HOME/.bash_login
# $HOME/.profile
# 6.2 交互式 shell 进程
#       交互式shell不会访问 /etc/profile 文件,只会检查用户 HOME目录中的 .bashrc文件
# 6.3 非交互式 shell 进程
#       bash shell提供了BASH_ENV环境变量[printenv BASH_ENV]"
# 6.4 环境变量持久化
#       在 /etc/profile.d目录中创建一个以 .sh 结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。
#       存储个人用户永久性 bash shell 变量的地方 $HOME/.bashrc文件中,从而达到永久化。

7. 数组变量

# 给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔
my_test_variable = (one two three four five)
echo $my_test_variable
echo ${my_test_variable[2]}
echo ${my_test_variable[*]}
my_test_variable[2]=2
echo ${my_test_variable[*]}
unset my_test_variable[2]
echo ${my_test_variable[*]}

六、Linux文件权限

GitHub示例

1. Linux的安全性

1.1 /etc/passwd文件

# (1) /etc/passwd文件  --- 将用户的登录名匹配到对应的UID值
cat /etc/passwd
# mysql:x:113:117:MySQL Server,,,:/nonexistent:/bin/false
# 对应字段的含义分别是:
#       登录用户名
#       用户密码:x --- 代表密码字段
#       用户账户的UID形式
#       用户组的GID形式
#       用户账号的备注
#       用户HOME目录的位置
#       用户的默认 shell

1.2 /etc/shadow文件 — Linux系统密码管理

sudo cat /etc/shadow
# mysql:!:18144:0:99999:7:::
# 对应字段的含义分别是:
#       与/etc/passwd文件中的登录名字段对应的登录名
#       加密后的密码
#       自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
#       多少天后才能更改密码
#       多少天后必须更改密码
#       密码过期前提前多少天提醒用户更改密码
#       密码过期后多少天禁用用户账户
#       用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
#       预留字段给将来使用

1.3 useradd — 添加新用户

# 系统默认值被设置在/etc/default/useradd文件中。可以使用加入了-D选项的useradd命令查看所用Linux系统中的这些默认值。
/usr/sbin/useradd -D
# 对应字段的含义分别是:
#       新用户会被添加到GID为100的公共组;
#       新用户的HOME目录将会位于/home/loginname;
#       新用户账户密码在过期后不会被禁用;
#       新用户账户未被设置过期日期;
#       新用户账户将bash shell作为默认shell;
#       系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
#       系统为该用户账户在mail目录下创建一个用于接收邮件的文件
# 创建一个新用户账号, 并查看新用户的 HOME 目录
useradd -m test
ls -al /home/test
# useradd 命令行参数
#       -c comment          给新用户添加备注
#       -d home_dir         为主目录指定一个名字(如果不想用登录名作为主目录名的话)
#       -e expire_date      用YYYY-MM-DD格式指定一个账户过期的日期
#       -f inactive_days    指定这个账户密码过期后多少天这个账户被禁用;0表示密码一过期就立即禁用,1表示 禁用这个功能
#       -g initial_group    指定用户登录组的GID或组名
#       -G group ...        指定用户除登录组之外所属的一个或多个附加组
#       -k                  必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录
#       -m                  创建用户的HOME目录
#       -M                  不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项)
#       -n                  创建一个与用户登录名同名的新组
#       -r                  创建系统账户
#       -p                  passwd 为用户账户指定默认密码
#       -s                  shell 指定默认的登录shell
#       -u                  uid 为账户指定唯一的UID
# useradd 更改默认值的参数
#       -b default_home         更改默认的创建用户HOME目录的位置
#       -e expiration_date      更改默认的新账户的过期日期
#       -f inactive             更改默认的新用户从密码过期到账户被禁用的天数
#       -g group                更改默认的组名称或GID
#       -s shell                更改默认的登录shell

1.4 userdel — 删除用户

sudo /usr/sbin/userdel test         # 从系统中删除用户
sudo /usr/sbin/userdel -r test      # 删除用户的HOME目录以及邮件目录

1.5 修改用户信息

# usermod  --- 修改用户
#   usermod 命令行参数
#       -l      修改用户账户的登录名。
#       -L      锁定账户,使用户无法登录。
#       -p      修改账户的密码。
#       -U      解除锁定,使用户能够登录。
# passwd 和 chpasswd --- 修改用户密码
sudo passwd -e test      # -e 参数下次登录时修改密码,只有 root 权限用户才有权限改别人的密码
sudo chpasswd < users.txt    # 修改大量用户的密码(重定向文件的格式:userid:passwd)
# chsh、chfn、chage
#   chsh --- chsh命令用来快速修改默认的用户登录shell
sudo chsh -s /bin/csh test
#   chfn --- 在/etc/passwd文件的备注字段中存储信息的标准方法
sudo chfn test
#   chage --- 帮助管理用户账号的有效期
sudo chage -d 10 test
#       -d 设置上次修改密码到现在的天数
#       -E 设置密码过期的日期
#       -I 设置密码过期到锁定账户的天数
#       -m 设置修改密码之间最少要多少天
#       -W 设置密码过期前多久开始出现提醒信息

2. Linux用户组

  组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。

2.1 /etc/group文件 — 系统上每个组的信息

grep test /etc/group
# 对应字段的含义分别是:
#       组名
#       组密码
#       GID
#       属于组的用户列表

2.2 创建新组

# 创建新组时,默认没有用户被分配到该组
sudo /usr/sbin/groupadd test_group
tail /etc/group
# 可以用usermod命令将用户添加到组中; -g 会删除默认组;-G 会保留默认组
sudo /usr/sbin/usermod -G test_group test
tail /etc/group

2.3 修改组

#   -n      修改组的组名
#   -g      修改组的GID
sudo /usr/sbin/groupmod -n test_group_mod test_group
tail /etc/group

3. 文件权限

# 3.1 文件权限符
#  第一段字符代表:
#        -  代表文件
#        d  代表目录
#        l  代表链接
#        c  代表字符型设备
#        b  代表块设备
#        n  代表网络设备
#  第二段字符代表,每三段代表对应对象的3个安全级别:
#        r  代表对象是可读的
#        w  代表对象是可写的
#        x  代表对象是可执行的
#   对象的属主
#   对象的属组
#   系统其他用户
# 3.2 默认文件权限
touch new_file
ls -al newfile
# umask命令用来设置所创建文件和目录的默认权限
umask

4. 更改文件权限

4.1 改变权限

#   八进制形式权限
chmod 760 newfile
ls -al newfile
#   符合模式权限
#       u --- 用户
#       g --- 用户组
#       o --- 其他用户
#       a --- 代表上面所有
#       + --- 现有权限基础上增加权限
#       - --- 现有权限基础上移除权限
#       = --- 将权限设置成后面的值
#       X:如果对象是目录或者它已有执行权限,赋予执行权限
#       s:运行时重新设置UID或GID
#       t:保留文件或目录
#       u:将权限设置为跟属主一样
#       g:将权限设置为跟属组一样
#       o:将权限设置为跟其他用户一样
chmod u+x newfile

4.2 改变所属关系

# chown命令用来改变文件的属主
sudo touch newfile
ls -al newfile
chown test newfile
ls -al newfile
# chgrp命令用来改变文件的默认属组。
sudo chgrp test_group_mod newfile
ls -al newfile

5. 共享文件

  Linux系统上共享文件的方法是创建组。创建新文件时,Linux会用你默认的UID和GID给文件分配权限。

#   设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
#   设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中 创建的新文件会以目录的默认属组作为默认属组。
#   粘着位:进程结束后文件还驻留(粘着)在内存中。
sudo mkdir test_dir
sudo chgrp test test_dir
ls -al test_dir/

七、管理文件系统

GitHub示例

1. Linux 文件系统

# 1.1 基本文件系统
#       ext文件系统     --- 索引节点系统在每个物理设备中创建一个单独的表来存储文件信息
#       ext2文件系统    --- 增加了访问文件的大小;将磁盘分组减少碎片化,提高访问速度
# 1.2 日志文件系统
#       ext3文件系统    --- 只将索引节点信息写入日志文件,直到数据块都被成功写入存储设备才删除
#       ext4文件系统    --- Ubuntu的默认文件系统,。区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置
#       Reiser文件系统  --- ReiserFS文件系统只支持回写日志模式——只把索引节点表数据写到日志文件
#       JSF文件系统     --- JFS文件系统采用的是有序日志方法,即只在日志中保存索引节点表数据,直到真正的文件数据被写进存储设备时才删除它
#       XFS文件系统     --- XFS文件系统采用回写模式的日志,XFS文件系统还允许在线调整文件系统的大小
# 1.3 写时复制文件系统
#       ZFS文件系统
#       Btrf文件系统

2. 操作文件系统

# 2. 操作文件系统
# 2.1 fdisk创建分区
# fdisk 命令参数的含义:
#       a   设置活动分区标志 "
#       b   编辑BSD Unix系统用的磁盘标签 "
#       c   设置DOS兼容标志 "
#       d   删除分区 "
#       l   显示可用的分区类型"
#       m   显示命令选项"
#       n   添加一个新分区"
#       o   创建DOS分区表"
#       p   显示当前分区表"
#       q   退出,不保存更改"
#       s   为Sun Unix系统创建一个新磁盘标签"
#       t   修改分区的系统ID"
#       u   改变使用的存储单位 "
#       v   验证分区表 "
#       w   将分区表写入磁盘 "
#       x   高级功能 "
# 2.2 创建文件系统
#       mkefs       创建一个ext文件系统
#       mke2fs      创建一个ext2文件系统
#       mkfs.ext3   创建一个ext3文件系统
#       mkfs.ext4   创建一个ext4文件系统
#       mkreiserfs  创建一个ReiserFS文件系统
#       jfs_mkfs    创建一个JFS文件系统
#       mkfs.xfs    创建一个XFS文件系统
#       mkfs.zfs    创建一个ZFS文件系统
#       mkfs.btrfs  创建一个Btrfs文件系统
#       type mkfs.ext4  # 查看某个文件系统是否可用
#       mkdir命令(参见第3章)在虚拟目录中创建了挂载点,mount命令将新的硬盘分区添加到挂载点。
#       mount命令的-t选项指明了要挂载的文件系统类型(ext4)
# 2.3 fsck文件系统的检查与修复
# fsck 命令参数的含义:
#       -a 如果检测到错误,自动修复文件系统
#       -A 检查/etc/fstab文件中列出的所有文件系统
#       -C 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)
#       -N 不进行检查,只显示哪些检查会执行
#       -r 出现错误时提示
#       -R 使用-A选项时跳过根文件系统
#       -s 检查多个文件系统时,依次进行检查
#       -t 指定要检查的文件系统类型
#       -T 启动时不显示头部信息
#       -V 在检查时产生详细输出
#       -y 检测到错误时自动修复文件系统

3. 逻辑卷管理

# 3. 逻辑卷管理
# 3.1 逻辑卷管理布局
#       硬盘为物理卷PV;多个物理卷形成卷组VG;整个系统的最后一层是逻辑卷LV
# 3.2 Linux 中的 LVM
#       快照:Linux LVM允许你在逻辑卷在线的状态下将其复制到另一个设备
#       条带化:可跨多个物理硬盘 创建逻辑卷
#       镜像:涉及大量数据变动的,镜像是一个实时更新的逻辑卷的完整副本
# 3.3 使用Linux LVM
# (1) 定义物理卷
#       将硬盘上的物理分区转换成Linux LVM使用的物理卷区段,fdisk命令;
#       用分区来创建实际的物理卷,pvcreate命令;
#       查看创建进度的话,用pvdisplay命令
# (2) 创建卷组
#       从命令行创建卷组,需要使用vgcreate命令;
#       看新创建的卷组的细节,可用vgdisplay命令
# (3) 创建逻辑卷
# 要创建逻辑卷,使用lvcreate命令,可配合使用的参数的含义:
#       -c --chunksize 指定快照逻辑卷的单位大小
#       -C --contiguous 设置或重置连续分配策略
#       -i --stripes 指定条带数
#       -I --stripesize 指定每个条带的大小
#       -l --extents 指定分配给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比
#       -L --size 指定分配给新逻辑卷的硬盘大小
#       --minor 指定设备的次设备号
#       -m --mirrors 创建逻辑卷镜像
#       -M --persistent 让次设备号一直有效
#       -n --name 指定新逻辑卷的名称
#       -p --permission 为逻辑卷设置读/写权限
#       -r --readahead 设置预读扇区数
#       -R --regionsize 指定将镜像分成多大的区
#       -s snapshot 创建快照逻辑卷
#       -Z --zero 将新逻辑卷的前1 KB数据设置为零
# (4) 创建文件系统
# 运行完lvcreate命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应的命令行程序来创建所需要的文件系统。
# (5) 修改 LVM
#       vgchange 激活和禁用卷组
#       vgremove 删除卷组
#       vgextend 将物理卷加到卷组中
#       vgreduce 从卷组中删除物理卷
#       lvextend 增加逻辑卷的大小
#       lvreduce 减小逻辑卷的大小

八、安装软件程序

  Linux上能见到的各种包管理系统(package management system,PMS),以及用来进行软件安装、管理和删除的命令行工具。Linux中广泛使用的两种主要的 PMS 基础工具是dpkg和rpm。

  基于Debian的发行版(如Ubuntu和Linux Mint)使用的是dpkg命令,dpkg会直接和Linux系统上的PMS交互,用来安装、管理和删除软件包。

  基于Red Hat的发行版(如Fedora、openSUSE及Mandriva)使用的是rpm命令,该命令是其PMS 的底层基础。类似于dpkg命令,rmp命令能够列出已安装包、安装新包和删除已有软件。

8.1 Ubuntu

  Ubuntu包管理系统源自Debian的包管理系统。。Debian的包文件通常是以”.deb”为后缀名,是预编译的二进制文件,一般不需要二次编译。
GitHub示例

# 安装软件包
sudo apt install package_name1 package_name2
# 卸载软件包
sudo apt remove package_name1 package_name2
# 更新包索引,需要将本地的包索引和软件包库(会进行更新)的包信息进行同步。
sudo apt update
# 升级软件包
sudo apt upgrade

   apt-get命令的子命令:

命令 描述
update 更新软件包列表
upgrade 升级系统中的所有软件包
install 安装软件包
remove 卸载软件包
autoremove 仅删除不需要再次下载的软件包
purge 彻底删除软件包(包括配置文件)
source 下载源代码
build-dep 自动下载安装编译某个软件所需要的软件包
dist-upgrade 升级整个发行版
dselect-upgrade 安装dselect的选择进行升级
clean 删除本地缓存的所有升级包
autoclean 删除本地缓存中无用的软件包
check 检查是否存在有问题的依赖关系

8.2 CentOS

# 2. CentOS
# 安装
yum install # 全部安装
yum install package1  # 安装指定的安装包package1
yum groupinsall group1  # 安装程序组group1
# 更新和升级
yum update  # 全部更新
yum update package1  # 更新指定程序包package1
yum check-update  # 检查可更新的程序
yum upgrade package1  # 升级指定程序包package1
yum groupupdate group1  # 升级程序组group1
# 查找和显示
yum info package1  # 显示安装包信息package1
yum list  # 显示所有已经安装和可以安装的程序包
yum list package1  # 显示指定程序包安装情况package1
yum groupinfo group1  # 显示程序组group1信息yum search string 根据关键字string查找安装包
# 删除程序
yum remove | erase package1  # 删除程序包package1
yum groupremove group1  # 删除程序组group1
yum deplist package1  # 查看程序package1依赖情况
# 清除缓存
yum clean packages  # 清除缓存目录下的软件包
yum clean headers  # 清除缓存目录下的 headers
yum clean oldheaders  # 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders)  # 清除缓存目录下的软件包及旧的headers
# 源操作
yum repolist/repolist all  # 列出所有源
yum -enablerepo=fedora-source install package1  # 从fedora-source源中安装包package1
# Yum Shell
yum shll  # 进去yum的shell环境

8.3 从源码安装

# 3. 源码安装
# 解压缩
tar -zxf test-4.0.2.tar.gz
# 进入目录
cd test-4.0.2
# 配置
./configure --prefix=/usr/local/test
# 编译
make all
# 安装
make install && make install-init && make install-commandmode && make install-config

九、使用编辑器

1. vim编辑器

GitHub示例

#!/usr/bin/env bash
# @File    :   09_use_editor.sh
# @Time    :   2019/9/15 14:06
# @Author  :   Crisimple
# @Github :    https://crisimple.github.io/
# @Contact :   Crisimple@foxmail.com
# @License :   (C)Copyright 2017-2019, Micro-Circle
# @Desc    :   使用编辑器# 1. vim编辑器
# 1.1 检查vim软件包
which vim
#   安装 vim
sudo apt install vim# 1.2 vim基础
# 普通模式:
#   h:左移一个字符
#   j:下移一行(文本中的下一行)
#   k:上移一行(文本中的上一行)
#   l:右移一个字符
#   PageDown(或Ctrl+F):下翻一屏
#   PageUp(或Ctrl+B):上翻一屏
#   G:移到缓冲区的后一行
#   num G:移动到缓冲区中的第num行
#   gg:移到缓冲区的第一行
#   q:如果未修改缓冲区数据,退出
#   q!:取消所有对缓冲区数据的修改并退出
#   w filename:将文件保存到另一个文件中
#   wq:将缓冲区数据保存到文件中并退出# 1.3 编辑数据
# 编辑模式:
#   i 进入文本编辑模式
#   x 删除当前光标所在位置的字符
#   dd 删除当前光标所在行
#   dw 删除当前光标所在位置的单词
#   d$ 删除当前光标所在位置至行尾的内容
#   J 删除当前光标所在行行尾的换行符(拼接行)
#   u 撤销前一编辑命令
#   a 在当前光标后追加数据
#   A 在当前光标所在行行尾追加数据
#   r char 用char替换当前光标所在位置的单个字符
#   R text 用text覆盖当前光标所在位置的数据,直到按下ESC键# 1.4 复制和粘贴
# yy    复制光标所在的整行
# y{    复制到上一段的开始
# Y 或 y$    复制从光标所在行 行首到行尾的内容
# y}    复制到下一段的开始
# y0    复制从光标前一个字符开始到行首的内容
# y<CR>   复制包括当前行在内的两行内容
# y(    复制到上一句的开始   yw  复制一个单词
# y)    复制到下一句的开始
# p 命令:粘贴命令,粘贴当前缓冲区中的内容。# 1.5 查找和替换
# :s/old/new/g:一行命令替换所有old。
# :n,ms/old/new/g:替换行号n和m之间所有old。
# :%s/old/new/g:替换整个文件中的所有old。
# :%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示。‘

Linux 系统基础知识相关推荐

  1. Linux系统基础知识

    Linux系统基础知识 1.在Linux系统中,以文件方式访问设备.   2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用 ino ...

  2. linux系统下io的过程,Linux系统基础知识:IO调度

    Linux系统基础知识:IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系 ...

  3. step1 . day2:Linux系统基础知识

    和Windows一样,Linux计算机必要的文件系统和学习C语言使用到的编辑器知识初步掌握. 1.操作系统和内核的分类 内核:Linux.Unix.NT,Linux内核主要负责5项工作①文件管理②设备 ...

  4. Linux系统基础知识整理

    一.说明 本篇文章,我将结合自己的实践以及简介,来对linux系统做一个直观清晰的介绍,使得哪些刚接触Linux的小伙伴可以快速入门,也方便自己以后进行复习查阅. 二.基本知识整理 1.Linux文件 ...

  5. 嵌入式Linux系统基础知识

    一.嵌入式Linux系统的构成 1.硬件 2.内核 3.应用程序(形成根文件系统) 二.构建嵌入式Linux系统的主要任务 1.内核部分 2.应用程序部分 嵌入式Linux的开发大致可分为三个层次:引 ...

  6. linux系统基础知识学习笔记

    /  根分区 boot 系统引导程序(内核,GRUB配置文件等) bin  存放终端二进制命令 etc 系统配置文件(大多数配置文件都是文本文件) dev  存放设备文件(系统将计算机中的各种设备资源 ...

  7. linux系统基础知识总结

    文章目录 1.什么是虚拟机? 2.如何使用虚拟机? 3.什么是shell? 4.什么是内核(kernal)? 5.在linux系统中如何运行命令 6.为什么要进行文件管理? 7.vim的异常退出怎么办 ...

  8. linux关于界面的API,linux系统基础知识(ABI和API)

    对于linux而言,我们首先要明确一个核心观念,linux从严格意义上来讲,就是一个内核(Kernel)这个内核就是位于计算机硬件之上,对于用户来说,我们要和计算机打交道,必须要通过CPU来分配指令, ...

  9. linux系统开启ntp服务,linux 系统基础知识 - 配置ntp服务

    linux客户端报错: [root@localhost -]# ntpdate 172.16.81.220 28 Apr 14:28:47 ntpdate[26335]: no server suit ...

最新文章

  1. Wordpress优化:网站用nginx前端缓存+Redis Cache缓存提速网站
  2. base64编码的学习和理解
  3. java B2B2C Springboot电子商城系统
  4. 20171207L09-04老男孩Linux运维实战培训-Lamp系列-Apache服务生产实战应用
  5. Ubuntu主题更换
  6. job.php打不开,cronjob上的PHP错误,在提示时工作正常
  7. Linux系统调用之open(), close() (转载)
  8. 【无机纳米材料科研制图——OriginLab 0202】Origin制图优化与格式复制
  9. 计算机上64位数和32位数,一不小心就蓝屏?安装win10系统和软件,你选32位还是64位?...
  10. java sharepoint_java调用sharepoint webservice
  11. pwm波控制舵机原理(转)
  12. 理查德·克莱德曼钢琴曲全集(梦中的婚礼)
  13. 关于hibernate检索策略
  14. 华为softco直接用语音服务器注册IMS返回403错误代码
  15. 我的世界服务器怎么做无限的弓,我的世界无限弓箭怎么做?
  16. 重温计算机简史:IBM的风云父子兵和硅谷的诞生
  17. Encoded password does not look like BCrypt 异常问题
  18. Critical Reviews | 南农邹建文组综述全球农田土壤抗生素与耐药基因分布
  19. Linux驱动之等待队列
  20. Zynq-Linux移植学习笔记之24-VPVN温度监测

热门文章

  1. go语言使用grpc和gateway教程
  2. 2010 27寸 imac 升级固态_新iMac拆解证实 自行加装SSD难如登天
  3. 云顶之弈机器人法爆_云顶之弈AP机器人打法,一爪2466伤害,六贵族双凯尔也顶不住!...
  4. Android 集成FaceBook广告
  5. 百度人脸识别搜索是怎么实现的
  6. 正反馈、负反馈、电容器偶合、直偶、偏置
  7. 财路网每日原创推送:区块链技术热下的“冷思考”
  8. 基于Flink的电影数据实时统计平台(一):项目展示
  9. android获取多媒体库的视频、音频、图片
  10. 结构方程模型(SEM)及其R实现