bash shell 命令
一.启动 shell
GNU bash shell 是一个提供对 Linux 系统的交互式访问的程序。它是作为普通程序运行的,通常是在用户登录终端时启动。系统启动的 shell 程序取决于用户账户的配置。
/etc/passwd 文件包含了所有系统用户账户以及每个用户的基本配置信息。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
每个条目包含 7 个数据字段,字段之间用冒号分隔。系统使用字段中的数据来赋予用户账户某些特性。最后一个字段指定了用户使用的 shell 程序,也就是说root在登陆系统后,GNU bash shell会自动启动。但是否会出现 shell 命令行界面(CLI)取决于所使用
的登录方式。
二.使用 shell 提示符
启动终端仿真器包或登录 Linux 虚拟控制台之后会看到 shell CLI 提示符。默认的 bash shell 提示符是美元符号($),这个符号表明 shell 在等待用户输入命令,而root的提示符是#
除了作为 shell 的入口,提示符还能提供额外的辅助信息,如提供用户名和主机名。
三.与 bash 手册交互
大多数 Linux 发行版自带在线手册,可用于查找 shell 命令以及其他 GNU 实用工具的相关信息。man 命令可以访问 Linux 系统的手册页。在 man 命令之后跟上想要查看的命令名,就可以显示相应的手册页。
输入命令 man hostname
bash 手册并不是按部就班的学习指南,而是作为快速参考来使用的。
使用 man 命令查看命令手册页的时候,其中的信息是由 分页程序(pager) 来显示的。分页程序是一种实用工具,能够逐页(或逐行)显示文本,可以单击空格键进行翻页,或是使用 Enter 键逐行查看,也可以使用b键向上翻。
如果阅读完毕,可以按 q 键退出手册页,然后你会重新获得 shell CLI 提示符,表明 shell 正在等待接受下一个命令。
并不是每一个命令的手册页都包含所有段名。另外,有些命令使用的段名并没有在上面的惯用标准中列出。
Synopsis(摘要)部分指导你如何使用这个命令
COMMAND-NAME [OPTION]… [ARGUMENT]…
- COMMAND-NAME 是要运行的命令名。
- [OPTION]是用于修改命令行为的选项。可添加的 OPTION(也称作开关)通常不止一个。中括号([])表示 OPTION 并不是必需的,3 个点号(…)表示可以一次指定多个 OPTION。如果想使用多个命令选项,那么通常可以将其合并在一起。例如,要使用选项-a 和-b,可以写作-ab。
- [ARGUMENT]是传递给命令的参数,以指明命令的操作对象。ARGUMENT也不是必需的,也可以一次指定多个 ARGUMENT。
如果不记得命令名了,可以使用关键字来搜索手册页。语法为 man -k keyword,可以查找与你输入的keyword有关的命令。
除了按照惯例命名的各段,手册页中还有不同的节。每节都分配了一个数字,从 1 开始,一直到 9。
man 命令通常显示的是指定命令编号最低的节。
(1)表示所显示的手册页来自第 1 节。Linux 系统手册页可能包含一些非标准的节编号,可以使用命令查看你的系统上有哪些节。
ls /usr/share/man/
一个命令偶尔会在多个节中都有对应的手册页,默认显示编号最低的节。
如果想查看特定节,可以输入 man section# topicname。
也可以只看各节内容的简介,输入 man 1 intro 来阅读第 1 节。1可以替换
手册页并非唯一的参考资料。还有另一种称作 info 页面的信息。可以输入 info info 来了解 info 页面的相关内容。
内建命令有自己的帮助页面。有关帮助页面的更多信息,可以输入 help help。
另外,大多数命令接受-h 或–help 选项。例如,可以输入 hostname --help 来查看简要的帮助信息。
四.浏览文件系统
当登录系统并获得 shell 命令提示符后,你通常位于自己的主目录中。
1.Linux 文件系统
在 Windows 中,计算机上安装的物理驱动器的分区决定了文件路径。Linux 则采用另一种方式。Linux 会将文件存储在名为虚拟目录(virtual directory) 的单个目录结构中。虚拟目录会将计算机中所有存储设备的文件路径都纳入单个目录结构。Linux 虚拟目录结构只包含一个称为根(root)目录 的基础目录。根目录下的目录和文件会按照其访问路径一一列出。注意到 Linux 使用正斜线(/)而不是反斜线(\)来分隔文件路径中的目录。反斜线在 Linux 中用作转义字符。
路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘中的信息。
Linux 虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备。我们称在 Linux 系统中安装的第一块硬盘为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。Linux 会使用根驱动器上一些特别的目录作为挂载点(mount point)。挂载点是虚拟目录中分配给额外存储设备的目录。Linux 会让文件和目录出现在这些挂载点目录中,即便它们位于其他物理驱动器中。系统文件通常存储在根驱动器中,而用户文件则存储在其他驱动器中。
Linux 文件系统结构演进自 Unix 文件系统。在 Linux 文件系统中,采用通用的目录名表示一些常见的功能。
/usr 目录值得特别关注,因为该目录是一个次目录层级结构,包含可共享的只读文件。你经常会在其中发现用户命令、源代码文件、游戏,等等。在 Unix/Linux 文件系统中,“次目录层级结构”是指 /usr 这类目录本身是一个独立的、完整的功能性层级结构,其内部子目录的组织逻辑与根目录(/)类似,但用途更聚焦于用户级软件资源的管理。
常见的 Linux 目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。很多Linux 发行版遵循了 FHS。当你登录系统并获得 shell CLI 提示符后,shell 会话会从你的主目录开始。主目录是分配给用户账户的一个特有目录。在创建用户账户时,系统通常会为其分配主目录。
2.遍历目录
在 Linux 文件系统中,可以使用目录切换(cd)命令来将 shell 会话切换到另一个目录。
cd destination
cd 命令可以接受单个参数 destination,用以指定你想切换到的目录名。如果没有为 cd命令指定目标路径,则会切换到你的用户主目录。
destination 参数可以用两种方式表示:一种是绝对路径,另一种是相对路径。
(1)绝对路径
用户可以在虚拟目录中采用绝对路径来引用目录名。绝对路径定义了在虚拟目录结构中,该目录从根目录开始的确切位置,相当于目录的全名。
绝对路径总是以正斜线(/)作为起始,以指明虚拟文件系统的根目录。
如/usr/bin
提示符开头有一个波浪号(~)。在切换到另一个目录之后,这个波浪号被 bin 替代了。CLI 提示符正是用它来帮助你跟踪当前所在虚拟目录结构中的位置。波浪号表明 shell 会话当前位于你的主目录中。
如果尚未配置提示符来显示当前 shell 会话的绝对路径,也可以使用 shell 命令来显示所处的位置。pwd 命令可以显示出 shell 会话的当前目录,该目录被称为当前工作目录。
[root@xy bin]# pwd
/usr/bin
[root@xy bin]#
(2)相对路径
相对路径允许你指定一个基于当前位置的目标路径。相对路径不以代表根目录的正斜线(/)开头,而是以目录名(如果你准备切换到当前工作目录下的某个目录的话)或是一个特殊字符开始。
两个特殊字符
单点号(.),表示当前目录
双点号(…),表示当前目录的父目录
五.列出文件和目录
1.显示基本列表
要想知道系统中都有哪些文件,可以使用列表命令(ls)。ls 命令最基本的形式会显示当前目录下的文件和目录。
ls 命令输出的列表是按字母排序的(按列而不是按行排序)。如果你使用的终端仿真器支持色彩显示,那么 ls 命令还可以用不同的颜色来区分不同类型的文件。
如果没有安装彩色终端仿真器,可以使用 ls 命令的-F 选项来轻松地区分文件和目录。
-F 选项会在目录名之后添加正斜线(/),以方便用户在输出中分辨。类似地,它还会在可执行文件之后添加星号(*)。ls显示了当前目录下的文件和子目录,但不是全部。Linux经常使用隐藏文件来保存配置信息。在 Linux 中,隐藏文件通常是文件名以点号(.)开始的文件。这些文件并不会在 ls 命令的默认输出中出现。因此,我们称其为隐藏文件。
要想显示隐藏文件,可以使用-a 选项。
注意有 4 个以.bash 起始的文件。它们是 bash shell 环境所使用的隐藏文件
-R 是 ls 命令的另一个选项,称作递归选项,可以列出当前目录所包含的子目录中的文件。
-R 选项不仅显示了当前目录下的内容,还显示了用户主目录下所有子目录及其内容。
2.显示长列表
在基本的输出列表中,ls 命令并未显示关于每个文件的太多信息。要显示更多信息,另一个常用的选项是-l。-l 选项会产生长列表格式的输出,提供目录中各个文件的详细信息
在长列表格式输出中,每一行会列出一个文件或目录。除了文件名,输出中还包括其他有用信息。输出的第一行显示了为该目录中的文件所分配的总块数。此后的每一行都包含了关于文件(或目录)的信息
- 文件类型,比如目录(d)、文件(-)、链接文件(l)、字符设备(c)或块设备(b)
- 文件的权限
- 文件的硬链接数
- 文件属主
- 文件属组
- 文件大小(以字节为单位)
- 文件的上次修改时间
- 文件名或目录名
如果想查看单个文件的长列表,那么只需在 ls -l 命令之后跟上该文件名即可。但如果
想查看目录的相关信息,而非目录所包含的内容,则除了-l 选项之外,还得添加-d 选
项,即 ls -ld Directory-Name。
3.过滤输出列表
ls 命令还支持在命令行中定义过滤器。先使用touch命令创建一些文件。
过滤器就是一个字符串,可用作简单的文本匹配。你可以将其作为命令行参数,放置在选项之后使用
当指定特定的文件名作为过滤器时,ls 命令只会显示该文件的信息。有时你可能不知道要找的那个文件的确切名称。ls 命令也能识别标准通配符(wildcard),并在过滤器中用其来进行模式匹配
问号(?)代表任意单个字符;
星号(*)代表零个或多个字符。
在过滤器中使用星号和问号被称作通配符匹配(globbing),是指使用通配符进行模式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcard)。除了星号和问号,还有更多的元字符通配符可做文件匹配之用。
例如方括号代表单个字符位置并给出了该位置上的多个可能的选择,可以列出,也可以划定范围。
还可以使用惊叹号(!)将不需要的内容排除在外
六.处理文件
1.创建文件
使用 touch 命令轻松创建空文件
touch 命令会创建好指定的文件并将你的用户名作为该文件的属主。注意,新文件的大小为 0,因为 touch 命令只是创建了一个空文件。touch 命令还可用来改变文件的修改时间,该操作不会改变文件内容。
2.复制文件
cp命令可以将文件和目录从文件系统的一个位置复制到另一个位置。
cp source destination
cp 命令最基本的用法需要两个参数,即源对象和目标对象
当参数 source 和 destination 都是文件名时,cp 命令会将源文件复制成一个新的目标文件,并以 destination 命名,新文件有新的修改时间。
如果目标文件已经存在,则 cp 命令可能会询问你会不会覆盖文件也可能不会,但可以加上-i选项来强制 shell 询问
如果不回答 y,则停止文件复制。也可以将文件复制到目录中
例子在目标目录名尾部加上了一个正斜线(/)。这表明des是一个目录而非文件,会将文件复制到des目录之下。如果不加上,且该目录不存在,就会在不报错的情况下复制为文件。
单点号(.)就很适合用于 cp 命令
如果你的源文件名很长,那么使用单点号要比输入完整的目标对象名轻松多了。
cp 命令可以用-R 选项,它在单个命令中递归地复制整个目录的内容
在执行 cp –R 命令之前,目录newdes并不存在。它是随着 cp –R 命令被创建的,整个newdes目录中的内容都被复制到其中。注意,新的newdes目录中所有的文件都有对应的新日期。
3.使用命令行补全
命令行补全(也称为制表键补全) 允许你在输入文件名或目录名的时候,按一下制表键,让 shell 帮你将内容补充完整。
打出几个前面的字母再点tab,如果这几个字母可以补出唯一的一个文件名,则可以补出文件名;如果不唯一,则可以点击两下tab,会将哪些有这种前置字母的文件或目录都输出出来
4.链接文件
如果需要在系统中维护同一文件的两个或多个副本,可以使用单个物理副本加多个虚拟副本(链接)的方法代替创建多个物理副本。链接是目录中指向文件真实位置的占位符。在 Linux 中有两种类型的文件链接
- 符号链接
- 硬链接
符号链接(也称为软链接) 是一个实实在在的文件,该文件指向存放在虚拟目录结构中某个地方的另一个文件。这两个以符号方式链接在一起的文件彼此的内容并不相同。
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用 ln 命令以及-s 选项来创建符号链接。
注意符号链接文件名 slink_my1 位于 ln 命令的第二个参数的位置。长列表(ls -l)中显示的符号文件名后的->符号表明该文件是链接到文件my1的一个符号链接。
另外,还要注意符号链接文件与数据文件的文件大小。符号链接文件 slink_my1 只有3个字节,而my1有0个字节。这是因为 slink_my1 仅仅只是指向 my1 而已。它们的内容并不相同,是两个完全不同的文件。
另一种证明链接文件是一个独立文件的方法是查看 inode 编号。文件或目录的 inode 编号是内核分配给文件系统中的每一个对象的唯一标识。要查看文件或目录的 inode 编号,可以使用 ls命令的-i 选项
硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者就根本而言是同一个文件。要想创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不需要再加入额外的选项了
以硬链接相连的文件共享同一个 inode 编号。只能对处于同一存储设备的文件创建硬链接。要想在位于不同存储设备的文件之间创建链接,只能使用符号链接。
5.文件重命名
在 Linux 中,重命名文件称为移动(moving)。mv 命令可以将文件和目录移动到另一个位置或是重新命名。
移动文件会将文件名更改,但 inode 编号和时间戳保持不变。这是因为mv 只影响文件名。也可以使用 mv 来移动文件的位置
该操作同样没有改变文件的 inode 编号或时间戳。
可以使用 mv 命令在移动文件的同时进行重命名
文件的时间戳和 inode 编号都没有改变。改变的只有位置和名称。
也可以使用 mv 命令移动整个目录及其内容
6.删除文件
在 Linux 中,删除(deleting)叫作移除(removing)。bash shell 中用于删除文件的命令是 rm。
-i 选项会询问你是否真的要删除该文件。shell 没有回收站或者垃圾箱这样的东西,文件一旦被删除,就再也找不回来了。所以在使用 rm 命令时,要养成总是加入-i 选项的好习惯。
七.管理目录
1.创建目录
在 Linux 中创建目录很简单,使用 mkdir 命令
可以根据需要“批量”地创建目录和子目录。为此,要使用 mkdir 命令的-p 选项
mkdir 命令的-p 选项可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
2.删除目录
删除目录的基本命令是 rmdir
在默认情况下,rmdir 命令只删除空目录。要想删除这个目录,需要先把目录中的文件或目录删掉,然后才能在空目录中使用 rmdir 命令。rmdir 并没有-i 选项可以用来询问是否要删除目录。这也是为什么说 rmdir 只能删除空目录是件好事。
也可以在整个非空目录中使用 rm 命令。-r 选项使得 rm 命令可以向下进入(descend into)目录,删除其中的文件,然后再删除目录本身
对于 rm 命令,-r 选项和-R 选项的效果是一样的,都可以递归地删除目录中的文件。shell 命令很少会对相同的功能使用大小写不同的选项。
一口气删除目录树的最终解决方案是使用 rm -rf 命令。该命令不声不响,能够直接删除指定目录及其所有内容。当然,这肯定是一个非常危险的命令,所以务必谨慎使用。
八.查看文件内容
1.查看文件类型
在显示文件内容之前,应该先了解文件类型。如果你尝试显示二进制文件,那么屏幕上会出现各种乱码,甚至会把你的终端仿真器挂起。
file 命令是一个方便的小工具,能够探测文件的内部并判断文件类型
一个 ASCII text 类型的文件。file 命令不仅能够确定文件中包含的是文本信息,还能确定该文本文件的字符编码是 ASCII。
一个符号链接文件,file 命令甚至能够告诉你它链接到了哪个文件
file 命令能够确定该程序编译时所面向的平台以及需要何种类型的库。如果有从未知来源处获得的二进制文件,那么这会是一个非常有用的特性
2.查看整个文件
如果手头有一个很大的文本文件,你可能会想看看里面到底是什么。Linux 有 3 个不同的命令可以完成这个任务。
(1)cat命令
cat 命令是显示文本文件中所有数据的得力工具
-n 选项会给所有的行加上行号
这个功能在检查脚本时会很方便。如果只想给有文本的行加上行号,可以用-b 选项
(2)more 命令
cat 命令的主要缺点是其开始运行之后你无法控制后续操作。为了解决这个问题,开发人员编写了 more 命令。more 命令会显示文本文件的内容,但会在显示每页数据之后暂停下来。输入命令 more /etc/profile
more 命令是一个分页工具。当你使用 man 命令时,分页工具会显示指定的bash 手册页。和在手册页中浏览方法一样,你可以使用空格键向前翻页,或是使用 Enter 键逐行
向前查看,或者使用z/b键来向前/向后。结束之后,按 q 键退出。more 命令只支持文本文件中基本的移动。如果想要更多的高级特性,可以试试 less 命令。
(3)less 命令
实为 more 命令的升级版本。less 命令提供了多个非常实用的特性,能够实现在文本文件中前后翻动,还有一些高级搜索功能。
less 命令还可以在完成整个文件的读取之前显示文件的内容。cat 命令和 more 命令则无
法做到这一点。less 命令的操作和 more 命令基本一样,一次显示一屏的文件文本。除了支持和 more 命令相同的命令集,它还包括更多的选项。
less 命令能够识别上下箭头键以及上下翻页键。
3.查看部分文件
(1)tail 命令
tail 命令会显示文件最后几行的内容(文件的“尾部”)。在默认情况下,它会显示文件的末尾 10 行。
可以向 tail 命令中加入-n 选项来修改所显示的行数。
tail 命令有一个非常酷的特性:-f 选项,该选项允许你在其他进程使用此文件时查看文件的内容。tail 命令会保持活动状态并持续地显示添加到文件中的内容。这是实时监测系统日志的绝佳方式。
(2)head 命令
head 命令会显示文件开头若干行(文件的“头部”)。在默认情况下,它会显示文件前 10行的文本
与 tail 命令类似,head 命令也支持-n 选项,以便指定想要显示的内容。这两个命令也允许简单地在连字符后面直接输入想要显示的行数
文件的开头部分通常不会改变,因此 head 命令并没有 tail 命令那样的-f 选项。