目录
Linux背景
Linux发展史
1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组
(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发,该系统是由一名叫Andrew S Tanenbaum的教师开发的。读者也许猜想所发布的这个系统应该是Linux的0.01版本,实际上不是这样。真正的Linux 0.01版本并没有被发布,原因是0.01版本不实用。Linus仅仅在第一个Linux的FTP站点ftp://nic.funet.fi上提供过这个版本的的源代码。Torvalds于10月5日发布的这个Linux版本被称为0.02版,它能够运行GNU BourneAgainShell(bash)和GNU的C编译程序(gcc)以及为数不多的其它语言。Torvalds绝对没有想到他设想的一种能够针对高级业余爱好者和黑客们的操作系统已经产生,这就是人们所称的Linux。Linux发布时的版本是0.02,后来又有0.03版,然后又跳到0.10版。因为世界各地越来越多的程序员都开始开Linux,它已经达到0.95版。这就意味着正是公布1.0版本的时间已经为期不远了。正式的1.0版本是在1994年公布的Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用“Linux内核”来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它包括GUI组件和许多其他实用工具。
GNU
GNU是一个非盈利组织, 于1983年由Richard Stallman(rms)发起,意在为所有软件用户能够自由控制自己的计算而构建一款由大家共同努力开发而成的操作系统。rms今天仍然是GNU的首席搞事者。GNU的基本目标和一贯目标是提供一个和Unix兼容的100% 自由软件的操作系统。不是95%、也不是99.5%、而是100%自由。这个系统的名字叫GNU,是GNU's Not Unix的首字母递归缩写—这是对Unix的技术思想致敬的一种方法,同时表达GNU有所不同。从技术上说,GNU很像Unix。但是它不同于Unix,GNU给予其用户自由。
GNU由自由软件基金会以多种方式支持,这也是由rms创建的倡导自由软件理念的非盈利组织。FSF还接受版权合约和免责声明,因此它可以为GNU程序打官司。(更确切地说,为GNU贡献程序不要求把版权转交给FSF。如果你赋予FSF版权,FSF在有人违反GPL时会执行版权;如果你保留版权,那么你自己负责执行版权。)
GNU通用公共许可协议(GNU General Public License,简称GNU GPL或GPL),是一个广泛被使用的自由软件许可协议条款,最初由理查德斯托曼为GNU计划而撰写,GPL给予了计算机程序自由软件的定义, 任何基于GPL软件开发衍生的产品在发布时必须采用GPL许可证方式,且必须公开源代码,Linux是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。
应用场景
- Linux在服务器领域
随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品一定能够冲击更大的服务器市场。据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。
- Linux在桌面领域
近年来,特别在国内市场,Linux桌面操作系统的发展趋势非常迅猛。国内如中标麒麟Linux、红旗
Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积累了大量社区用户。但是,从系统的整体功能、性能来看,Linux桌面系统Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面。
- Linux在移动嵌入式领域
Linux的低成本、强大的定制功能以及良好的移植性能,使得Linux在嵌入式系统方面也得到广泛应用,目前Linux以广泛应用于手机、平板电脑、路由器、电视和电子游戏机等领域。在移动设备上广泛使用的Android操作系统就是创建在Linux内核之上的。目前,Android已经成为全球最流行的智能手机操作系统,据2015年权威部门最新统计,Android操作系统的全球市场份额已达84.6%。此外,思科在网络防火墙和路由器也使用了定制的Linux,阿里云也开发了一套基于Linux的操作系统“YunOS”,可用于智能手机、平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等都在逐渐采用定制版本的Linux来实现,而这一切均归功与Linux与开源的力量。
- Linux在云计算、大数据领域
互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展,云计算、大数据作为一个基于开源软件的平台,Linux占据了核心优势;据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。
发行版本
这些发行版本其实本质上都是基于Linux拓展而来的,所以它们的指令等大多数是互通的,在操作系统选择时并不需要过于纠结。对Linux版本感兴趣可以访问:The Linux Kernel Archives
- Debian
- Ubuntu
- 红帽企业级Linux
- CentOS
- Fedora
- Kali Linux
Linux有多个发行版本,我们可以根据需要选择系统进行环境搭建,一般国内常用的是Centos和Ubuntu。而Linux搭建环境的方式主要有三种:
从概念上认识Linux
操作系统的概念
计算机的层次结构
计算机可以说是由硬件和软件两大部分所构成的,可以细分为如下7个层次:
详细一点是下面这种:
也可以简化为如下的四个层次:
操作系统的理解
从上面的简化示意图可以看到,操作系统介于硬件和应用软件之间。操作系统的本质就是软件,是一款能够进行软硬件之间资源管理的软件。那么为什么要有操作系统呢?一方面,操作系统提供一系列底层接口和上层标准,“抹平”不同电脑之间的硬件差异,这样只要操作系统相同,硬件能达到软件运行的最低标准,理论上这个软件就能互通。此外,操作系统可以为所有程序分配资源,一切程序要调用计算机资源都需要向操作系统申请权限,这样就能最大程度利用计算机资源同时让各种程序不互相冲突。简而言之,操作系统在计算机系统中承上启下的地位:向下封装硬件,向上提供操作接口。
而我们平时编写的程序,也都是访问了硬件的,例如printf是在显示器上打印数据,加减等操作需要访问CPU。而从应用程序到硬件之间,也就必定经过了操作系统,调用了操作系统对应的接口。也就是说,操作系统可以看作是一个中介,用于应用程序和硬件之间的交互,起到了防止应用程序的不当操作对硬件造成损坏和调配实际的硬件资源等作用。
用户的概念
在Linux操作系统中,用户是指使用计算机系统的个体或实体。每个用户都有一个唯一的用户名,用于识别他们并允许他们访问系统资源和执行任务。
同时,Linux是一个多用户操作系统,这意味着多个用户可以同时使用同一台计算机,并且系统能够有效地管理这些用户,确保他们的数据和任务彼此隔离。每个用户都有自己的权限和设置,包括文件和目录的访问权限、家目录(用于存储个人文件和配置信息)、登录密码等。用户可以通过登录到系统来执行各种任务,例如运行程序、编辑文件、管理系统配置等。
在Linux中,有一个管理员用户,也称root用户,它拥有系统的最高权限,任何操作都不受权限的约束。然而,出于安全原因,通常情况下不以root用户身份工作,而是使用sudo等机制来以非特权用户的身份执行系统管理任务。
如下是有关Linux用户的相关概念:
路径与目录
路径分隔符
Windows下的路径分隔符为:\
Linux下的路径分隔符为:/
相对路径和绝对路径
绝对路径:从根目录开始的路径,一直都是有效的。一般在配置文件中使用。绝对路径是从根目录开始的,所以使用时起始位置是根目录。例如:/home/ytc。
相对路径:相对当前所在的目录的路径。有自己的有效范围的。常用于日常使用,比如命令行输入等。相对路径的开头是一般来说,如果没有指定起始目录,Linux默认把路径或文件看作是相对当前目录的。所以使用相对路径时既可以写 ./ 也可以不写。
目录
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。这样设计的一个好处之一就是每一个文件都有唯一的路径与之对应,有效地避免了混淆的问题。
其中,根目录、家目录、当前目录和上级目录,是4个常用的概念,在这里额外介绍一下:
如下是对一些常见目录说明:
Linux下的文件
文件的种类
在Windows中,我们是以文件的后缀来定义文件的类型的。但在Linux中却不是,如下是Linux中的文件类型区分:
需要注意的是,虽然Linux中不以后缀区分文件的类型,但有些软件(如gcc、g++等)是需要处理指定后缀的文件才可以正常操作的。
当然,其实细分的话也许不止这些,例如以.开头的表示隐藏文件(默认不显示)等。但这有些过于细分了,所以一般说的文件类型就是上面那7个。
Linux下一切皆文件
"Linux下一切皆文件" 是一个广为流传的说法,它强调了Linux操作系统的一个重要原则:在Linux中,一切都可以被表示为文件。这个原则有助于使Linux系统的设计更加一致和统一,同时也提供了许多优势,比如可以使用相似的命令和工具来处理各种类型的数据。
如下是一些常用的相关内容:
文件 = 内容 + 属性
文件=内容+属性,这个概念是指文件是由内容和属性两部分构成的:
下面就举个例子简单介绍一下文件的属性:
例如下方是执行了ls -l之后显示的内容
我们单独抽出test文件来分析
首先,首字符d表示这是一个目录文件。后面的9个字符分别表示用户的权限属性,前三个字符(rwx)表示所有者的权限,中间三个字符(r-x)表示所属组的权限,后三个字符(r-x)表示其他用户的权限。至于权限是什么,后面会说的。
接着第一个root表示这个文件的拥有者是root,第二个root的表示这个文件的所属组是root。4096表示的是文件大小,单位是字节(byte)。"7月24 17:50"表示文档的最后修改时间(注意不是创建时间)。最后的test表示文件名,如果文件名以点(.)开头表示这是隐藏文件。
时间戳的概念
在Linux中,时间戳是一个用于表示时间的数值。它通常以秒为单位,从某个特定的起始点开始计算时间的流逝。有两种主要类型的时间戳:Unix时间戳和文件时间戳。
Unix时间戳,也称为Epoch时间戳,是从1970年1月1日00:00:00 UTC(协调世界时)开始计算的秒数。这个时间点被称为“Unix纪元”或“Epoch”。Unix时间戳是一个整数,表示从Epoch开始到特定时间的秒数。
文件时间戳,Linux系统中的文件都有三个与时间相关的时间戳属性:访问时间(atime)、修改时间(mtime)、变化时间(ctime)。这些时间戳以Unix时间戳的形式存储,但它们代表不同的含义。在文件时间戳中,可以手动更改这些时间戳,但通常它们由系统自动更新。如下是文件的三种时间戳详解:
常规权限
文件的拥有者、所属组和其它
在Linux中,每个文件都有拥有者、所属组和其他这三个身份。如下是关于这些身份的详细信息:
拥有者(Owner):
所属组(Group):
其他(Others):
权限的种类
一般来说,Linux下一个文件的权限种类有三种:(除此之外还有三种特殊权限,后面再说)
如果想要修改权限,可以使用chmod指令。
权限的表示
在Linux中,权限的表示方式有两种,分别是字符表示和数字表示:
默认权限和权限掩码
这里说的默认权限是指不考虑权限掩码的情况下,文件的初始权限。其中,普通文件默认不提供执行权限,所以默认权限是666;目录和可执行程序(gcc生成的等)一般默认提供执行权限,所以默认权限是777。
但默认权限并不是最终的权限,还需要经过一个权限掩码。那么权限掩码是什么呢?
在Linux下,权限掩码(umask)是一个重要的概念,用于确定新创建文件和目录的默认权限。权限掩码是一个八进制数,用来掩盖文件和目录权限中的特定位。权限掩码的工作原理是,它会从文件和目录的默认权限中去掉指定的位,从而限制新创建文件和目录的权限。
Linux中的umask通常是一个4位数字,每一位分别代表不同的文件权限位:
对于 umask 指令的权限掩码,第一个字符通常用来表示特殊权限,而不是常规的文件权限,特殊权限在文件和目录上有不同的含义。至于何为特殊权限,后面会讲。
普通用户在设置 umask 时不需要显式设置特殊权限,因为它们会根据系统和文件默认规则自动分配。特殊权限通常由系统管理员在特定情况下设置,以确保文件和目录的安全性和访问控制。所以,特殊权限我们现在可以不管,主要是看后3位。要注意,在计算时并不是直接减的,而是用按位与计算的,即最终权限=起始权限&权限掩码。可以理解为把对应的权限掩码给ban掉。
例如,如果权限掩码为0022,当创建一个目录时,理论上权限为777(rwx rwx rwx),但由于权限掩码的影响,要在原有的基础上去掉022(--- -w- -w-)权限。那么最终的权限就为755(rwx r-x r-x)。
权限掩码与umask指令息息相关,umask指令:
常见的用法就是直接umask——获取权限掩码。或者umsak加数字,修改权限掩码。如果umask要通过字符修改权限掩码的话,和chmod操作一样,不过会相对麻烦一些,不推荐这样使用。
用法示例:
特殊权限
除了常见的读取(r)、写入(w)和执行(x)权限外,还有特殊权限:SUID(Set User ID)、SGID(Set Group ID)、Sticky Bit(粘滞位)。
概念
SUID(Set User ID)
SGID(Set Group ID)
Sticky Bit(粘滞位)
用法
注意事项:
- 特殊权限同常规权限一样,不同的权限之间是相互独立的,可以叠加。421分别表示特殊权限为SUID、SGID、粘滞位,对应二进制位的表示(类比常规权限的表示)。
- 在某些Linux系统中,特别是在一些较新的发行版中,bash已经被设计成不会执行具有SUID和SUID权限的脚本或命令。这是为了减少潜在的安全风险,因为SUID可执行文件可以允许普通用户以特权用户的权限运行某些命令,如果受到恶意使用,可能会导致系统安全问题。但粘滞位还是可以正常使用的。
Shell的概念
Linux是一个复杂的操作系统,一个操作系统的组成通常包括:内核(Kernel)、系统库和工具、应用程序、驱动程序等等。而真正起到与硬件进行交互的就只有操作系统的内核(Kernel)。驱动程序相当于内核与硬件设备之间的媒介,并没有与硬件进行交互。而为了安全起见我们并不能直接使用系统内核,而是通过内核的“外壳”程序,也就是所谓的Shell,来与系统内核进行沟通。Shell就相当于是一个介于操作系统内核与用户之间的媒介,既可以有效的保护操作系统——防止系统崩溃和对硬件操作损伤等,相较于直接与内核进行交互,又极大的降低了的操作难度与上手成本。类比Windows,其图形化界面也就相当于是一个shell,只是相较Linux的黑白窗口更易于操作了,本质上它们是一样的。
Shell 既是一种命令语言,用于与操作系统交互执行任务,又是一种程序设计语言,允许用户编写自动化脚本和程序,从简单的命令操作到复杂的系统管理任务都可以使用 Shell 来实现。Shell作为命令行解释器时,其主要功能是:将使用者的命令翻译给系统内核处理,同时将核心的处理结果翻译给使用者。Shell作为程序设计语言时,其功能是:可以用来编写Shell脚本。
Shell并不指代具体的程序,只是一个泛称、统称,包括了多种不同的实现和变体,如Bash、Zsh、PowerShell等。提供了命令行和图形界面两种方式,其中Windows中常用的就是图形界面,Linux中常用的就是命令行中的bash。
常用指令
ls
- 使用格式:ls [选项] [目录或文件...]
- 功能介绍:对于目录,列出该目录下的所有子目录与文件。对于文件,列出文件名以及其他信息。没指定具体的内容时,默认是当前目录。
- 常用选项:
tree
- 使用格式:tree [参数]
- 功能介绍:以树状图形式列出目录内容。可能系统没有安装tree指令,此时需要手动安装一下:sudo yum install tree
- 常用选项:
stat
- 使用格式:stat [参数] 文件名
- 功能介绍:用于显示文件的状态信息。stat和ls的区别在于,ls是列出当前目录所有文件的部分信息,而stat是列出指定文件的详细信息。
- 常用选项:
clear
- 使用格式:clear
- 功能介绍:清除终端界面已有内容。执行clear命令后终端界面会向后翻一页,实现了“清除”当前屏幕上已有内容的效果
- 常用选项:略
pwd
- 使用格式:pwd
- 功能介绍:显示出当前目录的路径,默认从根目录开始
- 常用选项:略
echo
- 使用格式:echo[OPTION]... [STRING]...
- 功能介绍:显示一行文本。STRING既可以加双引号也可以不加双引号。
- 常用选项:
在没有 -E 的情况下,可承认并可以内置替换以下序列:\NNN 字符的ASCII代码为NNN(八进制)
cd
- 使用格式:cd [选项] [DIR 目录]
- 功能介绍:改变当前目录至 DIR 目录。默认 DIR 目录是家目录。
- 常用选项:
默认情况下跟随符号链接,如同指定 `-L'。
touch
- 使用格式:touch [参数] 文件名
- 功能介绍:用于创建空文件或修改时间戳。如果文件不存在,则会创建出一个空内容的普通文件(也可以理解为创建一个空的普通文件);如果文件已经存在,则会对文件的Atime(访问时间)和Ctime(修改时间)进行修改操作。
- 常用选项:
mkdir
- 使用格式:mkdir [选项] 目录名称...
- 功能介绍:创建目录文件。若要创建的目录已经存在,则会提示已存在而不会继续创建。要想一次性创建多层目录,则需要加入-p参数,进行递归操作。
- 常用选项:
rmdir
- 使用格式:rmdir [参数] 目录名
- 功能介绍:删除空目录文件。rmdir命令仅能够删除空内容的目录文件,如需删除非空目录时,则需要使用带有-R参数的rm命令进行操作。
- 常用选项:
rm
- 使用格式:rm [参数] 文件名
- 功能介绍:删除目标文件,可以一次删除多个文件或递归删除目录及其内的所有子文件。
- 常用选项:
cp
- 使用格式:cp [参数] 源文件名 目标文件名或路径
- 功能介绍:用于复制文件或目录。cp命令能够将一个或多个文件或目录复制到指定位置,亦常用于文件的备份工作。
- 常用选项:
mv
- 使用格式:mv [参数] 源文件名 目标文件名或目录
- 功能介绍:对文件进行剪切移动,当源文件和目标位置在同一目录时相当于重命名操作。
- 常用选项:
cat
- 使用格式:cat [参数] [文件名]
- 功能介绍:显示文件内容,默认显示在终端设备。当不指定文件时,默认接收标准输入设备的输入,并显示到终端设备。
- 常用选项:
more
- 使用格式:more [参数] 文件名
- 功能介绍:分页显示文本文件内容。在查看过程中,回车是向下一行,空格或z是向下一页,按q是退出。但more一个比较难受的地方在于只能向后走,不能向前翻。
- 常用选项:
less
- 使用格式:less [参数] 文件名
- 功能介绍:分页显示文件内容。分页显示的功能与more命令很相像,但more命令只能从前向后浏览文件内容,而less命令则不仅支持more的所有快捷键,而且还能从前向后(PageDown键)和从后向前(PageUp键),还有其它快捷键可自行搜索。
- 常用选项:
head
- 使用格式:head [参数] 文件名
- 功能介绍:显示指定文件开头的内容,默认为前10行。
- 常用选项:
tail
- 使用格式:tail [参数] 文件名
- 功能介绍:显示指定文件末尾内容,默认显示后10行;
- 常用选项:
wc
- 使用格式:wc [参数] 文件名
- 功能介绍:统计文件的字节数、单词数、行数等信息,并将统计结果输出到终端界面。
- 常用选项:
cal
- 使用格式:cal [ -mjy ] [日份] [ 月份 ] [ 年份 ]
- 功能介绍:显示系统月历与日期信息。简单好用,无需过多介绍。
- 常用选项:
date
- 使用格式:
- 功能介绍:用来显示或设定系统的日期与时间
- 常用选项:
- 常见参数说明:<+/-时间日期格式>:指定显示时使用的日期时间格式
如下只列出部分参数,具体可以自行查询man手册
- 用法示例:
find
- 使用格式:find [路径] [参数] 查找关键字
- 功能介绍:在指定目录下查找文件,可以使用不同的选项来过滤和限制查找的结果。
- 参数说明:
which
- 使用格式:which [参数] 文件名
- 功能介绍:用于查找命令文件,能够快速搜索二进制程序所对应的位置。如果我们仅仅是想找到命令所在的路径,那么这个which命令就太合适了。
- 常用选项:
locate
- 使用格式:locate [参数] 文件名
- 功能介绍:用于快速查找文件或目录。Linux可能会显示没有locate命令,此时就需要手动安装mlocate包,然后需要更新一下数据库才(sudo updatedb)可以正常使用。
- 常用选项:
grep
- 使用格式:grep [选项] 关键字 文件 ...
- 功能介绍:用于在文件中查找关键字,并将结果输出。人们通常会将grep命令与正则表达式搭配使用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。
- 常用选项:
chmod
- 使用格式:chmod [选项] 权限格式 文件 ...
- 功能介绍:用于改变文件的权限。默认只有文件的所有者和root可以设置,普通用户只能管理自己文件的权限属性。设置权限时既可以使用数字法,也可以使用字母表达式。
- 常用选项:
chown
- 使用格式:chown [参数] 拥有者[:所属组] 目标文件...
- 功能介绍:改变文件或目录的用户或用户组信息,所属组是选择性添加的,不加就是只更改文件的拥有者。一般情况下需要用sudo提权才能正常使用。
- 常用选项:
chgrp
- 使用格式:chgrp [参数] 目标组 文件名
- 功能介绍:更改文件所属用户组。
- 常用选项:
sudo
- 使用格式:sudo [参数] 命令
- 功能介绍:用于授权普通用户以管理员的身份(root用户)执行命令。不过普通用户如果想要使用sudo,还需要使root将此用户添加到“信任列表”中。具体做法是,在/etc/sudoers文件中有类似内容的地方,按照如下格式添加 user ALL=(ALL) ALL,如果担心把sudoers文件搞坏可以提前备份一下。
- 常用选项: 略
su
- 使用格式:su [参数] 目标用户
- 功能介绍:用于切换用户身份。管理员切换至任意用户身份而无须密码验证。而普通用户切换身份需要目标用户的密码验证。另外,添加单个减号(-)参数为完全的身份变更,会切换到新用户的完整环境。
- 用法示例:
uname
- 使用格式:uname [参数]
- 功能介绍:用于查看系统主机名、内核及硬件架构等信息。如果不加任何参数,默认仅显示系统内核名称,相当于-s参数。
- 常用选项:
id
- 使用格式:id [参数] 用户名
- 功能介绍:显示用户与用户组的ID
- 常用选项:
man
Linux有很多指令和指令参数,我们不可能记住所有的指令和参数。而网上搜索的资料有些不够准确,或缺乏系统性。而man命令作为权威的官方工具则很好地解决了上述两点弊病。man可以查询绝大多数指令的帮助信息,包括man自己。
- 使用格式:man [参数] 对象
- 常用选项:
--help选项
shell下的几乎绝大多数指令都支持一个--help参数,这通常用于获取关于命令的帮助信息和用法。当在命令后面添加--help
参数时,命令会显示关于该命令的简要说明、可用选项等。
不过需要注意的是,--help内的帮助信息和man手册中的是不同的,不要混淆了。
例如:
ls --help
解压和压缩
Linux下的压缩和归档格式有很多,我们这里只讲两种比较常见的tar和zip,其它的可以自行查询。
tar命令
- 用法格式:tar 参数 压缩包名 [文件或目录名]
- 功能介绍:tar命令的功能是用于压缩和解压缩文件,能够制作出Linux系统中常见的 .tar、 .tar.gz、 .tar.bz2等格式的压缩包文件。对于RHEL7、CentOS7版本以后的系统,解压缩时可以不添加格式参数(如z或j),系统也能自动进行分析并解压。
- 常用选项:
需要注意的是,tar命令的-f参数之后要立即接上文件名。因此,如果要把几个参数合在一起写的话,-f一定要放在最后。
- 用法示例:
zip/unzip命令
zip命令用于压缩文件,unzip命令用于解压文件。
通过zip命令可以将文件打包成.zip格式的压缩包,里面会包含文件的名称、路径、创建时间、上次修改时间等等信息,与tar命令相似。
unzip命令用于解压缩zip格式文件,虽然Linux系统中更多地使用tar命令进行对压缩包的管理操作,但有时也会收到Windows系统常用的.zip和.rar格式的压缩包文件,unzip命令便派上了用场。直接使用unzip命令解压缩文件后,压缩包内原有的文件会被提取并输出保存到当前工作目录下。
指令别名
在Linux中可以通过alias命令给指令取别名。用法格式如下:
alias [name [=newname] ]
用法示例:
注意事项:
- 用户必须使用单引号将原来的命令(被取别名的命令)引起来,防止特殊字符导致错误。
- alias命令的作用只局限于该次登入的操作,若要每次登入都能够使用这些命令别名,需要将相应的alias命令存放到家目录的 .bashrc 中。(bash在每次启动时都会加载 .bashrc 文件的内容,每个用户的home目录都有这个文件,它用来存储并加载终端配置和环境变量。)
重定向和管道
这里只是简单的了解一下重定向和管道,并不是很详细的讲解。
重定向
首先要知道,操作系统在启动时通常会默认打开标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。当我们使用echo、cat等有输出指令时,默认是将内容打印到标准输出流的,也就是我们的终端屏幕。而如果我们想把内容打印到一个我们指定的文件中,就需要将内容重定向到指定文件中,这里用到的就是输出重定向。同理,输入重定向就是,将原来通过标准输入流获取信息的方式,改为从指定文件获取内容。如下是关于输入重定向和输出重定向的详细介绍。
由上面的内容我们得知,重定向可分为:
输出重定向
相较于输入重定向,我们使用输出重定向的频率更高。并且,和输入重定向不同的是,输出重定向还可以细分为标准输出重定向和错误输出重定向两种,其中我们大多数情况下都是使用的标准输出重定向。标准输出重定向和错误输出重定向又分别都包含普通重定向和追加重定向(普通重定向是将目标文件内容清空再输出,追加重定向是直接在文件末尾追加写入)。现将输出重定向的使用格式整理如下。其中 > 的是普通重定向,>> 的是追加重定向。
用法示例:
echo "hello Linux" > hello.txt
cat man ls > ls_use.txt
输入重定向
输入重定向不像输入重定向那样常用,而且使用格式也较少,详见下表:
用法示例:
#原理解释:先将cat的输入文件重定向为fun1(这么做虽然鸡肋,但只是起到便于理解的作用)
#然后再将输出结果重定向到fun2文件中。
cat < fun1 > fun2 #fun1的内容是:hello
cat fun2
#输出结果:hello
管道
我们这里说的管道是指的管道符"|"。管道是Linux中很重要的一种通信方式,是将一个指令(程序)的输出直接作为另一个指令的输入。管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理。
例如显示指定文件经过排序、去重以后包含"better"的行的一系列操作可以写做如下形式
# 查看文本 内容排序 内容去重 信息过滤
cat hello.sh | sort | uniq | grep 'better' target.txt
注意事项
- 指令和选项之间要有空格
- 指令的选项可以叠加来写,例如:ls -al
- 指令,本质其实就是可执行程序(C、C++、其他语言)写的
- *表示全,例如*.txt表示所有以.txt结尾的文件(正则表达式的语法)
- 指令的选项参数可以加"-",也可以不加,暂且认为没有什么区别
- 关于“自定义的可执行程序需要指定路径,而系统的指令却不需要”的讨论: