第1章 初识Linux Shell
1.1 什么是Linux
Linux主要可以划分为4部分:
- 内核
- GNU工具
- 图形化桌面环境
- 应用软件
1.1.1 内核
内核功能:
-
系统内存管理
包括物理内存和虚拟内存(虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。)
-
软件程序管理
内核创建第一个进程(init进程),由该进程来启动系统上的其他进程,内核启动时,会将该进程加载到虚拟内存中。
Linux操作系统运行级别从1到5:
- 1:单用户模式,通常用来紧急的文件系统维护
- 3:标准的启动运行级,支持大多数软件、网络支持程序等
- 5:会启动图形化的X Windows系统,运行用户使用图形化窗口登录系统
-
硬件设备管理
Linux系统将硬件设备当成特殊的文件,称为设备文件:
- 字符型设备文件:每次只能处理一个字符的设备,如调制解调器和终端
- 块设备文件:如硬盘
- 网络设备文件:采用数据包发送和接受数据的设备,如各种网卡和回环设备。
-
文件系统管理:支持用不同类型的文件系统来进行硬盘数据读写。
1.1.2 GNU工具
一套完整的UNIX工具
-
核心工具软件包 coreutils:
- 处理文件
- 操作文本
- 管理进程
-
shell
GNU/Linux shell是一种特殊的交互式工具
- 启动程序
- 管理文件
- 管理进程
多个shell命令写入文件,称作shell脚本
所有linux发行版默认是bash shell
其他版本 略
1.1.3 Linux桌面环境
简单了解即可
- X Windows 直接和PC上的显卡及显示器打交道的底层程序。(其核心 仅仅是可以产生图形化显示环境)
- 主流桌面环境:
- KDE桌面:类似windows的
- GNOME:如centos
- Unity:如Ubuntu
- 其他略
1.2 Linux发行版
没啥重点,简单浏览了一遍 不多废话。
第2章 走进shell
2.1 进入命令行
哑终端:显示器和键盘通过串行电缆连接到Unix系统
如今:虚拟控制台
CLI:command line interface
2.1.1 控制台终端
退出图形化界面进入文本模式,称作 Linux控制台(仿真了早期的硬接线控制台终端)
可创建多个虚拟控制台
2.1.2 图形化终端
图形化界面中的是 终端仿真器
图形界面的组成如图:
2.2 通过Linux控制台终端访问CLI
ctrl+ALT+F1~F7 进入要使用的虚拟控制台
这里直接按F1和F2会到图形化界面去 不知道为啥 不过F3后面都行
tty : teletypewriter 电传打字机
这里各个状态都会保存 如可以起到tty4 再切回已经登陆的tty3
调颜色 略
2.3 通过图形化终端仿真访问CLI
相关软件包较多,具体略
主要关注大部分Linux发行版都有的 GNOME Terminal、Konsole Terminal和xterm
2.4 访问GNOME Terminal
ubuntu unity 用的是该软件包
可以用CTRL+ALT+T 来快速呼出
其他几个 略
相关功能介绍略 简单浏览即可
2.5 访问Konsole Terminal
用到再看
2.6 访问xterm
用到再看
第3章 基本的bash shell命令
3.1 启动shell
略
3.2 shell 提示符
默认 $ 可修改
3.3 bash手册
man命令
用来访问存储在系统上的手册页面
比如 man gnome terminal
可以使用 -k 关键字
来模糊查找
man 区域号 命令
来读不同的内容区域 比如上图的(1)就是表示内容区域1
除了man,还可以使用 info命令以及大部分命令支持 -help –help
3.4 浏览文件系统
3.4.1 Linux文件系统
linux在路径名中不使用驱动器盘符
文件存储在单个目录结构中,称之为虚拟目录,只包含一个称为root根/
的基础目录,根驱动器上会创建 挂载点的特殊目录,用于存储额外设备的目录,比如:
常见的linux目录名称如下,可以记一下 etc mnt sbin srv usr var
3.4.2 遍历目录
cd destination
表示方法:
-
绝对:
/
开始pwd命令可以显示当前的工作目录
~
表示的是主目录(系统分配给用户的)cd会直接跳回主目录
-
相对
特殊的 用
.
和..
不用
/
开头
3.5 文件和目录列表
列表命令 ls
3.5.1 基本列表功能
-F 会在目录文件后面加 /
以示区分
-R 会递归输出目录下子目录中的文件
-a 会显示隐藏文件 通常是用来保存配置信息
-d 显示目录的信息,但不列出目录的内容
3.5.2 显示长列表
使用参数 -l
文件信息:
- 文件类型: d 目录 - 文件 c 字符型设备 b 块设备
- 文件权限
- 文件的硬链接总数
- 文件属主的用户名
- 文件属组的组名
- 文件大小 字节为单位
- 文件的上次修改时间
- 文件名或目录名
3.5.3 过滤输出列表
ls 支持命令行中添加过滤器 即一个简单的文本匹配的字符串 如:
?
匹配一个任意字符 *
匹配0个或者多个字符
用这些符号的匹配称为文件扩展匹配,(貌似语法和正则表达式一样的,不多写了)
3.6 处理文件
3.6.1 创建文件
touch 命令可以创建空文件
比如 touch touch_test
touch一个存在的文件 会改变上一次修改时间,如果只改 上一次访问时间 加参数-a ls -l --time=atime
可看到文件的上一次访问时间
3.6.2复制文件
cp 命令 应该是copy的缩写
最基本语法 cp source destination
-i 参数可以提示 是否覆盖已存在的同名文件
如果要复制到目录 应该记得加上 /
来表示是目录
cp 命令 如果要复制到当前目录 可以使用 .
单点符表示当前目录
3.6.3 制表键自动补全
TAB 可以自动不全文件名或目录名
3.6.4 链接文件
包括符号链接和硬链接
命令 ln 因该是link的缩写
-
符号链接:一个文件指向另一个文件,两个文件不同
ln -s 目标 源
目标和源都是存在的 -
硬链接:虚拟的,文件相同,ls -i 参数可以看到文件的 inode编号,两者一样
ln 目标 源
源不存在
3.6.5 重命名文件
使用命令 mv (moving移动) 改文件名或者目录名
移动到其他位置(目录)或者改名(inode和时间戳不变)
3.6.6 删除文件
rm (removing)
bash shell 无回收站 rm -i 提示自己是否删除
3.7 处理目录
3.7.1 创建目录
mkdir 命令
-p 参数创建多个目录及其子目录
mkdir -p new_dir/sub_dir/under_dir
3.7.2 删除目录
rmdir
默认只删除 空目录
如果要删除带有文件的目录 可以使用 rm -r dir
递归删除
每个文件都会询问 可以使用 -f 参数来取消提示
rm -rf dir 很危险 一定要检查清楚
3.8 查看文件内容
3.8.1 查看文件类型
在显示文件内容之前,应先查看一下文件类型,如果是bin文件,可能满屏乱码
file 命令
file filename
3.8.2 查看整个文件
-
cat 命令
-n 加上行号
无法控制 大文件会一闪而过
-
more 命令 空格继续一页 回车逐行显示
-
less 命令 (less is more)
more的升级版 可以前后翻动
3.8.3 查看部分文件
-
tail 命令 显示文件末尾内容 -n控制显示行数
-
head 命令 类似
第4章 更多的bash shell 命令
主要介绍系统管理命令
4.1 检测程序
4.1.1 探查进程
ps命令
默认显示运行在当前用户下的进程
三种风格的命令行参数
-
Unix
-
主要记住-ef
和-l
通常
ps -ef
-e 显示所有运行在系统上的进程,-f 扩展输出说明:
- PPID 父进程ID
- C: cpu 利用率
- sttime: 进程启动时的系统时间
- TIME:运行进程需要的累计CPU时间
- CMD:启动进程的程序名称
-l 更加详细:
- F:内核分配给进程的系统标记
- S: 进程状态 O 运行 S 休眠 R 可运行待运行 Z僵化(父进程不存在) T 停止
- PRI 进程优先级 (数字越小 优先级越高)
- NI 谦让度值 用来参与决定优先级
- ADDR 进程的内存地址
- SZ 如果进程被换出 所需的内存空间
- WCHAN 进程休眠的内核函数的地址
-
BSD 风格 无破折线
比如
ps l
比起 -l l貌似更好说明:
- VSZ 进程在内存中的大小
- RSS 进程在未换出时占用的物理内存
- STAT 双字符状态码 第一列和Unix风格的含义一一致,第二个参数:
- < 高优先级
- N 低优先级
- L 所有页面锁定在内存中
- s 控制进程
- l 多线程
- +运行在前台的
-
GNU风格 双破折线
具体的懒得写了 –forest 比较有意思 会显示进程的层级信息
比如 写 ps -ef –forest:
4.1.2 实时监测进程
实时显示进程信息 top 命令
第一行:系统当前时间 运行时间 用户数 系统的平均负载(最近1分钟、5分钟和15分钟,超过2比较高)
4.1.3 结束进程
进程之间通过 信号 来进行通信。
看看即可:
-
kill 命令
kill 进程号
向指定PID 发送 TERM 信号前提是进程的属主或root用户
部分进程不会停止 用 -s参数强制终止 也支持指定其他信号
如:
kill -s HUP 1234
-
killall 命令
通过进程名(支持通配符)来终止进程‘
4.2 监测磁盘空间
在使用新的存储媒体之前,需要将其放到虚拟目录下,称之为 挂载 mounting
-
挂载命令 mount
-
移除挂载 umount
-
df命令查看设备的磁盘空间使用情况
-
du 查看目录下文件的大小
4.3 处理数据文件
-
排序数据 sort
-
*默认将数字当作字符排序 -n 会当作数字排序
-
-M 可以按3字符的月份排序
-
还有常用的 -k -t -t表示分隔符 -k表示按第几个位置排序
-
-
搜索数据:grep 命令
grep [options] pattern [file]
主要记一下:
- -v 反向(输出不匹配的行)
- -n 输出行号
- -c 输出匹配的行数
- -e 指定多个匹配模式 如
grep -e t -e f filename
- 可以用正则 如
grep [tf] filename
-
文件压缩工具
最主要的时gzip 其次是 bzip2
对于 gzip
- gzcat 查看压缩过的文件内容
- gunzip 解压
-
归档数据
tar function [options] object1 object2
常见的 tgz 后缀结尾 是 gzip压缩过的 tar文件
第5章 理解shell
shell 是一个时刻都在运行的复杂交互式程序
5.1 shell的类型
一般在 /etc/passwd
文件中记载用户的默认shell
5.2 shell的父子关系
子shell 也称 subshell
ps -f 可以查看PPID 父进程id
用exit退出子shell,也可以退出当前的虚拟控制台或终端仿真软件
5.2.1 进程列表
;
命令之间,即命令列表。
进程列表 将这些 用括号 括起来 (command1;command2...)
,会生成一个子shell;可以嵌套括号,用 echo $BASH_SUBSHELL
来输出子shell数量
5.2.2 别出心裁的子shell用法
-
探索后台模式:
加
&
后台作业 会显示 后台作业号 【1】jobs
命令 可以看到后台作业执行情况 -
将进程列表置入后台
-
协程
示例:
coproc my_job { sleep 2; sleep 3; }
子shell的成本不低
5.3 理解shell的内建命令
5.3.1 外部命令
也称文件系统命令 ps就是一个外部命令,可以用 which 或者tye
被执行时,会创建出一个子进程,被称之为衍生(forking)
5.3.2 内建命令
type命令可以判断是否时内建
部分文件可能有两个版本 默认内建 如果要使用外部 指定文件地址即可
常用命令:
-
history
history -a 强制写入
!n
n指的是history中的命令编号 -
alias 创建命令别名,比如:
alias li='ls -li'
第6章 *使用linux环境变量
6.1 什么是环境变量
在内存中存储数据,以便程序或者shell在运行的脚本中轻松访。
环境变量分为全局和局部变量两种。
6.1.1 全局环境变量
系统环境变量一般是全大写字母
printenv
或者 env
可以查看环境变量
一些示例:printenv HOME
echo %HOME
6.1.2 局部环境变量
只能在定义它们的进程中可见
set
会显示所有环境变量(全局、局部、用户定义)
6.2 设置用户定义变量
6.2.1 设置局部用户定义变量
- 用户自定义 应全小写
- 变量名、等号和值之间不应该有空格,否则会把值当成单独的命令
- 子shell中不可用
6.2.2 设置全局
使用 export命令将定义的变量导出 (bash会生成一个子shell)
子shell中改变全局不会影响到父shell
6.3 删除环境变量
unset
命令
操作变量 不加 $
使用变量 加 $
6.4 默认的shell环境变量
略
6.5 设置PATH 环境变量
PATH=$PATH:/home/zs/myscript
path中各个目录是用:
分割的
6.6 定位系统环境变量
启动bash shell时,默认情况下bash会在几个文件中查找命令(这些文件称之为启动文件或环境文件)
启动bash shell的三种方式:
6.6.1 登录shell
登录时作为默认登录shell,登录shell会从5个文件中读取命令:
1
2
3
4
5
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
/etc/profile:默认的主启动文件
第7章 理解linux文件权限
7.1 linux的安全性
用户权限是通过创建用户时分配的用户ID来跟踪的
7.1.1 /etc/passwd
系统账户:Linux为各种服务创建的账户,是各种服务进程访问资源用的特殊账户
字段信息:
- 用户名
- 密码 (保存在/etc/shadow)
- 用户ID(一般用户UID在500之后)
- 组ID
- home目录
- 默认shell
7.1.2 /etc/shadow
第二个字段为加密后的字段
该文件只能root权限才能访问
7.1.3 添加新用户
useradd 命令
7.1.4 删除用户
/usr/bin/userdel -r test
-r 删除该用户的home目录以及邮件目录 否则只删除 passwd中的用户信息
7.1.5 修改用户
7.2 使用Linux组
组 group
允许多个用户对系统中的对象共享一组共用的权限
/etc/group 文件
- 组名
- 组密码
- GID
- 属于该组的用户列表
添加组
/usr/sbin/groupadd shared
/usr/sbin/usermod -G shared testuser
7.3 理解文件权限
touch 默认分配权限 umask修改(掩码) 具体略
7.4 改变安全性设置
7.4.1 改变权限
两种:
-
chmod 760 newfile
-
chmod [ugoa] [+-=][rwxXstugo]
后面几个不常见 懒得写了 例子
chmod u+w file
7.4.2 改变所属关系
chown改变文件的属主
chgrp改变文件的默认属组
7.5 共享文件
SGID会强制某个目录下创建的新文件或目录都沿用该父目录的属组
第8章 管理文件系统
8.1 探索LINUX文件系统
8.1.1 基本的linux文件系统
-
ext系统 (扩展文件系统 extended filesystem)
使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据
文件系统通过索引节点号而不是文件全名及路径来标识文件
-
ext2系统
通过将数据块分组解决了ext的碎片化 fragmentation的问题
容易停电或系统崩溃时损坏