三、bash shell 基础命令
-
GNU bash shell 是一个程序, 提供了对 Linux 系统的交互式访问。它是作为普通程序运行的,通常是在用户登录终端时启动。系统启动的 shell 程序取决于用户账户的配置。
-
/etc/passwd 文件包含了所有系统用户账户以及每个用户的基本配置信息。
-
man 命令可以访问 Linux 系统的手册页。在 man 命令之后跟上想要查看的命令名,就可以显示相应的手册页。
-
当你使用 man 命令查看命令手册页的时候,其中的信息是由分页程序(pager )来显示的。 分页程序是一种实用工具,能够逐页(或逐行)显示文本。你可以单击空格键进行翻页, 或是使用 Enter 键逐行查看。也可以使用箭头键向前和向后滚动手册页的内容(假设你使用的终端仿真软件包支持箭头键功能)。如果阅读完毕,可以按 q 键退出手册页。
-
输入man man 可以查看与手册页相关的信息。
-
如果想使用多个命令选项,那么通常可以将其合并在一起。例如,要使用选项-a 和 -b,可以写作-ab。
-
如果不记得命令名了,可以使用关键字来搜索手册页。语法为 man -k keyword。例如,要查找与终端相关的命令,可以输入 man -k terminal。
-
手册页中还有不同的节。每节都分配了一个数字,从 1 开始,一直到 9。Linux 手册页的节如下表:
节号 | 所涵盖的内容 |
---|---|
1 | 可执行程序或 shell 命令 |
2 | 系统调用 |
3 | 库调用 |
4 | 特殊文件 |
5 | 文件格式与约定 |
6 | 游戏 |
7 | 概览、约定及杂项 |
8 | 超级用户和系统管理员命令 |
9 | 内核例程(routine) |
-
man 命令通常显示的是指定命令编号最低的节。(一个命令偶尔会在多个节中都有对应的手册页。)
-
大多数命令接受-h 或–help 选项。例如,可以输入 hostname --help 来查看简要的帮助信息。
-
Linux 文件系统
- Linux 会将文件存储在名为虚拟目录(virtual directory)的单个目录结构中。虚拟目录会将计算机中所有存储设备的文件路径都纳入单个目录结构。
- Linux 虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会 按照其访问路径一一列出,
- 路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘中的信息。
- Linux 虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备。我们称在 Linux 系统 中安装的第一块硬盘为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。
- Linux 会使用根驱动器上一些特别的目录作为挂载点(mount point)。挂载点是虚拟目录中分配给额外存储设备的目录。 Linux 会让文件和目录出现在这些挂载点目录中,即便它们位于其他物理驱动器中。
- 系统文件通常存储在根驱动器中,而用户文件则存储在其他驱动器中。
- 注意,Linux 使用正斜线(/)而不是反斜线(\)来分隔文件路径中的目录。反斜线在 Linux 中用作转义字符,如果误用在文件路径中会造成各种各样的问题。
- 常见的 Linux 目录名
目录 | 用途 |
---|---|
/ | 虚拟目录的根目录,通常不会在这里放置文件 |
/bin | 二进制文件目录,存放了很多用户级的 GNU 实用工具 |
/boot | 引导目录,存放引导文件 |
/dev | 设备目录, Linux 在其中创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录, Linux 在其中创建用户目录(可选) |
/lib | 库目录, 存放系统和应用程序的库文件 |
/libname | 库目录, 存放替代格式的系统和应用程序库文件(可选) |
/media | 媒介目录,可移动存储设备的常用挂载点 |
/mnt | 挂载目录,用于临时挂载文件系统的常用挂载点 |
/opt | 可选目录,存放第三方软件包 |
/proc | 进程目录,存放现有内核、系统以及进程的相关信息 |
/root | root 用户的主目录(可选) |
/run | 运行目录,存放系统的运行时数据 |
/sbin | 系统二进制文件目录,存放了很多管理级的 GNU 实用工具 |
/srv | 服务目录,存放本地服务的相关文件 |
/sys | 系统目录,存放设备、驱动程序以及部分内核特性信息 |
/tmp | 临时目录,可以在其中创建和删除临时工作文件 |
/usr | 用户目录,一个次目录层级结构(secondary directory hierarchy) |
/var | 可变目录,存放经常变化的文件,比如日志文件 |
- /usr 目录值得特别关注,因为该目录是一个次目录层级结构,包含可共享的只读文件。你经常会在其中发现用户命令、源代码文件、游戏,等等。
- 主目录是分配给用户账户的一个特有目录。在创建用户账户时,系统通常会为其分配主目录。
- 在 Linux 文件系统中,可以使用目录切换(cd)命令来将 shell 会话切换到另一个目录。
- 如果没有为 cd 命令指定目标路径,则会切换到你的用户主目录。
- 绝对路径总是以正斜线(/)作为起始,以指明虚拟文件系统的根目录。
- pwd 命令可以显示出 shell 会话的当前目录,该目录被称为当前工作目录。
- 在切换到新的当前工作目录时使用 pwd 命令,这是一个不错的习惯。因为很多shell 命令是在当前工作目录中进行操作的,所以在发出命令之前,你应该总是确保自己处在正确的目录之中。
- 可以使用绝对路径切换到 Linux 虚拟目录结构中的任何一级,也可以从 Linux 虚拟目录中的任何一级快速跳回到主目录(cd命令即可(不指定目标路径))。
- 可以在任何包含子目录的目录中使用带有相对路径的 cd 命令, 也可以使用特殊字符来表示相对目录位置。
- 有两个特殊字符可用于相对路径中:
- 单点号( . ),表示当前目录;
- 双点号(…),表示当前目录的父目录。
- ls 命令最基本的形式会显示当前目录下的文件和目录。
- ls 命令输出的列表是按字母排序的(按列而不是按行排序)。
- 可以使用 ls 命令的-F 选项来轻松地区分文件和目录。
- -F 选项会在目录名之后添加正斜线(/),以方便用户在输出中分辨。它还会在可执行文件之后添加星号(*), 以帮助用户找出可在系统中运行的文件。
- Linux 经常使用隐藏文件来保存配置信息。在 Linux 中,隐藏文件通常是文件名以点号( . )开始的文件。
- 要想显示隐藏文件,可以使用-a 选项。
- -R 是 ls 命令的另一个选项,称作递归选项,可以列出当前目录所包含的子目录中的文件。
- 选项并不是非得分开输入,像 ls –F –R。 可以将其合并: ls –FR。
- -l 选项会产生长列表格式的输出,提供目录中各个文件的详细信息。
- ls -l 输出的第一行显示了为该目录中的文件所分配的总块数。此后的每一行都包含了关于 文件(或目录)的下列信息。
- 文件类型,比如目录(d)、文件(-)、链接文件(l)、字符设备(c)或块设备(b)
- 文件的权限
- 文件的硬链接数
- 文件属主
- 文件属组
- 文件大小(以字节为单位)
- 文件的上次修改时间
- 文件名或目录名
- 如果想查看单个文件的长列表,那么只需在 ls -l 命令之后跟上该文件名即可。但如果 想查看目录的相关信息,而非目录所包含的内容,则除了-l 选项之外,还得添加-d 选项,即 ls -ld Directory-Name。
- 过滤输出列表
- ls 命令还支持在命令行中定义过滤器。ls 会使用过滤器来决定应该在输出中显示哪些文件或目录。
- 过滤器就是一个字符串,可用作简单的文本匹配。你可以将其作为命令行参数, 放置在选项之后使用
- ls 命令也能识别标准通配符(wildcard),并在过滤器中用其来进行模式匹配:
- 问号(?)代表任意单个字符;
- 星号(*)代表零个或多个字符。
- 在过滤器中使用星号和问号被称作通配符匹配(globbing),是指使用通配符进行模式匹配 的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcard)。除了星号和问号, 还有 更多的元字符通配符可做文件匹配之用。
// 例如方括号:方括号代表单个字符位置并给出了该位置上的多个可能的选择。 $ ls -l my_scr[ay]pt // 也可以指定字符范围,比如字母范围 [a–i]: $ ls f[a-i]ll // 还可以使用惊叹号(!)将不需要的内容排除在外: $ ls -l f[!a]ll
- globbing 和 wildcard 的区别: globbing 是对 wildcard 进行扩展的过程。
- 可以使用 touch 命令轻松创建空文件。
- touch 命令会创建好指定的文件并将你的用户名作为该文件的属主。
- 注意,新文件的大小为 0,因为 touch 命令只是创建了一个空文件。
- touch 命令还可用来改变文件的修改时间。该操作不会改变文件内容。
- touch 命令是一个创建空文件和变更已有文件访问时间或修改时间的实用工具。
- 复制文件
- cp 命令最基本的用法需要两个参数,即源对象和目标对象: cp source destination。
- 当参数 source 和 destination 都是文件名时, cp 命令会将源文件复制成一个新的目标文件,并以 destination 命名。新文件在形式上就像全新的文件一样, 有新的修改时间。
- 注意:如果目标文件已经存在, 则 cp 命令 可能并不会提醒你这一点。最好加上-i 选项,强制 shell 询问是否需要覆盖已有文件。
- 也可以将文件复制到现有目录中。
$ cp -i test_one /home/christine/Documents/
- 在目标目录名尾部加上了一个正斜线(/)。这表明 Documents 是一个目录而非文件。这有助于表明目的,而且在复制单个文件时非常重要。 如果没有使用正斜线, 同时子目录/home/christine/Documents 又不存在, 就会产生麻烦。在这种情况下, 试图将一个文件复制到 Documents 子目录反而会创建名为 Documents 的文件,更是连错误消息 都不会有。因此,记得在目标目录名尾部加上正斜线。
- 可以用 cp 命令的-R 选项在单个命令中递归地复制整个目录的内容。
- 在执行 cp –R 命令之前, 目录 NewDocuments 可以并不存在。它可以随着 cp –R 命令被创建,而整个 Documents 目录中的内容都被复制到其中。
cp -R Documents/ NewDocuments/
- 注意,新的 NewDocuments 目录中所有的文件都会有对应的新日期。 NewDocuments 目录现在已经成了 Documents 目录的完整副本。
- 在执行 cp –R 命令之前, 目录 NewDocuments 可以并不存在。它可以随着 cp –R 命令被创建,而整个 Documents 目录中的内容都被复制到其中。
- 也可以在 cp 命令中使用通配符。
-
制表键补全允许你在输入文件名 或目录名的时候,按一下制表键, 让 shell 帮你将内容补充完整。
-
链接文件
- 如果需要在系统中维护同一文件的两个或多个副本,可以使用单个物理副本加多个虚拟副本(链接)的方法代替创建多个物理副本。链接是目录中指向文件真实位置的占位符。在 Linux 中有两种类型的文件链接。
- 符号链接
- 硬链接
- 符号链接(也称为软链接)是一个实实在在的文件, 该文件指向存放在虚拟目录结构中某个 地方的另一个文件。这两个以符号方式链接在一起的文件彼此的内容并不相同。
- 要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用 ln 命令以及-s 选项来创建符号链接:
$ ln -s test_file slink_test_file $ ls -l *test_file lrwxrwxrwx. 1 christine christine 9 Mar 4 09:46 slink_test_file -> test_file -rw-rw-r--. 1 christine christine 74 Feb 29 15:50 test_file
- 注意符号链接文件与数据文件的文件大小。符号链接文件 slink_test_file 只有 9 个字节, 而 test_file有 74 个字节。这是因为 slink_test_file 仅仅只是指向 test_file 而已。它们的内容并不相同,是两个完全不同的文件。
- 另一种证明链接文件是一个独立文件的方法是查看 inode 编号。文件或目录的 inode 编号是内核分配给文件系统中的每一个对象的唯一标识。要查看文件或目录的 inode 编号,可以使用 ls 命令的-i 选项:
$ ls -i *test_file 1415020 slink_test_file 1415523 test_file
- 可以看出,test_file 文件的 inode 编号是 1415523,而 slink_test_file 的 inode 编号则是 1415020。 所以说两者是不同的文件。
- 硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者就根本而言是同一个文件。要想创建硬链接,原始文件也必须事先存在, 只不过这次使用 ln 命令时 不需要再加入额外的选项了:
$ ls -l *test_one -rw-rw-r--. 1 christine christine 0 Feb 29 17:26 test_one $ ln test_one hlink_test_one $ ls -li *test_one 1415016 -rw-rw-r--. 2 christine christine 0 Feb 29 17:26 hlink_test_one 1415016 -rw-rw-r--. 2 christine christine 0 Feb 29 17:26 test_one
- 创建好硬链接文件之后,我们使用 ls -li 命令显示了*test_one 的 inode 编号以及长列表。注意,以硬链接相连的文件共享同一个 inode 编号。这是因为两者其实就是同一个文件。另外,彼此的文件大小也一模一样。
- 注意,只能对处于同一存储设备的文件创建硬链接。要想在位于不同存储设备的文件之间创建链接,只能使用符号链接。(硬链接不能跨文件系统,而符号链接可以跨文件系统。)
- 文件重命名
- 在 Linux 中,重命名文件称为移动(moving)。mv 命令可以将文件和目录移动到另一个位置或是重新命名。
- mv 只影响文件名,inode 编号和时间戳保持不变。
- 也可以使用 mv 来移动文件的位置(该操作没有改变文件的 inode 编号或时间戳,唯一变化的就是文件的位置)。
- 和 cp 命令类似,你也可以在 mv 命令中使用-i 选项。这样在 mv 试图覆盖已有的文件时会发出询问。
- 可以使用 mv 命令在移动文件的同时进行重命名。
- 也可以使用 mv 命令移动整个目录及其内容。
mv OldDocuments NewDocuments
- 删除文件
- bash shell 中用于删除文件的命令是 rm。
$ rm -i fall rm: remove regular empty file 'fall'? y
- -i 选项会询问你是否真的要删除该文件。
- shell 没有回收站或者垃圾箱这样的东西,文件一旦被删除,就再也找不回来了。所以在使用 rm 命令时, 要养成总是加入-i 选项的好习惯。
- 也可以使用通配符元字符删除一组文件。
- rm 命令的另一个特性是, 如果你要删除很多文件,又不想被命令提示干扰,可以用-f 选项来强制删除。
- 创建目录
- 在 Linux 中创建目录很简单,使用 mkdir 命令即可:
$ mkdir New_Dir $ ls -ld New_Dir drwxrwxr-x. 2 christine christine 6 Mar 6 14:40 New_Dir
- 在长列表输出中,目录以 d 开头。这表示 New_Dir 并不是文件,而是一个目录。
- 可以根据需要“批量”地创建目录和子目录。为此,要使用 mkdir 命令的-p 选项:
$ mkdir -p New_Dir/SubDir/UnderDir $ ls -R New_Dir New_Dir: SubDir New_Dir/SubDir: UnderDir New_Dir/SubDir/UnderDir:
- mkdir 命令的 -p 选项可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
- 删除目录
- 删除目录的基本命令是 rmdir。
- 在默认情况下, rmdir 命令只删除空目录(如果目录下有文件,rmdir 命令会拒绝删除该目录)。
- rmdir 并没有-i 选项可以用来询问是否要删除目录。
- 也可以在整个非空目录中使用 rm 命令。 -r 选项使得 rm 命令可以向下进入(descend into) 目录,删除其中的文件,然后再删除目录本身。
- 对于 rm 命令, -r 选项和-R 选项的效果是一样的, 都可以递归地删除目录中的文件。 shell 命令很少会对相同的功能使用大小写不同的选项。
- 一口气删除目录树的最终解决方案是使用 rm -rf 命令。
- 查看文件类型
- 在显示文件内容之前, 应该先了解文件类型。如果你尝试显示二进制文件, 那么屏幕上会出 现各种乱码, 甚至会把你的终端仿真器挂起。
- file 命令是一个方便的小工具,能够探测文件的内部并判断文件类型:
$ file .bashrc .bashrc: ASCII text
- file 命令不仅能够确定文件中包含的是文本信息,还能确定该文本文件的字符编码是 ASCII。
- 可以使用 file 命令作为另一种区分目录的方法:
$ file Documents Documents/: directory
- file 命令甚至能够告诉你它链接到了哪个文件:
$ file slink_test_file slink_test_file: symbolic link to test_file
- 下面的例子展示了 file 命令对于脚本文件的返回结果。尽管这个文件是 ASCII text,但因为是脚本文件,所以可以在系统中执行(运行)
$ file my_script my_script: Bourne-Again shell script, ASCII text executable
- file 命令能够确定该程序编译时所面向的平台以及需要何种类型的库。如果有从未知来源处获得的二进制文件,那么这会是一个非常有用的特性:
$ file /usr/bin/ls /usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0,[...]
- 查看整个文件
- cat 命令:cat 命令是显示文本文件中所有数据的得力工具。
- -n 选项会给所有的行加上行号。
- 如果只想给有文本的行加上行号, 可以用-b 选项。
- cat 命令对大文件来说,文件内容会在屏幕上一闪而过。
- more 命令会显示文本文件的内容,但会在显示每页数据之后暂停下来。
- more 命令是一个分页工具。
- 可以使用空格键向前翻页,或是使用 Enter 键逐行向前查看。结束之后,按 q 键退出。
- more 命令只支持文本文件中基本的移动。如果想要更多的高级特性,可以试试 less 命令。
- less 命令实为 more 命令的升级版本。
- less 命令还可以在完成整个文件的读取之前显示文件的内容。 cat 命令和 more 命令则无法做到这一点。
- 输入 man less 可以查看 less 命令的所有可用选项,也可以使用相同的方法查看 more 命令的各种选项。
- less 命令能够识别上下箭头键以及上下翻页键(假设你的终端配置正确)。
- 查看部分文件
- tail 命令会显示文件最后几行的内容(文件的“尾部”)。在默认情况下,它会显示文件的末尾 10 行。
- 可以向 tail 命令中加入-n 选项来修改所显示的行数。
$ tail -n 2 log_file
- tail 命令有一个非常酷的特性:-f 选项, 该选项允许你在其他进程使用此文件时查看文件的内容。 tail 命令会保持活动状态并持续地显示添加到文件中的内容。这是实时监测系统日志的绝佳方式。
- 可以向 tail 命令中加入-n 选项来修改所显示的行数。
- head 命令会显示文件开头若干行(文件的“头部”)。在默认情况下,它会显示文件前 10 行的文本。
- 与 tail 命令类似, head 命令也支持-n 选项, 以便指定想要显示的内容。这两个命令也允 许简单地在连字符后面直接输入想要显示的行数:
$ head -3 log_file
- 文件的开头部分通常不会改变,因此 head 命令并没有 tail 命令那样的-f 选项。
- head 命令是一种查看文件起始部分内容的便捷方法。
- 与 tail 命令类似, head 命令也支持-n 选项, 以便指定想要显示的内容。这两个命令也允 许简单地在连字符后面直接输入想要显示的行数: