<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on ༺KO༒NE༻</title><link>https://kone.js.cn/tags/linux/</link><description>Recent content in Linux on ༺KO༒NE༻</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 06 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kone.js.cn/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux学习笔记</title><link>https://kone.js.cn/p/note-linux/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>https://kone.js.cn/p/note-linux/</guid><description>&lt;img src="https://kone.js.cn/" alt="Featured image of post Linux学习笔记" /&gt;&lt;h2 id="本书结构"&gt;本书结构
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第一部分&lt;/strong&gt;：Linux				 1-10&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二部分&lt;/strong&gt;：编写shell脚本		 11-16&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三部分&lt;/strong&gt;：深入shell脚本		 17-23&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四部分&lt;/strong&gt;：shell脚本的显示应用	24-25&lt;/p&gt;
&lt;p&gt;pip install &amp;hellip; -i &lt;a class="link" href="https://pypi.tuna.tsinghua.edu.cn/simple" target="_blank" rel="noopener"
 &gt;https://pypi.tuna.tsinghua.edu.cn/simple&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2"&gt;2
&lt;/h3&gt;&lt;p&gt;虚拟控制台：tty(teletypewriter)&lt;/p&gt;
&lt;h3 id="3"&gt;3
&lt;/h3&gt;&lt;h4 id="34"&gt;3.4
&lt;/h4&gt;&lt;p&gt;cd pwd . .. /&lt;/p&gt;
&lt;p&gt;(print working directory)&lt;/p&gt;
&lt;p&gt;当前目录：。&lt;/p&gt;
&lt;p&gt;当前父目录：。。&lt;/p&gt;
&lt;h4 id="35"&gt;3.5
&lt;/h4&gt;&lt;p&gt;ls -aFl&lt;/p&gt;
&lt;p&gt;文件的类型：/ * .&lt;/p&gt;
&lt;p&gt;标准通配符：? * [] !&lt;/p&gt;
&lt;h4 id="36"&gt;3.6
&lt;/h4&gt;&lt;p&gt;创建文件：touch&lt;/p&gt;
&lt;p&gt;复制文件：cp source destination	cp -i	cp -R&lt;/p&gt;
&lt;p&gt;命令行补全：Tab&lt;/p&gt;
&lt;p&gt;链接文件：ln source destination（硬）ln -s f1 f2（软）&lt;/p&gt;
&lt;p&gt;文件移动：mv so de	mv -i&lt;/p&gt;
&lt;p&gt;文件移除(removing)：rm so 	rm -i	rm -f&lt;/p&gt;
&lt;h4 id="37"&gt;3.7
&lt;/h4&gt;&lt;p&gt;创建目录：mkdir	mkdir -p a/b/c	ls -d&lt;/p&gt;
&lt;p&gt;删除目录：rmdir	-i	-r	-f&lt;/p&gt;
&lt;p&gt;转移目录：mv source_dir destination_dir&lt;/p&gt;
&lt;h4 id="38查看文件内容"&gt;3.8：查看文件内容
&lt;/h4&gt;&lt;p&gt;查看文件类型：file&lt;/p&gt;
&lt;p&gt;查看文件：&lt;/p&gt;
&lt;p&gt;​	整个：cat	more	less	-n	-b&lt;/p&gt;
&lt;p&gt;​	部分：tail	head	-n	-f(only tail)&lt;/p&gt;
&lt;h3 id="4更多的shell命令"&gt;4.更多的shell命令
&lt;/h3&gt;&lt;p&gt;Linux系统管理员：&lt;/p&gt;
&lt;p&gt;跟踪运行在系统中的程序（难点：定义究竟到什么程度是高负载），知道何时以及如何结束一个进程（进程间通过信号来通信）&lt;/p&gt;
&lt;p&gt;检测系统磁盘的使用情况&lt;/p&gt;
&lt;p&gt;从日志文件中读取并处理数据&lt;/p&gt;
&lt;h4 id="41监测程序"&gt;4.1监测程序
&lt;/h4&gt;&lt;p&gt;探查进程：&lt;/p&gt;
&lt;p&gt;特定时间点：ps	Unix风格(OSRZT)+GNU风格&lt;/p&gt;
&lt;p&gt;实时：top&lt;/p&gt;
&lt;p&gt;结束进程：&lt;/p&gt;
&lt;p&gt;kill 进程信号	-s&lt;/p&gt;
&lt;p&gt;pkill 程序名（可用通配符）&lt;/p&gt;
&lt;h4 id="42监测磁盘空间"&gt;4.2监测磁盘空间
&lt;/h4&gt;&lt;p&gt;文件系统类型：vfat	ntfs	exfat	iso9660&lt;/p&gt;
&lt;p&gt;挂载存储设备：&lt;/p&gt;
&lt;p&gt;mount -t type device directory&lt;/p&gt;
&lt;p&gt;umount [directory | divece ]&lt;/p&gt;
&lt;p&gt;df	-h&lt;/p&gt;
&lt;p&gt;du&lt;/p&gt;
&lt;h4 id="43处理数据文件"&gt;4.3处理数据文件
&lt;/h4&gt;&lt;p&gt;数据排序：sort	-n	-M	-k	-t	-r&lt;/p&gt;
&lt;p&gt;数据搜索：grep [options] pattern [file]	-vnce&lt;/p&gt;
&lt;p&gt;数据压缩：gzip	gunzip&lt;/p&gt;
&lt;p&gt;数据归档：tar function [options] object1 object2..&lt;/p&gt;
&lt;h3 id="5理解shell"&gt;5理解shell
&lt;/h3&gt;&lt;h4 id="51shell的类型"&gt;5.1shell的类型
&lt;/h4&gt;&lt;p&gt;bash csh tcsh dash &amp;hellip;&lt;/p&gt;
&lt;p&gt;echo $0&lt;/p&gt;
&lt;h4 id="52shell的父子关系"&gt;5.2shell的父子关系
&lt;/h4&gt;&lt;p&gt;命令列表：一行以&amp;quot; ; &amp;ldquo;分隔&lt;/p&gt;
&lt;p&gt;进程列表：一行以&amp;rdquo; ; &amp;ldquo;分隔，整个以&amp;rdquo; () &amp;ldquo;包含	生成子shell执行命令（另一种命令分组，&amp;rdquo; {}; &amp;ldquo;）&lt;/p&gt;
&lt;p&gt;后台模式：command&amp;amp;	将终端与子shell解绑，创建备份文件&lt;/p&gt;
&lt;p&gt;协程{&lt;/p&gt;
&lt;p&gt;同时做：在后台生成一个子shell，在该子shell中执行命令&lt;/p&gt;
&lt;p&gt;coproc command	coproc name { command; }&lt;/p&gt;
&lt;h4 id="53外部命令和内建命令"&gt;5.3外部命令和内建命令
&lt;/h4&gt;&lt;p&gt;外部命令：存在于bash shell之外的程序	衍生：耗费时间和资源来设置新子进程的环境&lt;/p&gt;
&lt;p&gt;内建命令：与shell编译成一体&lt;/p&gt;
&lt;p&gt;type&lt;/p&gt;
&lt;p&gt;pwd	两种都有，/usr/bin/pwd&lt;/p&gt;
&lt;p&gt;history	!!	!number&lt;/p&gt;
&lt;p&gt;别名：alias command=&amp;rsquo;&amp;hellip;&amp;rsquo;	-p&lt;/p&gt;
&lt;h3 id="6linux环境变量"&gt;6Linux环境变量
&lt;/h3&gt;&lt;h4 id="61什么是环境变量62设置用户自定义变量"&gt;6.1什么是环境变量&amp;amp;6.2设置用户自定义变量
&lt;/h4&gt;&lt;p&gt;环境变量：{&lt;/p&gt;
&lt;p&gt;存储shell会话和工作环境的相关信息&lt;/p&gt;
&lt;p&gt;引用环境变量 $var&lt;/p&gt;
&lt;p&gt;全局变量：{&lt;/p&gt;
&lt;p&gt;env	printenv&lt;/p&gt;
&lt;p&gt;​	定义：export 局部变量	export var=value&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;局部变量{&lt;/p&gt;
&lt;p&gt;​	定义：my_variable=value	=两边没有空格&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="63删除环境变量"&gt;6.3删除环境变量
&lt;/h4&gt;&lt;p&gt;删除变量：unset var&lt;/p&gt;
&lt;p&gt;$：用到变量(do anything with)	不加：操作变量(&amp;hellip; to)&lt;/p&gt;
&lt;h4 id="64默认的shell环境变量"&gt;6.4默认的shell环境变量
&lt;/h4&gt;&lt;h4 id="65设置path环境变量"&gt;6.5设置PATH环境变量
&lt;/h4&gt;&lt;p&gt;#!/usr/bin/env bash	更好的可移植性&lt;/p&gt;
&lt;h4 id="66定位系统环境变量"&gt;6.6定位系统环境变量
&lt;/h4&gt;&lt;p&gt;启动bash shell的方式：&lt;/p&gt;
&lt;p&gt;default login shell	登录时作为默认登录shell&lt;/p&gt;
&lt;p&gt;interactive shell 	作为交互式shell，通过生成子shell启动&lt;/p&gt;
&lt;p&gt;non-interactive shell	作为运行脚本的非交互式shell&lt;/p&gt;
&lt;p&gt;默认的主启动文件：/etc/profile	执行特定应用程序启动文件[和管理员自定义启动文件]&lt;/p&gt;
&lt;p&gt;其余启动文件：提供用户专属的启动文件来定义该用户所用到的环境变量&lt;/p&gt;
&lt;h4 id="67数组变量"&gt;6.7数组变量
&lt;/h4&gt;&lt;p&gt;mytest=(zero one two three)&lt;/p&gt;
&lt;p&gt;echo ${mytest[index]}	*&lt;/p&gt;
&lt;h3 id="7理解linux文件权限"&gt;7理解Linux文件权限
&lt;/h3&gt;&lt;h4 id="71linux的安全性"&gt;7.1Linux的安全性
&lt;/h4&gt;&lt;p&gt;Linux安全系统的核心：用户账户&lt;/p&gt;
&lt;p&gt;用户权限——&amp;gt;UID——&amp;gt;登录名&lt;/p&gt;
&lt;p&gt;/etc/shadow&lt;/p&gt;
&lt;p&gt;添加新用户：useradd 	-D	/etc/skel&lt;/p&gt;
&lt;p&gt;删除用户：userdel	-r&lt;/p&gt;
&lt;p&gt;修改用户：{&lt;/p&gt;
&lt;p&gt;usermod	passwd	chpasswd&lt;/p&gt;
&lt;p&gt;chage	chfn	chsh&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="72使用linux组"&gt;7.2使用Linux组
&lt;/h4&gt;&lt;p&gt;唯一的GID和组名&lt;/p&gt;
&lt;p&gt;创建新组：groupadd&lt;/p&gt;
&lt;p&gt;修改组：groupmod	-g	-n&lt;/p&gt;
&lt;h4 id="73理解文件权限"&gt;7.3理解文件权限
&lt;/h4&gt;&lt;p&gt;rwx	属主 属组 其他用户&lt;/p&gt;
&lt;p&gt;设置新建文件和目录的默认权限：umask	umask &lt;u&gt;number&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;八进制模式的安全设置	全权限值(full permission)&lt;/p&gt;
&lt;p&gt;文件：666	目录：777	权限值=默认权限值-umask&lt;/p&gt;
&lt;h4 id="74更改安全设置"&gt;7.4更改安全设置
&lt;/h4&gt;&lt;p&gt;修改权限：{&lt;/p&gt;
&lt;p&gt;chmod options mode file&lt;/p&gt;
&lt;p&gt;模式：八进制、符号&lt;/p&gt;
&lt;p&gt;符号模式：[ugoa&amp;hellip;] [+-=] [rwxXstugo&amp;hellip;]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;改变所属关系：{&lt;/p&gt;
&lt;p&gt;chown	chgrp&lt;/p&gt;
&lt;p&gt;​	chown options owner [ .group ] file&lt;/p&gt;
&lt;p&gt;​	chgrp group file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="75共享文件"&gt;7.5共享文件
&lt;/h4&gt;&lt;p&gt;3个额外的信息位：SUID、SGID、粘滞位	(八进制位值)&lt;/p&gt;
&lt;p&gt;chmod g+s dir&lt;/p&gt;
&lt;h4 id="76访问控制列表asl"&gt;7.6访问控制列表(ASL)
&lt;/h4&gt;&lt;p&gt;&lt;em&gt;局限性&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ASL：包含多个用户或组的列表和为其分配的权限&lt;/p&gt;
&lt;p&gt;setfacl [options]&lt;/p&gt;
&lt;p&gt;查看ACL：getfacl file&lt;/p&gt;
&lt;p&gt;分配权限：setfacl [options] rule filenames	-m	-x&lt;/p&gt;
&lt;p&gt;&amp;ldquo;+&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ACL继承：d:&lt;/p&gt;
&lt;h3 id="8管理文件系统"&gt;8管理文件系统
&lt;/h3&gt;&lt;h4 id="81探讨linux文件系统"&gt;8.1探讨Linux文件系统
&lt;/h4&gt;&lt;p&gt;ext(extended filesystem)	i节点表&lt;/p&gt;
&lt;p&gt;ext2&lt;/p&gt;
&lt;p&gt;​	先将数据写入存储设备再更新节点表	易丢失数据&lt;/p&gt;
&lt;p&gt;日志文件系统： 临时文件（日志）{&lt;/p&gt;
&lt;p&gt;​	日志文件系统方法—模式：数据、有序、回写&lt;/p&gt;
&lt;p&gt;​	ext3&lt;/p&gt;
&lt;p&gt;​	ext4
​	JFS(journaled file system)&lt;/p&gt;
&lt;p&gt;​	ReiserFS&lt;/p&gt;
&lt;p&gt;​	XFS&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;日志技术：安全性 vs 性能&lt;/p&gt;
&lt;p&gt;卷管理文件系统 ：{&lt;/p&gt;
&lt;p&gt;写时复制(copy-on-wirte, COW)：快照(snapshot)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;从一个或多个磁盘（或磁盘分区）创建的存储池提供了生成&lt;u&gt;虚拟磁盘&lt;/u&gt;（卷）的能力&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;​	ZFS—Btrfs—Stratis&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;存储容量&lt;/strong&gt;：kmgt pezy&lt;/p&gt;
&lt;h4 id="82使用文件系统"&gt;8.2使用文件系统
&lt;/h4&gt;&lt;p&gt;创建分区：{&lt;/p&gt;
&lt;p&gt;工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fdisk&lt;/li&gt;
&lt;li&gt;gdisk&lt;/li&gt;
&lt;li&gt;GNUparted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;硬盘分配设备名称：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SATA驱动器和SCSI驱动器:	/dev/sd&lt;u&gt;x&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;SSD NVMe驱动器：	/dev/nvme&lt;u&gt;N&lt;/u&gt;n&lt;u&gt;#&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;IDE驱动器：	/dev/hd&lt;u&gt;x&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;BIOS(Basic Input/Output System)&lt;/p&gt;
&lt;p&gt;创建文件系统：mkfs &amp;hellip;&lt;/p&gt;
&lt;p&gt;检查和修复文件系统：fsck options filesystem&lt;/p&gt;
&lt;h4 id="83逻辑卷管理"&gt;8.3逻辑卷管理
&lt;/h4&gt;&lt;p&gt;Linux逻辑卷管理器(logical volume manager, LVM)：将了一块硬盘上的分区加入已有的文件系统来动态地添加存储空间&lt;/p&gt;
&lt;p&gt;LVM布局：{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物理卷(physical volume, PV)：pvcreate&lt;/li&gt;
&lt;li&gt;卷组(volume group, VG)：vgcreate&lt;/li&gt;
&lt;li&gt;逻辑卷(logical volume, LV)：lvcreate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;LVM：{创建和管理LV的交互式实用工具&lt;/p&gt;
&lt;p&gt;​	关键：将额外的存储空间动态添加到LV&lt;/p&gt;
&lt;p&gt;首次创建逻辑卷的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建物理卷&lt;/li&gt;
&lt;li&gt;创建卷组&lt;/li&gt;
&lt;li&gt;创建逻辑卷&lt;/li&gt;
&lt;li&gt;格式化逻辑卷&lt;/li&gt;
&lt;li&gt;挂载逻辑卷&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="9安装软件"&gt;9安装软件
&lt;/h3&gt;&lt;h4 id="91软件包管理基础"&gt;9.1软件包管理基础
&lt;/h4&gt;&lt;p&gt;软件包管理系统	数据库	记录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux系统已安装的软件包&lt;/li&gt;
&lt;li&gt;每个软件包安装了哪些文件&lt;/li&gt;
&lt;li&gt;每个已安装的软件包的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;软件包存储在仓库(repository)服务器&lt;/p&gt;
&lt;p&gt;软件包存在依赖关系&lt;/p&gt;
&lt;p&gt;软件包管理系统检测工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;dpkg&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rpm&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="92基于debian的系统"&gt;9.2基于Debian的系统
&lt;/h4&gt;&lt;p&gt;核心：dpkg命令	用于安装、更新、删除DEB包文件&lt;/p&gt;
&lt;p&gt;APT(advanced package tool)工具集{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt—cache&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt—get&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;apt [options] command&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt管理软件包{&lt;/p&gt;
&lt;p&gt;​	apt &amp;ndash;installed list&lt;/p&gt;
&lt;p&gt;​	apt show package_name&lt;/p&gt;
&lt;p&gt;​	dpkg -L package_name&lt;/p&gt;
&lt;p&gt;​	dpkg &amp;ndash;search absolute_file_name&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt安装软件包{&lt;/p&gt;
&lt;p&gt;​	apt search package	(&amp;ndash;names-only)&lt;/p&gt;
&lt;p&gt;​	apt install package_name&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt升级软件：apt upgrade&lt;/p&gt;
&lt;p&gt;使用apt卸载软件包{&lt;/p&gt;
&lt;p&gt;​	apt remove	删除软件包，保留数据和配置文件&lt;/p&gt;
&lt;p&gt;​	apt purge package_name	全部删除&lt;/p&gt;
&lt;p&gt;​	apt autoremove	删除依赖关系的无用软件包&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;apt仓库{&lt;/p&gt;
&lt;p&gt;​	位置：/etc/apt/sources.list&lt;/p&gt;
&lt;p&gt;​	指定仓库源：deb(or deb-src)adress distribution_name	package_type_list&lt;/p&gt;
&lt;p&gt;​	deb：已编译程序的仓库源&lt;/p&gt;
&lt;p&gt;​	deb-src：源代码的仓库源&lt;/p&gt;
&lt;p&gt;​	address：软件仓库的网址&lt;/p&gt;
&lt;p&gt;​	distribution_name：该软件仓库的发行版的版本名称&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="93基于red-hat的系统"&gt;9.3基于Red Hat的系统
&lt;/h4&gt;&lt;p&gt;前端工具{	基于rpm(命令行工具)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yum&lt;/li&gt;
&lt;li&gt;zypper&lt;/li&gt;
&lt;li&gt;dnf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;h4 id="94使用容器管理软件"&gt;9.4使用容器管理软件
&lt;/h4&gt;&lt;p&gt;应用程序容器(application container)：创建环境，包含应用程序运行所需的全部文件，包括运行时库文件。	在任何Linux系统正常运行&lt;/p&gt;
&lt;p&gt;容器标准：snap、flatpak&lt;/p&gt;
&lt;p&gt;使用snap容器{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;snap version&lt;/li&gt;
&lt;li&gt;snap list&lt;/li&gt;
&lt;li&gt;snap find app_name&lt;/li&gt;
&lt;li&gt;snap info app_name&lt;/li&gt;
&lt;li&gt;snap install app_name&lt;/li&gt;
&lt;li&gt;snap remove&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用flatpak容器{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;flatpak list&lt;/li&gt;
&lt;li&gt;flatpak search app_name&lt;/li&gt;
&lt;li&gt;flatpak install app_ID&lt;/li&gt;
&lt;li&gt;flatpak uninstall app_ID&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="95从源代码安装"&gt;9.5从源代码安装
&lt;/h4&gt;&lt;p&gt;tarball：源代码发布的软件包形式&lt;/p&gt;
&lt;h3 id="10文本编辑器"&gt;10文本编辑器
&lt;/h3&gt;&lt;p&gt;vi编辑器：最早之一，最复杂，大量特性&lt;/p&gt;
&lt;p&gt;vim(vi improved)&lt;/p&gt;
&lt;p&gt;检查vim软件包：readlink -f path&lt;/p&gt;
&lt;p&gt;vim基础{&lt;/p&gt;
&lt;p&gt;​	vi program_name&lt;/p&gt;
&lt;p&gt;​	三种操作模式：&lt;/p&gt;
&lt;p&gt;​	命令：按键解释为命令，移动光标{&lt;/p&gt;
&lt;p&gt;​		方向键、hjkl&lt;/p&gt;
&lt;p&gt;​		G、num G、gg&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;​	插入：按“i”进入，“Esc”退出&lt;/p&gt;
&lt;p&gt;​	Ex：交互式命令行，命令模式中按“：”{&lt;/p&gt;
&lt;p&gt;​	q：未修改数据，退出&lt;/p&gt;
&lt;p&gt;​	q!：放弃所有修改，退出&lt;/p&gt;
&lt;p&gt;​	w filename：重命名&lt;/p&gt;
&lt;p&gt;​	wq：将缓冲区数据保存到文件，退出&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;编辑数据{	命令模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;删除：x	dd	dw	d$	J	内容在寄存器&lt;/li&gt;
&lt;li&gt;撤销：u&lt;/li&gt;
&lt;li&gt;追加：a	A&lt;/li&gt;
&lt;li&gt;替换：r	R&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;复制和粘贴{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;p：从寄存器取回数据&lt;/li&gt;
&lt;li&gt;复制：y	yw	y$	可视模式：“v”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;查找和替换{&lt;/p&gt;
&lt;p&gt;​	/&lt;em&gt;content&lt;/em&gt;	/Enter&lt;/p&gt;
&lt;p&gt;​	{	Ex模式	替换命令格式：s/old/new/&lt;/p&gt;
&lt;p&gt;​		s/old/new/g：替换当前行所有的&lt;/p&gt;
&lt;p&gt;​		n,ms/old/new/g：替换n—m行之间所有的&lt;/p&gt;
&lt;p&gt;​		%s/old/new/g：替换所有的&lt;/p&gt;
&lt;p&gt;​		%s/old/new/gc：替换所有的，替换时提示&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;nano、Emacs、KDE、GNOME	&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;h3 id="11构建基础脚本"&gt;11构建基础脚本
&lt;/h3&gt;&lt;h4 id="111使用多个命令"&gt;11.1使用多个命令
&lt;/h4&gt;&lt;p&gt;多个命令同一行，分号分隔	命令行最大字符数255&lt;/p&gt;
&lt;h4 id="112创建shell脚本文件"&gt;11.2创建shell脚本文件
&lt;/h4&gt;&lt;p&gt;文件第一行指定shell：#!/bin/bash&lt;/p&gt;
&lt;p&gt;注释：#	不解释#，除了#！&lt;/p&gt;
&lt;p&gt;运行脚本{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将放置shell脚本文件的目录添加到PATH环境变量中&lt;/li&gt;
&lt;li&gt;在命令行中使用绝对路径或相对路径来引用shell脚本文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	&lt;em&gt;权限&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="113显示消息"&gt;11.3显示消息
&lt;/h4&gt;&lt;p&gt;echo	-n&lt;/p&gt;
&lt;h4 id="114使用变量"&gt;11.4使用变量
&lt;/h4&gt;&lt;p&gt;环境变量：用$引用&lt;/p&gt;
&lt;p&gt;\$		${var}	{}可选&lt;/p&gt;
&lt;p&gt;用户自定义变量{&lt;/p&gt;
&lt;p&gt;​	名称：字母、数字、_ 	长度不超过20	区分大小写&lt;/p&gt;
&lt;p&gt;​	赋值：“=”两边无空格	var=value&lt;/p&gt;
&lt;p&gt;​	&amp;lsquo;&amp;rsquo;,&amp;rdquo;&amp;quot;,省略都是字符串&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;命令替换{&lt;/p&gt;
&lt;p&gt;​	&lt;u&gt;从命令输出中提取信息并将其赋给变量&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;​	将命令输出赋给变量：`command`	$(command)	反引号&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="115重定向输入和输出"&gt;11.5重定向输入和输出
&lt;/h4&gt;&lt;p&gt;重定向运算符指向数据流动方向&lt;/p&gt;
&lt;p&gt;输出重定向：command &amp;gt; outputfile	&amp;raquo;追加&lt;/p&gt;
&lt;p&gt;输入重定向{command &amp;lt; inputfile&lt;/p&gt;
&lt;p&gt;wc：统计数据中的文本&lt;/p&gt;
&lt;p&gt;​	内联输入重定向：command &amp;laquo; marker	指定文本标记划分起止&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="116管道"&gt;11.6管道
&lt;/h4&gt;&lt;p&gt;管道连接(piping){command1 | command2&lt;/p&gt;
&lt;p&gt;同时运行两个命令，在系统内部连接，第一个命令产生输出时，立即传给第二个命令。&lt;/p&gt;
&lt;p&gt;串联的数量无限制:command1 | command2 | command3&lt;/p&gt;
&lt;p&gt;常用：ls -al | more&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="117执行数学运算"&gt;11.7执行数学运算
&lt;/h4&gt;&lt;p&gt;{	只支持整数运算&lt;/p&gt;
&lt;p&gt;expr命令：转义字符(\)&lt;/p&gt;
&lt;p&gt;使用方括号：$[operation]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;浮点数解决方案{	bash计算器bc	（编程语言）&lt;/p&gt;
&lt;p&gt;基本用法&lt;/p&gt;
&lt;p&gt;​	能够识别{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数字(整数、浮点数)&lt;/li&gt;
&lt;li&gt;变量(简单变量、数组)&lt;/li&gt;
&lt;li&gt;注释(#、/**/)&lt;/li&gt;
&lt;li&gt;表达式&lt;/li&gt;
&lt;li&gt;编程语句&lt;/li&gt;
&lt;li&gt;函数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	scale：控制小数点位数&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;在脚本中使用bc{&lt;/p&gt;
&lt;p&gt;​	var=$(echo &amp;ldquo;option; expression&amp;rdquo; | bc)&lt;/p&gt;
&lt;p&gt;​	var=$(bc &amp;laquo; EOF&lt;/p&gt;
&lt;p&gt;​	options&lt;/p&gt;
&lt;p&gt;​	statements&lt;/p&gt;
&lt;p&gt;​	expressions&lt;/p&gt;
&lt;p&gt;​	EOF&lt;/p&gt;
&lt;p&gt;​	)&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="118退出脚本"&gt;11.8退出脚本
&lt;/h4&gt;&lt;p&gt;查看退出状态码：$?	0~255&lt;/p&gt;
&lt;p&gt;​	保存最后一个已执行命令的退出状态码&lt;/p&gt;
&lt;p&gt;exit命令：&lt;/p&gt;
&lt;h4 id="119实战"&gt;11.9实战
&lt;/h4&gt;&lt;p&gt;纪元时间：date -d &amp;ldquo;Jan 1, 2020&amp;rdquo; +%s&lt;/p&gt;
&lt;h3 id="12结构化命令"&gt;12结构化命令
&lt;/h3&gt;&lt;p&gt;结构化命令：根据条件跳过部分命令，改变执行流程&lt;/p&gt;
&lt;h4 id="121使用if-then语句"&gt;12.1使用if-then语句
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;if command	退出状态码&lt;/p&gt;
&lt;p&gt;then			是0执行&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="122if-then-else语句"&gt;12.2if-then-else语句
&lt;/h4&gt;&lt;p&gt;if command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​ commands&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;​ commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="123嵌套if语句"&gt;12.3嵌套if语句
&lt;/h4&gt;&lt;p&gt;if command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;elif command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;elif &amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="124test命令"&gt;12.4test命令
&lt;/h4&gt;&lt;p&gt;格式：test &lt;em&gt;condition&lt;/em&gt;	condition是一系列参数和值&lt;/p&gt;
&lt;p&gt;退出状态码	0：成立	1：不成立&lt;/p&gt;
&lt;p&gt;判断3类条件：	整数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;数值比较：eq	ge	gt	le	lt	ne&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字符串比较：=	！=	&amp;lt;	&amp;gt;	-n	-z&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文件比较：-d -e -f -r -s -w -x -O -G filename	-nt -ot&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;if [ condition ]	注意要空格&lt;/p&gt;
&lt;p&gt;&amp;lt;，&amp;gt;字符串顺序难题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;，&amp;gt;必须转义，和重定向混淆&lt;/li&gt;
&lt;li&gt;&amp;lt;，&amp;gt;顺序和sort命令不同&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件比较：shell编程中最为强大且用得最多的比较形式&lt;/p&gt;
&lt;h4 id="125复合条件测试"&gt;12.5复合条件测试
&lt;/h4&gt;&lt;p&gt;布尔逻辑：&amp;amp;&amp;amp;	||&lt;/p&gt;
&lt;h4 id="126if-then的高级特性"&gt;12.6if-then的高级特性
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在子shell中执行命令的单括号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于数学表达式的双括号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于高级字符串处理功能的双方括号&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单括号：(command)		创建子shell&lt;/p&gt;
&lt;p&gt;双括号：(( expresion ))	高级数学表达式，不用转义&lt;/p&gt;
&lt;p&gt;双方括号：[[ expression ]]{&lt;/p&gt;
&lt;p&gt;​	模式匹配	bashshell&lt;/p&gt;
&lt;p&gt;​	== !=	右侧被视为通配符&lt;/p&gt;
&lt;p&gt;​	=~		右侧被视为POSIX扩展正则表达式&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="127case命令"&gt;12.7case命令
&lt;/h4&gt;&lt;p&gt;列表格式：&lt;/p&gt;
&lt;p&gt;case variable in&lt;/p&gt;
&lt;p&gt;pattern1 | pattern2) commands1;;&lt;/p&gt;
&lt;p&gt;pattern3) commands2;;&lt;/p&gt;
&lt;p&gt;*) default commands;;&lt;/p&gt;
&lt;p&gt;esac&lt;/p&gt;
&lt;h4 id="128实战"&gt;12.8实战
&lt;/h4&gt;&lt;h3 id="13更多的结构化命令"&gt;13更多的结构化命令
&lt;/h3&gt;&lt;h4 id="131for命令"&gt;13.1for命令
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;for var in list&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;读取列表中的值{&lt;/p&gt;
&lt;p&gt;​	for v in a b c d&lt;/p&gt;
&lt;p&gt;​	保留var的值	空白字符分隔&lt;/p&gt;
&lt;p&gt;​	读取复杂值：转义字符、双引号单引号&lt;/p&gt;
&lt;p&gt;​	从变量中读取&lt;/p&gt;
&lt;p&gt;​	从命令中读取：$(cat $file)	file=绝对路径、相对路径或同一个目录下&lt;/p&gt;
&lt;p&gt;​	更改字段分隔符：{&lt;/p&gt;
&lt;p&gt;​		IFS(internal field separator)&lt;/p&gt;
&lt;p&gt;​		IFS=$&amp;rsquo;\n&amp;rsquo;	IFS.OLD=$IFS&lt;/p&gt;
&lt;p&gt;​				}&lt;/p&gt;
&lt;p&gt;​	使用通配符读取目录	file globbing&lt;/p&gt;
&lt;p&gt;​		for file in /home/*&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="132c语言风格的for命令"&gt;13.2C语言风格的for命令
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;for ((variable assignment ; condition ; iteration process))&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;for ((a = 1 ; a &amp;lt; 10 ; a++ ))	可空格&lt;/p&gt;
&lt;h4 id="133while命令"&gt;13.3while命令
&lt;/h4&gt;&lt;p&gt;格式：	只要？为0执行，不为0停止&lt;/p&gt;
&lt;p&gt;while test command&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	other commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;使用多个测试命令，只有最后一个决定是否结束&lt;/p&gt;
&lt;h4 id="134until命令"&gt;13.4until命令
&lt;/h4&gt;&lt;p&gt;结束条件和while相反，其他使用相似&lt;/p&gt;
&lt;p&gt;格式：	只要？为0停止，不为0执行&lt;/p&gt;
&lt;p&gt;until test command&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	other commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4 id="135嵌套循环"&gt;13.5嵌套循环
&lt;/h4&gt;&lt;h4 id="136循环处理文件数据"&gt;13.6循环处理文件数据
&lt;/h4&gt;&lt;p&gt;综合：嵌套循环，修改IFS环境变量&lt;/p&gt;
&lt;h4 id="137循环控制"&gt;13.7循环控制
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;break命令	n(1)&lt;/li&gt;
&lt;li&gt;continue命令	n(1)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="138处理循环的输出"&gt;13.8处理循环的输出
&lt;/h4&gt;&lt;p&gt;管道、重定向&lt;/p&gt;
&lt;p&gt;在done命令之后添加处理命令&lt;/p&gt;
&lt;h4 id="139实战"&gt;13.9实战
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;查找可执行文件&lt;/li&gt;
&lt;li&gt;创建多个用户账户{&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​	CSV(comma-separated value, 逗号分隔值)&lt;/p&gt;
&lt;p&gt;​	while read&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h3 id="14处理用户输入"&gt;14处理用户输入
&lt;/h3&gt;&lt;h4 id="141传递参数"&gt;14.1传递参数
&lt;/h4&gt;&lt;p&gt;最基本方法：命令行参数	./test.sh arg1 arg2 &amp;hellip;&lt;/p&gt;
&lt;p&gt;读取参数{&lt;/p&gt;
&lt;p&gt;​	位置参数(positional parameter)接收命令行参数&lt;/p&gt;
&lt;p&gt;​		$0-脚本名，$1-第一个命令，&amp;hellip;，$9，${10},&amp;hellip;&lt;/p&gt;
&lt;p&gt;​	引号	&amp;lsquo;aa bb&amp;rsquo;&lt;/p&gt;
&lt;p&gt;​	读取脚本名	$0	编写包含多种功能或生成日志消息的工具。拥有一个能识别自己的脚本对于追踪脚本问题、系统审计和生成日志信息非常有用。&lt;/p&gt;
&lt;p&gt;​		basename命令&lt;/p&gt;
&lt;p&gt;​	参数测试	[ -n &amp;ldquo;$1&amp;rdquo; ]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="142特殊参数变量"&gt;14.2特殊参数变量
&lt;/h4&gt;&lt;p&gt;参数统计：$#	${!#}&lt;/p&gt;
&lt;p&gt;获取所有的数据{&lt;/p&gt;
&lt;p&gt;​	$*：一个整体&lt;/p&gt;
&lt;p&gt;​	$@：各个独立单词&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="143移动参数"&gt;14.3移动参数
&lt;/h4&gt;&lt;p&gt;shift命令{	操作命令行参数&lt;/p&gt;
&lt;p&gt;​	shift	[n]&lt;/p&gt;
&lt;p&gt;​	默认将每个位置的变量值向左移动一个位置	$0不变&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="144处理选项"&gt;14.4处理选项
&lt;/h4&gt;&lt;p&gt;选项：在连字符之后出现的单个字母，能够改变命令的行为&lt;/p&gt;
&lt;p&gt;​	长选项：双连字符起始，跟着一个字符串&lt;/p&gt;
&lt;p&gt;查找选项{&lt;/p&gt;
&lt;p&gt;​	处理简单选项：while、case、shift&lt;/p&gt;
&lt;p&gt;​	分离参数和选项：&amp;ndash;	同时选用选项和参数&lt;/p&gt;
&lt;p&gt;​		while、case、shift、break&lt;/p&gt;
&lt;p&gt;​	处理含值的选项：&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用getopt命令{&lt;/p&gt;
&lt;p&gt;​	接受一系列任意形式的命令行选项和参数，并自动将其转换成适当的格式。能识别命令行参数，简化解析过程。&lt;/p&gt;
&lt;p&gt;​	格式：getopt &lt;u&gt;optstring&lt;/u&gt; parameters&lt;/p&gt;
&lt;p&gt;​	在optstring中列出在脚本中要用到的每个字母，在每个需要值的后面加&amp;quot;：&amp;quot;&lt;/p&gt;
&lt;p&gt;​	在脚本中使用：set &amp;ndash; $(getopt -q ab:cd &amp;ldquo;$@&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;前者在命令行中选项和参数处理后只生成一个输出，后者能够和已有的shell位置变量配合默契&lt;/p&gt;
&lt;p&gt;使用getopts命令{&lt;/p&gt;
&lt;p&gt;​	每次只处理一个检测到的命令行参数。在处理完所有的参数后，getopts会退出并返回一个大于0的退出状态码。&lt;/p&gt;
&lt;p&gt;​	适用在解析命令行参数的循环中&lt;/p&gt;
&lt;p&gt;​	格式：getopts &lt;u&gt;optstring&lt;/u&gt; variable	:	将当前参数保存在命令行中定义的variable	OPTARG,OPTIND&lt;/p&gt;
&lt;p&gt;}	在所有shell脚本中使用的全功能命令行选项和参数处理工具&lt;/p&gt;
&lt;h4 id="145选项标准化"&gt;14.5选项标准化
&lt;/h4&gt;&lt;h4 id="146获取用户输入"&gt;14.6获取用户输入
&lt;/h4&gt;&lt;p&gt;基本的读取{&lt;/p&gt;
&lt;p&gt;​	read	从标准输入(键盘)或另一个文件描述符中接受输入&lt;/p&gt;
&lt;p&gt;​	格式：read variable	-p	REPLY&lt;/p&gt;
&lt;p&gt;​	read -p &amp;ldquo;helloworld&amp;rdquo; var&lt;/p&gt;
&lt;p&gt;​	超时：-t	-n&lt;/p&gt;
&lt;p&gt;​	无显示读取：-s&lt;/p&gt;
&lt;p&gt;​	从文件中读取：&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="147实战"&gt;14.7实战
&lt;/h4&gt;&lt;p&gt;ping命令：快速测试网络主机是否可用&lt;/p&gt;
&lt;h3 id="15呈现数据"&gt;15呈现数据
&lt;/h3&gt;&lt;p&gt;将脚本的输出重定向到Linux系统的不同位置&lt;/p&gt;
&lt;h4 id="151理解输入和输出"&gt;15.1理解输入和输出
&lt;/h4&gt;&lt;p&gt;文件描述符{&lt;/p&gt;
&lt;p&gt;​	Linux用文件描述符标识每个文件对象&lt;/p&gt;
&lt;p&gt;​	非负整数，唯一会标识会话中打开的文件&lt;/p&gt;
&lt;p&gt;​	标准文件描述符&lt;/p&gt;
&lt;p&gt;文件描述符	缩写	描述&lt;/p&gt;
&lt;p&gt;0			STDIN	 标准输入&lt;/p&gt;
&lt;p&gt;1			STDOUT	标准输出&lt;/p&gt;
&lt;p&gt;2			STDERR	 标准错误&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;STDERR{&lt;/p&gt;
&lt;p&gt;​	默认和OUT指向同一个地方&lt;/p&gt;
&lt;p&gt;​	重定向错误{&lt;/p&gt;
&lt;p&gt;​		只重定向错误：2&amp;gt; file&lt;/p&gt;
&lt;p&gt;​		重定向错误信息和正常输出：&lt;/p&gt;
&lt;p&gt;​			1&amp;gt; file1 2&amp;gt; file2&lt;/p&gt;
&lt;p&gt;​			&amp;amp;&amp;gt; file&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="152在脚本中重定向输出"&gt;15.2在脚本中重定向输出
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;临时重定向每一行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;永久重定向脚本中的所有命令&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;临时重定向：&amp;gt;&amp;amp;2	./file 2&amp;gt; fileERR&lt;/p&gt;
&lt;p&gt;​	重定向到文件描述符加&amp;amp;&lt;/p&gt;
&lt;p&gt;永久重定向：exec [0,1,2]&amp;gt;file&lt;/p&gt;
&lt;h4 id="153在脚本中重定向输入"&gt;15.3在脚本中重定向输入
&lt;/h4&gt;&lt;p&gt;exec命令将STDIN重定向为文件：exec 0&amp;lt; file&lt;/p&gt;
&lt;h4 id="154创建自己的重定向"&gt;15.4创建自己的重定向
&lt;/h4&gt;&lt;p&gt;替代性文件描述符：3~8&lt;/p&gt;
&lt;p&gt;创建输出文件描述符：exec 3&amp;gt; file	&amp;raquo;追加&lt;/p&gt;
&lt;p&gt;重定向文件描述符{&lt;/p&gt;
&lt;p&gt;​	恢复已重定向的文件描述符&lt;/p&gt;
&lt;p&gt;​	exec 3&amp;gt;&amp;amp;1&lt;/p&gt;
&lt;p&gt;​	exec 1&amp;gt;file&lt;/p&gt;
&lt;p&gt;​	exec 1&amp;gt;&amp;amp;3&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;创建输入文件描述符：exec 6&amp;lt;file&lt;/p&gt;
&lt;p&gt;创建读/写文件描述符：exec 3&amp;lt;&amp;gt; file&lt;/p&gt;
&lt;p&gt;​	任何读/写从文件指针上次的位置开始&lt;/p&gt;
&lt;p&gt;关闭文件描述符：exec 3&amp;gt;&amp;amp;-&lt;/p&gt;
&lt;h4 id="155列出打开的文件描述符"&gt;15.5列出打开的文件描述符
&lt;/h4&gt;&lt;p&gt;lsof命令{	-p	-d&lt;/p&gt;
&lt;p&gt;​	列出整个Linux系统打开的所有文件描述符(包括后台进程、登录用户打开的文件)&lt;/p&gt;
&lt;p&gt;​	$$：当前进程PID&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="156抑制命令输出"&gt;15.6抑制命令输出
&lt;/h4&gt;&lt;p&gt;将STDERR重定向到null文件&lt;/p&gt;
&lt;p&gt;位置：/dev/null&lt;/p&gt;
&lt;p&gt;2&amp;gt; /dev/null&lt;/p&gt;
&lt;p&gt;快速清除文件中的数据：cat /dev/null &amp;gt; file&lt;/p&gt;
&lt;h4 id="157使用临时文件"&gt;15.7使用临时文件
&lt;/h4&gt;&lt;p&gt;/tmp{&lt;/p&gt;
&lt;p&gt;​	专供临时文件使用的特殊目录，存放不需要永久保留的文件&lt;/p&gt;
&lt;p&gt;​	任何用户都有读写权限&lt;/p&gt;
&lt;p&gt;​	mktemp&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;创建本地临时文件{&lt;/p&gt;
&lt;p&gt;​	指定文件名模板，模板包含任意文本字符，在 末尾加6个X&lt;/p&gt;
&lt;p&gt;​	mktemp testing.XXXXXX	输出为文件名&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;在/tmp命令中创建临时文件：-t 返回完整路径名&lt;/p&gt;
&lt;p&gt;创建临时目录：-d&lt;/p&gt;
&lt;h4 id="158记录消息"&gt;15.8记录消息
&lt;/h4&gt;&lt;p&gt;tee命令{	连接管道的T型接头&lt;/p&gt;
&lt;p&gt;​	将来自STDIN的数据同时送往两处：STDOUT,所指定的文件&lt;/p&gt;
&lt;p&gt;​	tee file	-a&lt;/p&gt;
&lt;p&gt;​	配合管道命令：date | tee file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="159实战"&gt;15.9实战
&lt;/h4&gt;&lt;p&gt;读取CSV格式的数据文件，输出SQL INSERT语句，并将数据插入数据库。&lt;/p&gt;
&lt;h3 id="16脚本控制"&gt;16脚本控制
&lt;/h3&gt;&lt;h4 id="161处理信号"&gt;16.1处理信号
&lt;/h4&gt;&lt;p&gt;Linux系统信号&lt;/p&gt;
&lt;p&gt;信号		值		描述&lt;/p&gt;
&lt;p&gt;1		SIGHUP	挂起(hang up)进程&lt;/p&gt;
&lt;p&gt;2		SIGINT	 中断(interrupt)进程&lt;/p&gt;
&lt;p&gt;3		SIGQUIT	停止(stop)进程&lt;/p&gt;
&lt;p&gt;9		SIGKILL	 无条件终止(terminate)..&lt;/p&gt;
&lt;p&gt;15	 SIGTERM	尽可能终止..&lt;/p&gt;
&lt;p&gt;18	 SIGCONT	继续运行停止的..&lt;/p&gt;
&lt;p&gt;19	 SIGSTOP	无条件停止，但不终止..&lt;/p&gt;
&lt;p&gt;20	 SIGTSTP	停止或暂停(pause)，但不终止..&lt;/p&gt;
&lt;p&gt;产生信号&lt;/p&gt;
&lt;p&gt;键盘组合键&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;中断进程：Ctrl+C	SIGINT发送给当前shell所有进程&lt;/li&gt;
&lt;li&gt;暂停进程：Ctrl+	SIGTSTP&amp;hellip;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​	ps -l	kill -9 &lt;em&gt;PID&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;捕获信号{&lt;/p&gt;
&lt;p&gt;​	trap命令：指定shell脚本需要侦测并拦截的	信号&lt;/p&gt;
&lt;p&gt;​	格式：trap commands signals	空格分隔&lt;/p&gt;
&lt;p&gt;​	trap “” SIGINT&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;捕获脚本退出：trap &amp;ldquo;echo bye..&amp;rdquo; EXIT&lt;/p&gt;
&lt;p&gt;修改或移除信号捕获{&lt;/p&gt;
&lt;p&gt;​	修改：重新使用trap命令&lt;/p&gt;
&lt;p&gt;​	trap -p&lt;/p&gt;
&lt;p&gt;​	移除：trap &amp;ndash; SIGINT	trap - SIGINT&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="162以后台模式运行脚本"&gt;16.2以后台模式运行脚本
&lt;/h4&gt;&lt;p&gt;ps -e	看到运行的多个进程&lt;/p&gt;
&lt;p&gt;在后台模式中，进程运行时不和终端会话的STDIN、STDOUT、STDERR关联&lt;/p&gt;
&lt;p&gt;后台运行脚本{&lt;/p&gt;
&lt;p&gt;​	在脚本名后加&amp;amp;&lt;/p&gt;
&lt;p&gt;​	./file &amp;amp;&lt;/p&gt;
&lt;p&gt;​	[1] 2563	作业号，PID&lt;/p&gt;
&lt;p&gt;​	结束时：[1] + Done		./file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;运行多个后台作业&lt;/p&gt;
&lt;h4 id="163在非控制台下运行脚本"&gt;16.3在非控制台下运行脚本
&lt;/h4&gt;&lt;p&gt;nohup{	让脚本一直以后台模式运行到结束&lt;/p&gt;
&lt;p&gt;​	阻断发给特定进程的SIGHUP信号&lt;/p&gt;
&lt;p&gt;​	格式：nohup command&lt;/p&gt;
&lt;p&gt;​	将STDOUT、STDERR产生的消息重定向到	nohup.out&lt;/p&gt;
&lt;p&gt;​	注意多个命令运行在同目录&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="164作业控制"&gt;16.4作业控制
&lt;/h4&gt;&lt;p&gt;包括:启动、停止、杀死、恢复作业&lt;/p&gt;
&lt;p&gt;查看作业{&lt;/p&gt;
&lt;p&gt;​	jobs	作业控制中的关键命令，允许用户查看shell当前正在处理的作业&lt;/p&gt;
&lt;p&gt;​	+：默认作业，作业控制命令可省略作业号&lt;/p&gt;
&lt;p&gt;​	-：下一个默认作业&lt;/p&gt;
&lt;p&gt;​	-l	-n -r -s&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;重启已停止的作业{	可将已停止的作业作为后台进程或前台进程重启	前台进程会接管当前使用的终端&lt;/p&gt;
&lt;p&gt;​	bg命令：以后台模式重启&lt;/p&gt;
&lt;p&gt;​	fg命令：以前台模式重启	(foreground)&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="165调整谦让度"&gt;16.5调整谦让度
&lt;/h4&gt;&lt;p&gt;多任务操作系统中，内核负责为每个运行的进程分配CPU时间&lt;/p&gt;
&lt;p&gt;nice value{	调度优先级、谦让度&lt;/p&gt;
&lt;p&gt;​	指内核为进程分配的CPU时间(相对于其他进程)&lt;/p&gt;
&lt;p&gt;​	Linux中，由shell启动的所有进程优先级默认为0&lt;/p&gt;
&lt;p&gt;​	整数值，-20~+19	-20最高优先级	Nice guys finish last.&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;nice命令：启动命令时设置调度优先级	nice -n &lt;em&gt;number&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;renice命令：修改已运行命令的优先级	renice -n &lt;em&gt;number&lt;/em&gt; -p &lt;em&gt;PID&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="166定时运行作业"&gt;16.6定时运行作业
&lt;/h4&gt;&lt;p&gt;在预选时间运行脚本的方法：at命令、cron表、anacron&lt;/p&gt;
&lt;p&gt;使用at命令调度作业{&lt;/p&gt;
&lt;p&gt;​	将作业提交到队列中，指定Linux系统何时运行脚本&lt;/p&gt;
&lt;p&gt;​	atd：at守护进程，在队列中检查待运行的作业&lt;/p&gt;
&lt;p&gt;​	格式：at [-f filename] time&lt;/p&gt;
&lt;p&gt;时间格式	/usr/share/doc/at/timespec&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准小时分钟：10:15&lt;/li&gt;
&lt;li&gt;AM/PM指示符：10:15 PM&lt;/li&gt;
&lt;li&gt;特殊时间：now、noon、midnight、teatime(4pm)&lt;/li&gt;
&lt;li&gt;标准日期：MMDDYY、MM/DD/YY、DD.MM.YY&lt;/li&gt;
&lt;li&gt;文本日期：Jul 4、Dec 25(可加年份)&lt;/li&gt;
&lt;li&gt;时间增量：
&lt;ul&gt;
&lt;li&gt;Now + 25 minutes&lt;/li&gt;
&lt;li&gt;10:15 PM tomorrow&lt;/li&gt;
&lt;li&gt;10:15 + 7 days&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	两个队列：a&lt;del&gt;z、A&lt;/del&gt;Z	-q	(z队列占用较少CPU)&lt;/p&gt;
&lt;p&gt;​	获取作业的输出：用户email地址作为STDOUT、STDERR	-M&lt;/p&gt;
&lt;p&gt;​	列出等待的作业：atq命令&lt;/p&gt;
&lt;p&gt;​	删除作业：atrm 作业号&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;调度需要定期运行的脚本{&lt;/p&gt;
&lt;p&gt;​	cron程序调度需要定期运行的作业 	假定Linux系统7*24小时运行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cron时间表：通过特别的格式指定作业何时运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	 格式：minutepasthour hourofday dayofmonth month dayofweek command&lt;/p&gt;
&lt;p&gt;​		字段：值、取值范围(28-30)、通配符&lt;/p&gt;
&lt;p&gt;​		指定完整路径&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建cron时间表：crontab命令	-l	-e&lt;/li&gt;
&lt;li&gt;浏览cron目录：hourly、daily、monthly、weekly	将脚本复制到相应目录&lt;/li&gt;
&lt;li&gt;anacron：只处理cron目录的程序，保证作业一定能运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	时间表格式：period delay identifier command	period以天为单位&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="167使用新的shell启动脚本"&gt;16.7使用新的shell启动脚本
&lt;/h4&gt;&lt;h4 id="168实战"&gt;16.8实战
&lt;/h4&gt;&lt;p&gt;辅助需要在运行时避免被中断的脚本&lt;/p&gt;
&lt;p&gt;source工具&lt;/p&gt;</description></item></channel></rss>