什么是 Shell
在我们学习 Linux 指令之前,先来说一下什么是 Shell?Shell 把我们输入的指令,传递给操作系统去执行,所以 Shell 是一个命令行的用户界面。
早期程序员没有图形界面用,就用 Shell。而且图形界面制作成本较高,不能实现所有功能,因此今天的程序员依然在用 Shell。
你平时还经常会看到一个词叫作bash(Bourne Again Shell),它是用 Shell 组成的程序。这里的 Bourne 是一个人名,Steve Bourne 是 bash 的发明者。
我们今天学习的所有指令,不是写死在操作系统中的,而是一个个程序。比如rm指令,你可以用which指令查看它所在的目录。如下图所示,你会发现rm指令在/usr/bin/rm目录中。
我输入了which rm,然后获得了/usr/bin/rm的结果,最终执行这条指令的是操作系统,连接我和操作系统的程序就是 Shell。
Linux 对文件目录操作的指令就工作在 Shell 上,接下来我们讲讲文件目录操作指令。
Linux 对文件目录的抽象
Linux 对文件进行了一个树状的抽象。/代表根目录,每一节目录也用/分开,所以在上图所展示的/usr/bin/rm中,第一级目录是/根目录,第二级目录是usr目录,第三级是bin目录。最后的rm是一个文件。
路径(path)
像/usr/bin/rm称为可执行文件rm的路径。路径就是一个文件在文件系统中的地址。如果文件系统是树形结构,那么通常一个文件只有一个地址(路径)。
目标文件的绝对路径(Absolute path),也叫作完全路径(full path),是从/开始,接下来每一层都是一级子目录,直到定位到目标文件为止。
如上图所示的例子中,/usr/bin/rm就是一个绝对路径。
工作目录
为了方便你工作,Shell 还抽象出了工作目录。当用户打开 Shell 的时候,Shell 就会给用户安排一个工作目录。因此也就产生了相对路径。
相对路径(Relative path)是以工作目录为基点的路径。比如:
-
当用户在/usr目录下的时候,rm文件的相对路径就是bin/rm;
-
如果用户在/usr/bin目录下的时候,rm文件的路径就是./rm或者rm,这里用.代表当前目录;
-
如果用户在/usr/bin/somedir下,那么rm的相对路径就是…/rm,这里用…代表上一级目录。
我们使用cd(change directory)指令切换工作目录,既可以用绝对路径,也可以用相对路径。 这里我要强调几个注意事项:
-
输入cd,不带任何参数会切换到用户的家目录,Linux 中通常是/home/{用户名}。以我自己为例,我的家目录是/home/ramroll;
-
输入cd .什么都不会发生,因为.代表当前目录;
-
输入cd…会回退一级目录,因为…代表上级目录。
利用上面这 3 种能力,你就可以方便的构造相对路径了。
几种常见的文件类型
另一方面,Linux 下的目录也是一种文件;但是文件也不只有目录和可执行文件两种。常见的文件类型有以下 7 种:
1、普通文件;
2、目录文件;
3、可执行文件;
4、管道文件;
5、Socket 文件;
6、软链接文件;
7、硬链接文件。
你如果使用ls -F就可以看到当前目录下的文件和它的类型。比如下面这种图:
1、* 结尾的是可执行文件;
2、= 结尾的是 Socket 文件;
3、@ 结尾的是软链接;
4、| 结尾的管道文件;
5、没有符号结尾的是普通文件;
6、/ 结尾的是目录。
设备文件
Socket 是网络插座,是客户端和服务器之间同步数据的接口。其实,Linux 不只把 Socket 抽象成了文件,设备基本也都被抽象成了文件。因为设备需要不断和操作系统交换数据。而交换方式只有两种——读和写。所以设备是可以抽象成文件的,因为文件也支持这两种操作。
Linux 把所有的设备都抽象成了文件,比如说打印机、USB、显卡等。这让整体的系统设计变得高度统一。
至此,我们了解了 Linux 对文件目录的抽象,接下来我们看看具体的增删改查指令。
文件的增删改查
增加
创建一个普通文件的方法有很多,最常见的有touch指令。比如下面我们创建了一个 a.txt 文件。
touch指令本来是用来更改文件的时间戳的,但是如果文件不存在touch也会帮助创建一个空文件。