Bash shell 使用入门

Bash shell 使用入门

从最基础的操作开始

大多数 Linux 发行版的默认 shell 都是 GNU bash shell,它能提供对 Linux 系统的交互式访问。

启动 shell

GNU bash shell 是作为普通程序运行的,通常是在用户登陆终端时启动。登陆时系统启动的 shell 依赖于用户的配置。

/etc/passwd 文件包含了所有系统用户账户列表以及每个用户的基本配置信息,例如:

christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash

每个条目有七个字段,字段之间用冒号分隔。系统使用字段中的数据来赋予用户账户某些特定特性。最后一个字段指定了用户使用的 shell 程序,例如这里,当 christine 登陆 Linux 系统后,bash shell 会自动启动。

尽管 bash shell 会在登陆时自动启动,但是,是否会出现 shell 命令行界面(CLI)则依赖于所使用的登陆方式。如果采用虚拟控制台终端登陆,CLI 提示符会自动出现,你可以直接开始输入 shell 命令。但如果是通过图形化桌面环境登陆 Linux 系统,你就需要启动一个图形化终端仿真器 (如 terminal) 来访问 shell CLI 提示符。

shell 提示符及 man 工具

默认 bash shell 提示符是美元符号($),这个符号表明 shell 在等待用户输入。不同 Linux 发行版可能采用不同格式的提示符。

可以把 shell CLI 提示符想象成一名助手,它帮助你使用 Linux 系统,给你有益的提示,告诉你什么时侯 shell 可以接受新的命令。

shell 中有一个大有帮助的 bash 手册工具。熟悉手册使用对各种 Linux 工具大有裨益,尤其是在你要弄清各种命令行参数的时候。使用 man 命令来访问存储在 Linux 系统上的手册页面,例如下面 bash 的 man 手册页 (man bash):

Bash 的 man 手册页

手册页是由分页程序(pager)来显示的,能够分页显示手册。可以通过空格键进行翻页,或使用回车键逐行查看,键入 q 键退出该 pager 程序。

手册页将与命令相关的信息分成了不同的节。每一节常用的名称如下:

描述
Name 显示命令和一段简短的描述
Synopsis 命令的语法
Confi guration 命令配置信息
Description 命令的一般性描述
Options 命令选项描述
Exit Status 命令的退出状态指示
Return Value 命令的返回值
Errors 命令的错误消息
Environment 描述所使用的环境变量
Files 命令用到的文件
Versions 命令的版本信息
Conforming To 命令所遵从的标准
Notes 其他有帮助的资料
Bugs 提供提交 bug 的途径
Example 展示命令的用法
Authors 命令开发人员的信息
Copyright 命令源代码的版权状况
See Also 与该命令类型的其他命令

浏览文件系统

当登录系统并获得 shell 命令提示符后,你通常位于自己的主目录中。Linux 将文件存储在单个目录结构中,这个目录称为虚拟目录(virtual directory)。Linux 虚拟目录结构只包含一个称为根(root)的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出。

Linux 虚拟目录中比较复杂的部分是它如何协调管理各个存储设备。在 Linux PC 上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。Linux 会在根驱动器上创建一些特别的目录——挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,当然,实际上它们是存储在另外一个驱动器中的。

在登录系统并获得一个 shell CLI 提示符后,会话将从主目录开始。主目录是系统创建账户时分配给用户账户的一个特有目录。

遍历目录

在 Linux 文件系统上,可以使用切换目录命令 cd 将 shell 会话切换到另一个目录。cd 命令的格式非常简单:

cd destination

如果没有为 cd 命令指定目标路径,它将切换到用户主目录。 destination 参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。

  1. 绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始。绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。例如,如果要指向 usr 目录所包含的 bin 目录,可以使用如下绝对文件路径:/usr/binpwd 命令可以显示出 shell 会话的当前目录(绝对文件路径)。

  2. 相对文件路径允许用户指定一个基于当前位置的目标文件路径。假如你位于 home 目录中,并希望切换到 Documents 子目录,那你可以使用 cd 命令加上一个相对文件路径:cd Documents。可以在任何包含子目录的目录中使用带有相对文件路径的 cd 命令。有两个特殊字符:单点符(.),表示当前目录;双点符(..),表示当前目录的父目录,所以 cd .. 就会回到上一次目录。

文件和目录列表

要想知道系统中有哪些文件,可以使用 ls 列表命令。ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)。可用带 -F 参数的 ls 命令轻松区分文件和目录(文件夹)。

ls -F 区分文件和目录,以 / 结束的为目录

Linux 经常采用隐藏文件来保存配置信息。在 Linux 上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来。要把隐藏文件和普通文件及目录一起显示出来,就得用到 -a 参数。

-R 参数是 ls 命令的一个非常有用的参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长,很长。

另一个常用的参数是 -l-l 参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息,例如文件大小、权限、修改时间等。

ls -l 输出更多信息

在进行文件管理时,ls 命令的很多参数都能派上用场。如果在 shell 提示符中输入 man ls,就能看到可用来修改 ls 命令输出的参数有好几页。另外,可以将多个参数结合起来使用,例如:ls -aFl

ls 命令还支持在命令行中定义过滤器,决定应该在输出中显示哪些文件或目录。这个过滤器就是一个进行简单文本匹配的字符串。当用户指定特定文件的名称作为过滤器时,ls 命令只会显示该文件的信息。ls 命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:问号(?)代表一个字符;星号(*)代表零个或多个字符。在过滤器中使用星号和问号被称为文件扩展匹配(file globbing)。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。

