哪怕我们配不上自己的野心,也不要辜负了现在所受的苦难。
Linux shell 是个交互式工具,使用户可以启动程序、管理文件以及管理Linux系统上的进程。shell的核心是命令行提示符,是shell的交互部分,它允许你输入文本命令,之后解释命令并在内核中执行。
shell包含了一组内置命令,可以用来完成一系列的操作,比如复制文件、移动文件、重命名文件以及显示和终止系统上正在运行的程序。
shell命令也可以写入文件中作为程序来执行,这些文件被称作shell脚本。
1.启动shell
大多数Linux发行版的默认shell都是GNU bash shell,它是作为常规程序运行的,通常是在用户登录终端时启动,登录时系统启动的shell取决于用户账户的配置。
/etc/passwd 文件中包含了所有用户列表以及每个用户的基本配置信息。
2.shell提示符
默认的shell提示符是美元符号$,这个符号表明shell在等待用户输入。
3.Linux文件系统
首先我们先了解一下Linux的文件系统的构建方式,这和Windows有很大区别。
Windows为每个物理磁盘驱动器分配一个盘符,每个驱动器都会有自己的目录结构,以便访问存储在其上的文件。区别于Windows,Linux在路径名中不使用驱动器盘符,Linux将文件存储在单个目录结构中,这个目录我们称之为 虚拟目录。
虚拟目录结构包含一个称为根(root)目录的基础目录,根目录下的目录和文件会按照访问它们的目录路径一一列出,这点和Windows类似。
举个例子,Linux文件路径/home/valie/Document/read.txt,表明read.txt位于Document目录,Document又位于valie目录,valie则在home目录中,但并没有说明home目录存在于哪个物理磁盘中。
Linux的根驱动器一般用来存储系统文件,而用户文件通常存储在另一个驱动器里,上面所举例的home目录就是位于这个驱动启器中,那么在没有给出驱动器盘符的情况下,系统又是如何访问到home目录的呢?
这里就要提到 ‘挂载点 ’的概念,那么什么是挂载点?
Linux会在根驱动器中创建一些特别的目录,这些目录称之为‘挂载点’,但事实上这些目录并不是存储在根驱动器上,而是存储在另一个驱动器上。
- / : 虚拟目录的根目录,通常不会在这里存储文件
- /usr :用户安装软件的目录
- /var :可变目录,用以存放经常变化的文件,比如日志文件
- /bin :二进制目录,存放许多GNU用户级的工具
- /dev :设备目录,Linux在这里创建设备节点
- /home :主目录,Linux在这里创建用户目录
- /etc :系统配置文件目录
- /boot :启动目录,存放启动文件
- /opt :可选目录,通常用于存放可选的软件包
- /lib :库目录,存放系统和应用程序的库文件
- /tmp :临时目录,可以在该目录创建和删除临时工作文件
在启动一个新的shell提示符后,会话通常是从用户的主目录开始。
4.切换目录
cd + 绝对路径
cd .. //切换到当前目录的父目录
5.文件和目录列表
-
ls
显示当前目录下的文件和目录 -
ls -F
添加-F参数用于区分目录和文件,它会在目录名后添加正斜线/,另外会在可执行文件后加星号* -
ls -a
显示当前目录下的全部文件,包括隐藏文件(以点.开头,通常用来保存配置信息) -
ls -R
列出当前目录下的所有文件和目录,包括子目录下的文件和目录 -
ls -l
参数-l会以长列表的格式输出,每一行都列出了单个文件或目录的更多信息。
6.ls命令的两种命令行参数
- 单字母参数:以英文破折号开始
- 全字母参数:以双英文破折号开始
大部分参数都有单字母和双字母两种版本,而有的则只有一种,部分列举如下:
单字母 | 全字母 | 含义 |
---|---|---|
-a | --all | 输出包括以.开头的隐藏文件 |
-F | --classify | 给条目追加文件类型标识符 |
-R | --recursive | 递归地列出子目录内容 |
-i | --inode | 显示每个文件的索引节点 |
-h | --human-readable | 输出文件或目录的大小,以字节为单位 |
-s | --size | 输出每个文件的块大小 |
-l | 按长列表格式输出 | |
--author | 输出每个文件的作者 |
另外,也可以一次使用多个参数。多个双破折线参数必须分开输入,而多个单破折线可以组合成一个字符串,如用-s参数列出文件的块大小,用-a参数列出所有文件,用-i参数列出每个文件的索引点,用-l参数产生一个长列表,组合起来就是:
ls -sail
7.过滤输出列表
ls + 文件名
:当使用文件名作为过滤器时,ls命令只显示这个文件的信息;
有时候我们并不确定文件的确切名称,或者文件的类型,这时候可以使用标准通配符来输出满足要求的文件:
- 问号?代表一个字符
- 星号*代表零个或多个字符
比如我想查找Applet文件,但是并不确定它的文件类型,这时候可以这样使用过滤方法:
ls Applet*
8.创建文件
有时,在写入数据之前我们希望这个文件就已经存在,这时可以用touch命令来创建空文件。
touch + 文件名
,例如:
9.复制文件
- cp命令用于将文件或目录复制到另一个位置,最基本的用法就是cp+源文件名+目标文件名,例如:
从上图可以看出,time.txt是一个全新的文件,有自己的索引节点。
另外,也可以采用绝对路径来复制文件:
- 在cp命令中使用命令行参数,以下是部分参数
参数 | 含义 |
---|---|
-a | 归档文件,并保留原有的属性 |
-b | 创建已存在的目标文件的备份,而非覆盖它 |
-f | 强制覆盖已存在的目标文件,不提示 |
-p | 保留文件属性,如访问时间、修改时间等 |
-r | 递归地复制文件 |
-R | 递归地复制目录 |
从上图可以看出对于已经存在的time1.txt文件,强行复制之后拥有和源文件time.txt一样的修改时间。
10.使用ln命令创建链接文件
有时,我们需要在系统上维护同一份文件的一到多个副本,用上面个的cp命令复制多个副本并同时维护的方式虽然可行,但很费时费力。这时我们可以用创建虚拟副本的方法来完使维护工作变得轻松起来,这个虚拟副本就称为链接。链接是目录中指向文件真实位置的占位符。
Linux下的两种不同类型的文件链接:
- 硬链接,创建方式:
ln + 源文件名 + 目标文件名
- 软连接,即符号链接,创建方式:
ln -s + 源文件名 + 目标文件名
硬链接与软链接的区别在于,硬链接只能在同种存储媒体上的文件之间创建,不能在不同挂载点下的文件间创建,也就是说不在同一个磁盘分区中文件之间不能创建硬链接,而是使用软链接。
从上图可以看出,time1.txt和time.txt文件的索引节点号是相同的,表明实际上它们是同一个文件,并且在我修改了time.txt文件后(time.txt中添加了一行‘This is the first modification.’),time1.txt文件中的内容也同步改变了。
从上图看到,文件time2.txt的索引节点号与time.txt不同,说明time2.txt是一个单独的文件,并且文件变小了,是因为它只需要存储源文件的信息,并不需要存储文件中的数据。
10.重命名/移动文件或目录
在Linux中,文件和目录的重命名和移动使用的是mv命令(moving),例如:
需要注意的是,移动一个有软链接指向的文件会使得它的软链接失效,如下图time1.txt是一个指向time.txt的硬链接,time2.txt是一个指向time.txt的软链接,当time.txt重命名为time3.txt后,time2.txt软链接已不再是一个有效链接,已经无法访问到它所指向的源文件中的内容:
另外mv命令也用于将文件移动到别的目录中,如下:
11.删除文件
删除文件的操作命令是rm,常用参数如下:
参数 | 含义 |
---|---|
-i | interactive,即删除前询问是否确认删除 |
-f | force ,即无视提示符,强制删除 |
-r | recursive,删除目录,在删除这一目录前会事先删除目录中的内容 |
同样需要注意的是,当删除一个带有软链接的文件时,它的软链接会失效,硬链接保持有效。这是因为硬链接文件具有和源文件相同的索引节点号,硬链接会维持这个索引节点号来保留数据,直到你删除了最后一个指向这个索引节点的硬链接。这一点类似于OC中的引用计数。软链接存放的是源文件的路径,当源文件已经不存在时,软链接中所指向的源文件路径也就不可用了,所以软链接失效。
12.创建目录
创建目录不能使用touch命令,而是使用mkdir命令,如:
mkdir dir
13.删除目录
· 删除目录的基本命令是rmdir, 但是rmdir只能删除空目录,当目录下有文件时,这个目录就不能被删除:
要想删除一个非空目录,我们得用到rm命令,rm -r + 目录名称
会递归地删除目录中的文件,最后再删除目录本身:
14.查看文件信息
stat + 文件名
可以查看文件的所有状态信息
file + 文件名
查看文件类型
file命令将文件分为3类:
- 文本文件:包含可打印字符的文件
- 可执行文件:可在系统上运行的文件
- 数据文件:包含不可打印的二进制字符,又不能在系统上运行的文件
15.查看文件内容
- 使用cat命令查看文件所有数据内容,cat命令常用的参数如下:
参数 | 含义 |
---|---|
-n | 给所有行添加行号 |
-b | 只给有文本的行添加行号 |
-s | 将多个空白行压缩成单个空白行 |
-e | 在每行结束处添加美元符$ |
-t | 用^+竖线去替代文中的制表符(ps:简书写作格式bug) |
使用cat命令会打印出文件的全部内容,但是如果文件内容非常多,那么查看文件内容非常不便,这时可以使用more命令。
- 使用more命令查看文件内容 -- 实现分页查看
more命令常用的参数列举:
参数 | 含义 |
---|---|
+n | 从第n行开始显示 |
-n | 设置每屏大小为n行 |
-s | 将多个空白行压缩成单个空白行 |
使用的常用操作符有:
操作命令 | 含义 |
---|---|
Enter | 向下n行,默认为1行,需要设置 |
cmd + F | 向下滚动一屏 |
空格键 | 向下滚动一屏 |
cmd + B | 返回上一屏 |
= | 输出当前行的行号 |
V | 调出vi编辑器 |
Q | 退出more命令 |
- 使用head命令查看文件的开头内容,默认显示10行
- 使用tail命令查看文件的尾部内容,默认显示10行