处理文件

创建文件

可用 touch 命令轻松创建空文件。touch 命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,真的是个空文件。touch 命令还可用来改变文件的修改时间,这个操作并不改变文件的内容。

复制文件

在最基本的用法里,cp 命令需要两个参数——源对象和目标对象:

cp source destination

当 source 和 destination 参数都是文件名时,cp 命令将源文件复制成一个新文件,并且以 destination 命名。新文件就像全新的文件一样,有新的修改时间。如果目标文件已经存在,cp 命令可能并不会提醒这一点。最好是加上 -i 选项,强制 shell 询问是否需要覆盖已有文件。

cp 命令的 -R 参数威力强大,可以用它在一条命令中递归地复制整个目录的内容。

链接文件

如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在 Linux 中有两种不同类型的文件链接:

  • 符号链接。要为一个文件创建符号链接,原始文件必须事先存在。然后使用 ln -s source destination 命令来创建符号链接。新创建的链接文件其内容仅仅包含指向源文件的信息而已(所以这个文件大小很小),和源文件比是两个完全不同的文件,但是使用 cat 命令或其他工具打开链接文件时,显示的内容还是源文件内容。

  • 硬链接。硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次直接使用不带参数的 ln 命令即可。

如果使用 cp 命令复制一个文件,而该文件又已经被链接到了另一个源文件上,那么你得到的将是源文件的一个副本。

重命名文件

在 Linux 中,重命名文件称为移动(moving)。mv 命令可以将文件和目录移动到另一个位置或重新命名。也可以使用 mv 来移动文件的位置。

删除文件

在 Linux 中,删除(deleting)叫作移除(removing)。bash shell 中删除文件的命令是 rmrm 命令的基本格式非常简单:rm -i file-i 命令参数是显示提示信息,让你确认是不是要真的删除该文件。bash shell 中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm 命令时,要养成总是加入 -i 参数的好习惯。如果要删除很多文件且不受提示符的打扰,可以用 -f 参数强制删除 (慎用~)。

处理目录

创建目录

在 Linux 中创建目录很简单,用 mkdir 命令即可:mkdir new_folder

要想同时创建多个目录和子目录,需要加入 -p 参数:mkdir -p New_Dir/Sub_Dir/Under_Dir

删除目录

删除目录的基本命令是 rmdir。删除目录时,很有可能会发生一些不好的事情。shell 会尽可能防止我们捅娄子。默认情况下,rmdir 命令只删除空目录。rmdir 并没有 -i 选项来询问是否要删除目录。

使用 -r 选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。这种方法同样可以向下进入多个子目录,当需要删除大量目录和文件时,这一点尤为有效。

一口气删除目录及其所有内容的终极大法就是使用带有 -r 参数和 -f 参数的 rm 命令。rm -rf 命令既没有警告信息,也没有声音提示。这肯定是一个危险的工具,尤其是在拥有超级用户权限的时候。务必谨慎使用,请再三检查你所要进行的操作是否符合预期。

查看文件内容

Linux 中有几个命令可以查看文件的内容,而无需调用其他文本编辑器。

查看文件类型

file 命令能够探测文件的内部,并决定文件是什么类型的。file 命令不仅能确定文件中包含的文本信息,还能确定该文本文件的字符编码。file 命令甚至能够告诉你它链接到了哪个文件上。

查看整个文件

  1. cat 命令是显示文本文件中所有数据的得力工具。-n 参数会给所有的行加上行号。如果只想给有文本的行加上行号,可以用 -b 参数。最后,如果不想让制表符出现,可以用 -T 参数,-T 参数会用 ^I 字符组合去替换文中的所有制表符。对大型文件来说,使用 cat 会在显示器上一晃而过,最后停在最后一页。

  2. more 命令会显示文本文件的内容,但会在显示每页数据之后停下来。和手册页 (man) 中前后移动一样,你可以通过按空格键或回车键以逐页(逐行)向后翻的方式浏览文本文件。浏览完之后,按 q 键退出。

  3. less 命令的操作和 more 命令基本一样,一次显示一屏的文件文本。除了支持和 more 命令相同的命令集,它还包括更多的选项(所以叫 less 委屈它了)。其中一组特性就是 less 命令能够识别上下键以及上下翻页键。(输入 man less 浏览对应的手册页)

查看文件部分内容

  1. tail 命令会显示文件最后几行的内容。默认情况下,它会显示文件的末尾 10 行。可以向 tail 命令中加入 -n 参数来修改所显示的行数。-f 参数是 tail 命令的一个突出特性,它允许你在其他进程使用该文件时查看文件的内容。tail 命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。

  2. head 命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前 10 行的文本。类似于 tail 命令,它也支持 -n 参数,这样就可以指定想要显示的内容了。

最后,shell 命令千千万,掌握基础最重要,经常使用就会熟练了。

林宏

Frank Lin

Hey, there! This is Frank Lin (@flinhong), one of the 1.4 billion 🇨🇳. This 'inDev. Journal' site holds the exploration of my quirky thoughts and random adventures through life. Hope you enjoy reading and perusing my posts.

YOU MAY ALSO LIKE

Shell 简介

Linux Notes

2017.09.03

Shell 简介

在 Linux 系统上,通常有好几种 Linux shell 可用。不同的 shell 有不同的特性,有些更利于创建脚本,有些则更利于管理进程。Shell 虽然不是 Unix/Linux 系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式来协调各个程序的运行。