在 Linux 操作系统中,凡是在字符操作界面中输入能够完成特定操作和任务的字符串都可以称为命令。严格来说,命令通常只代表实现某一类功能的指令或程序的名称。本节将学习 Linux 命令的分类、基本格式及如何获得命令帮助。
Linux 命令的执行必须依赖于 Shell 命令解释器。Shell 实际上是在 Linux 操作系统中运行的一种特殊程序,它位于操作系统内核与用户之间,负责接收用户输入的命令并进行解释, 将需要执行的操作传递给系统内核执行,Shell 在用户和内核之间充当了“翻译官”的角色。当用户登录到 Linux 系统时,会自动加载一个 Shell 程序,以便给用户提供可以输入命令的操作系统。
Bash 是 Linux 操作系统中默认使用的 Shell 程序,文件位于/bin/bash。关于 Shell 程序的更多知识将在后续课程中进行讲解。根据 Linux 命令与 Shell 程序的关系,Linux 命令一般分为以下两种类型。
Linux 操作系统默认会将存放外部命令、程序的目录 如/bin、/usr/bin、/usr/local/bin 等,添加到用户的“搜索路径”中,当使用位于这些目录中的外部命令时,用户不需要指定具体的位置。因此在大多数情况下,不用刻意去分辨内部命令和外部命令,其使用方法是基本类似的。
在使用内部命令或外部命令时,参照一个通用的命令行使用格式,可方便理解 Linux 命令的作用和工作方式。通用的命令行使用格式如下:
命令字 [选项] [参数]
其中,命令字、选项、参数之间用空格分开,多余的空格将被忽略。[ ]括起来的部分表示可以省略,即命令行可以只有命令字,也可以只有命令字、选项,或者只有命令字、参数。 下面分别介绍这三个组成部分的含义和作用。
命令字
命令字即命令名称,是整条命令中最关键的一部分。在 Linux 的字符操作界面中,使用命令字唯一确定一条命令,因此在输入命令时一定要确保输入的命令字正确。并且,在 Linux 的命令环境中,无论是命令名还是文件名,对英文字符的处理是区分大小写的,操作时需要 细心。
选项
选项的作用是调节命令的具体功能,决定这条命令如何执行。同一个命令字配合不同的 选项使用时,可以获得相似但具有细微差别的功能。命令使用的选项有如下一些特性。
不同的命令字能够使用的选项也会不同(选项的个数和内容)。
选项的数量可以是多个,也可以省略。同时使用多个选项时,选项之间使用空格分 隔。若不使用选项,将执行命令字的默认功能。
使用单个字符的选项时,一般在选项前使用“-”符号(半角的减号符)引导,称为短 格式选项,如“-l”。多个单字符选项可以组合在一起使用,如“-al”等同于“-a -l”。
使用多个字符的选项时,一般在选项前使用“–”符号(两个半角的减号符)引导, 称为长格式选项,如“–help”。
有些命令字对于同一功能会同时提供长、短两种格式的选项。长格式的选项意义明确, 容易记忆,而短格式的选项结构简单、输入快捷。两种格式可以混用。
参数
命令参数是命令字的处理对象,通常情况下命令参数可以是文件名、目录(路径)名 或用户名等内容。根据所使用命令字的不同,命令参数的个数可以是零到多个。在输 入一条 Linux 命令时,应根据该命令字具体的格式提供对应的命令参数,以确保命令的正常运行。
注意:在实际使用 Linux 命令行的过程中,“选项”和“参数”的称谓经常混淆,甚至前后顺序也允许颠倒,但一般不会影响命令的执行效果,所以很多时候并不做严格区分。
在按照上述格式输入一条 Linux 命令后,按 Enter 键表示输入结束并提交给系统执行。
在没有按 Enter 键之前,命令行中的字符内容都处于编辑状态,可以进行任意编辑修改。编辑 Linux 命令行时,可以使用以下几个辅助操作,以提高输入效率。
Tab 键:可以将输入的不完整命令字或文件、目录名自动补齐,如输入“ifcon”后按Tab 键,即可自动补齐为“ifconfig”命令字。该功能只能向后补齐,且必须以已输入的部分字符开头,能够唯一定位一个命令字或文件、目录名,否则可按两次 Tab 键,系统将输出可用的名称列表。
Ø 反斜杠“\”:如果输入的一行命令内容太长,终端会自动换行。有时候为了显示美观 及方便查看,也可以插入“\”符号强制换行,在下一行出现的“>”提示符后可以继续输入内容,作为上一行命令的延续。
Ctrl+U 组合键:快速删除当前光标处之前的所有字符内容。
Ctrl+K 组合键:快速删除从当前光标处到行尾的所有字符内容。
Ctrl+L 组合键:快速清空当前屏幕中的显示内容,只在左上角显示命令提示符。
Ctrl+C 组合键:取消当前命令行的编辑,并切换为新的一行命令提示符。
从下面开始,将逐渐接触到更多的命令行应用实例。大家可以结合各个命令的具体用法 来熟悉 Linux 命令行的基本格式及相关快捷操作。
Linux 命令行的通用格式有助于在学习命令的过程中举一反三,了解使用大多数命令的基本方法。Linux 操作系统中能够使用的命令数量繁多,具体选项也各不相同,使用格式也可能存在细微区别。教材中介绍的内容毕竟有限,对于 Linux 命令的更多详细选项及具体使用格式,除了查阅书本、手册和上网查询之外,最简单、快速的方法是使用命令的在线帮助 功能。下面介绍几种常用的使用在线帮助的方法。
help 命令本身是 Linux Shell 中的一个内建指令,其用途是查看各 Shell 内部命令的帮助信息。使用 help 命令时,只需要添加内部命令的名称作为参数即可。例如,执行“help pwd” 命令可以查看 Shell 内部命令 pwd 的帮助信息(pwd 命令用于显示当前用户所在的工作目录),具体操作如下:
[root@localhost ~]# help pwd
pwd: pwd [-LP] //打印当前工作目录的名称
选项:
-L 打印$PWD 变量的值,如果它命名了当前的工作目录
-P 打印当前的物理路径,不带有任何的符号链接
…… //省略部分内容
对于大多数 Linux 外部命令,可以使用一个通用的命令选项“–help”来显示对应命令字的格式及选项等帮助信息。若该命令字没有“–help”选项,一般只会提示简单的命令格式。例如,执行“ls --help”命令可以查看 ls 命令的帮助信息(ls 命令用于显示文件或目录列表信息),具体操作如下:
[root@localhost ~]# ls --help
用法:ls [选项] … [文件] …
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor –sort is specified.
……//省略部分内容
man 手册页(Manual Page)是 Linux 操作系统中最为常用的一种在线帮助形式,绝大部分的外部软件在安装时为执行程序、配置文件提供了详细的帮助手册页。这些手册页中的信息按照特定的格式进行组织,通过统一的手册页浏览程序 man 进行阅读。例如,执行“man file”命令可以查看 file 命令的手册页信息(file 命令用于判断文件的类型),具体操作如下:
[root@localhost ~]# man file
FILE(1) BSD General Commands Manual FILE(1)
NAME
file - 确定文件类型
总览
file [ -bcnsvzL ] [ -f 命名文件 ] [ -m 幻数文件 ] file ...
…… //省略部分内容
在阅读 man 手册页时将以全屏的文本方式显示,并且提供了交互式的操作环境。按↑、↓方向键可以向上、向下滚动一行文本内容;按 Page Up 键和 Page Down 键可以向上、向下翻页显示;按 Q 键或 q 键可以随时退出手册页的阅读环境;按/键后可以对手册内容进行查找,如输入“/-v”可以查找到“-v”选项的帮助信息,若找到的结果有多个,还可以按 n 键或N 键分别向下、向上进行定位选择。
如果需要将 man 手册页的内容保存成文本文件以便在其他系统中查看,可以结合 col 命令去除手册页中的格式控制字符,并将显示结果保存为新的文件。例如,以下操作可以将 ls 命令的帮助手册保存为文本文件 lshelp.txt。
[root@localhost ~]# man ls | col -b > lshelp.txt
在这个例子中,col 是一个命令程序,用于过滤文本中的一些特殊控制字符;另外还使用了“|”和“>”符号,这是 Shell 环境中的两种特殊功能应用,分别称为管道、重定向输出。其含义及作用如下所述。
管道:用竖杠符号“|”表示,用于将前面命令的屏幕输出结果作为后面命令的操作对象(输入)。就好像一根管道一样,从这头塞入内容,从另一头出来。
重定向输出:用大于符号“>”表示,前面的命令成功执行以后,其屏幕输出结果将保存到“>”号后边指定的文件中,而不是直接输出到屏幕,因此称为重定向。
文件和目录管理是 Linux 操作系统运行维护的基础工作,本节将通过丰富的命令实例, 讲解管理 Linux 操作系统中的文件、目录的相关操作。
Linux 中查看目录的常用命令有 pwd、cd、ls 和 du 命令。这些命令都是对文件目录进行操作,但各自实现的功能略有不同。
pwd 命令用于显示用户当前所在的工作目录位置,工作目录是用户操作文件或其他子目录的默认位置起点。使用 pwd 命令可以不添加任何选项或参数。例如,root 用户在/root 目录中执行 pwd 命令时若输出信息为“/root”,则表示当前的工作目录位于/root,具体操作如下:
[root@localhost ~]# pwd
/root
cd 命令用于将用户的工作目录更改到其他位置,通常使用需要切换到的目标位置(文件夹路径)作为参数。若不指定目标位置,默认将切换到当前用户的宿主目录(家目录),宿主目录是 Linux 用户登录系统后默认的工作目录。例如,以下操作将把工作目录更改为/boot/grub,并执行 pwd 命令确认当前所处位置。
[root@localhost ~]# cd /boot/grub
[root@localhost grub]# pwd
/boot/grub
在 Linux 操作系统中表示某个目录(或文件)的位置时,根据其参照的起始目录不同, 可以使用两种不同的形式,分别称为绝对路径和相对路径。
绝对路径:这种方式以根目录“/”作为起点,如“/boot/grub”表示根目录下 boot 子目录中的 grub 目录。若要确切表明 grub 是一个目录(而不是一个文件),可以在最后也加上一个目录分隔符,如表示为“/boot/grub/”。因为 Linux 操作系统中的根目录只有一个,所以不管当前处于哪个目录中,使用绝对路径都可以非常准确地表示一个目录(或文件)所在的位置。但是如果路径较长,输入的时候会比较烦琐。
相对路径:这种方式一般以当前工作目录作为起点,在开头不使用“/”符号,因此使用的时候更加简短、便捷。相对路径主要包括如下几种形式:
[root@localhost grub]# pwd
/boot/grub
[root@localhost grub]# cd ~
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd -
/boot/grub
ls 命令主要用于显示目录中的内容,包括子目录和文件的相关属性信息等。使用的参数可以是目录名,也可以是文件名,允许在同一条命令中同时使用多个参数。
ls 命令可以使用的选项种类非常多,这里只列出几个最常用的选项以供参考。
执行不带任何选项、参数的 ls 命令,可显示当前目录中包含的子目录、文件列表信息(不包括隐藏目录、文件),如以下操作:
[root@localhost grub]# ls
splash.xpm.gz
执行“ls -ld”命令可以只显示当前目录的详细属性,而不显示目录下的内容,如以下操作:
[root@localhost grub]# ls -ld
drwxr-xr-x. 2 root root 27 9 月 16 2019
ls 命令可以同时查看多个文件的信息。例如, 以下操作可以同时查看两个文件“/etc/yum.conf”和“/boot/vmlinuz-3.10.0-514.el7.x86_64”的信息,结合“-lh”选项可以以更易读的长格式显示。
[root@localhost grub]# ls -lh /etc/yum.conf /boot/vmlinuz-3.10.0-514.el7.x86_64
-rwxr-xr-x. 1 root root 5.2M 11 月 23 2016 /boot/vmlinuz-3.10.0-514.el7.x86_64
-rw-r--r--. 1 root root 970 11 月 15 2016 /etc/yum.conf
使用 ls 命令时,还可以结合通配符“?”或“”以提高命令编写效率。其中,问号“?”可以匹配文件名中的一个未知字符,而星号“”可以匹配文件名中的任意多个字符。这两个通配符同样也适用于 Shell 环境中的其他命令。例如,以下操作将以长格式列出/etc/目录下以“ns” 开头、“.conf”结尾的文件信息。
[root@localhost grub]# ls -lh /etc/ns*.conf
-rw-r--r--. 1 root root 1.7K 9 月 16 2019 /etc/nsswitch.conf
注意:对于经常使用的比较长的命令行,可以通过 alias 别名机制进行简化,以提高使用效率。例如,执行“alias myls=‘ls -alh’”命令可以定义一个名为 myls 的命令别名,以后再执行“myls”命令时即等同于执行“ls -alh”命令。
du 命令可用于统计指定目录(或文件)所占用磁盘空间的大小,使用目录或文件的名称作为参数。du 命令常用的几个选项如下。
[root@localhost ~]# du -sh /var/log/
12M /var/log/
如果需要分别统计多个文件所占用的空间大小,可以结合“-ah”选项,当使用目录作为参数时,最后将列出该目录总共占用的空间大小。例如,执行“du -ah /boot”命令将分别统计/boot 目录中所有文件、子目录各自占用的空间大小,具体操作如下:
[root@localhost ~]# du -ah /boot/……//省略部分内容
8.1M /boot/grub2
4.0K /boot/.vmlinuz-3.10.0-514.el7.x86_64.hmac
3.0M /boot/System.map-3.10.0-514.el7.x86_64
136K /boot/config-3.10.0-514.el7.x86_64
272K /boot/symvers-3.10.0-514.el7.x86_64.gz
5.2M /boot/vmlinuz-3.10.0-514.el7.x86_64
9.8M /boot/initrd-plymouth.img
62M /boot/initramfs-0-rescue-6a1f8b226b12469494db9ff4d72c5e53.img
5.2M /boot/vmlinuz-0-rescue-6a1f8b226b12469494db9ff4d72c5e53
30M /boot/initramfs-3.10.0-514.el7.x86_64.img
18M /boot/initramfs-3.10.0-514.el7.x86_64kdump.img
141M /boot
Linux 中,mkdir、touch、ln 命令分别用于创建目录和文件。
mkdir 命令用于创建新的空目录,使用要创建的目录位置作为参数(可以有多个)。例如,执行“mkdir public_html”命令将在当前目录下创建名为 public_html 的子目录,具体操作如下:
[root@localhost ~]# mkdir public_html
[root@localhost ~]# ls -d public_html
public_html
如果需要一次性创建嵌套的多层目录,必须结合“-p”选项,否则只能在已经存在的目录中创建一层子目录。例如,以下操作将创建一个目录/multimedia,并在/multimedia 目录下创建子目录 movie,再在/multimedia/movie 目录下创建子目录 cartoon。
[root@localhost ~]# mkdir -p /multimedia/movie/cartoon
[root@localhost ~]# ls -R /multimedia
/multimedia:
movie
/multimedia/movie:
cartoon
/multimedia/movie/cartoon:
touch 命令本来用于更新文件的时间标记,但在实际使用中经常用于创建新的测试文件。该命令使用文件名作为参数,可以同时创建多个文件。当目标文件已存在时,将更新该文件 的时间标记,否则将创建指定名称的空文件。例如,以下操作将在/multimedia/movie/cartoon 目录中创建两个空文件,文件名分别为 HuaMuLan.rmvb 和 NeZhaNaoHai.mp4。
[root@localhost ~]# cd /multimedia/movie/cartoon
[root@localhost cartoon]# touch HuaMulan.rmvb NeZhaNaoHai.mp4
[root@localhost cartoon]# ls -lh
总用量 0
-rw-r--r-- 1 root root 0 9 月 16 14:00 HuaMulan.rmvb
-rw-r--r-- 1 root root 0 9 月 16 14:00 NeZhaNaoHai.mp4
ln 命令用于为文件或目录建立链接文件(类似于 Windows 系统中的快捷方式),提高用户定位文件或定位目录的效率。链接文件包括软链接和硬链接两种类型,其中软链接又称 为符号链接。无论是访问软链接还是硬链接,与直接访问原始文件的效果基本相同。
软链接与硬链接的区别主要在于,删除原始文件后,软链接将失效,但硬链接仍然可用; 软链接适用于文件或目录,但硬链接只可用于文件,不能为目录建立硬链接;软链接与原始文件可以位于不同的文件系统中,但硬链接必须与原始文件在同一个文件系统(如一个Linux 分区)内。
使用 ln 命令时,默认创建的是硬链接。如果需要创建软链接,必须结合“-s”选项明确指定。ln 命令的基本使用格式如下:
ln [-s] 源文件或目录… 链接文件或目标位置
当目标位置是一个已经存在的目录时,新创建的链接文件将保存到该目录中,并使用与 源文件或目录相同的名称。例如, 以下操作将为文件/bin/bzip2 创建一个软链接文件/bin/wx/bzip2(未指定链接名称时,使用与原始文件相同的文件名)。
[root@localhost ~]# mkdir /bin/wx
[root@localhost ~]# ln -s /bin/bzip2 /bin/wx/
[root@localhost ~]# ls -lh /bin/wx/bzip2
lrwxrwxrwx 1 root root 10 9 月 16 14:05 /bin/wx/bzip2 -> /bin/bzip2
使用 cp、rm、mv 命令可以复制、删除和移动 Linux 目录和文件。
cp 命令用于复制文件或目录,将需要复制的文件或目录(源)重建一份并保存为新的文件或目录(可保存到其他目录中)。cp 命令的基本使用格式如下:
cp [选项]… 源文件或目录… 目标文件或目录
需要复制多个文件或目录时,目标位置必须是目录,且目标目录必须已经存在。cp 命令较常用到的几个选项如下。
[root@localhost ~]# cp /bin/touch ./mytouch
[root@localhost ~]# cp /etc/yum.conf /etc/yum.conf.bak
如果需要复制的数据包括完整的目录,则需要结合“-r”选项才能成功执行,否则目录将被忽略。例如,以下操作将把目录/boot/grub、文件/etc/host.conf 复制到当前目录下的public_html 文件夹中。
[root@localhost ~]# cp -r /boot/grub/ /etc/host.conf public_html/
[root@localhost ~]# ls public_html/
grub host.conf
rm 命令用于删除指定的文件或目录,在 Linux 命令行界面中,删除的文件是难以恢复的,因此使用 rm 命令删除文件时需要格外小心。rm 命令使用要删除的文件或目录名作为参数。常用的几个选项如下(与 cp 命令的对应选项含义基本相似)所述。
[root@localhost ~]# rm -rf public_html/grub/
[root@localhost ~]# ls public_html/
host.conf
如果需要在执行删除操作前进行确认,可以使用“-i”选项(不要和-f 选项同时使用),rm命令将对每个待删除的文件或目录提示用户是否真的删除,需要输入 y(表示删除)或 n(表示不删除)进行确认。例如,以下操作将以提示确认的方式删除 public_html 目录中的host.conf 文件(根据提示信息输入 y 确认删除)。
[root@localhost ~]# rm -i public_html/host.conf
rm:是否删除普通文件 "public_html/host.conf"?y
注意:在学习rm 删除命令时,不要直接删除系统中已有的目录或配置文件,以避免出现意外故障。建议从系统中复制一些目录或文件到新建的文件夹中,然后切换到新建的 文件夹,使用复制后的目录或文件进行删除练习。
mv 命令用于将指定的文件或目录转移位置,如果目标位置与源位置相同,则效果相当于为文件或目录改名。mv 命令的基本使用格式如下:
mv [选项] … 源文件或目录… 目标文件或目录
需要移动多个文件或目录时,目标位置必须是目录,且目标目录必须已经存在。如果在 同一个目录下移动文件或目录,则相当于执行重命名操作。例如,以下操作将把当前目录中 的 mytouch 程序文件改名为 mkfile。
[root@localhost ~]# mv mytouch mkfile
[root@localhost ~]# ls -lh mytouch mkfile
ls: 无法访问 mytouch: 没有那个文件或目录
-rwxr-xr-x 1 root root 62K 9 月 16 14:09 mkfile
如果移动一个文件或目录到一个已经存在的文件夹中,可以只指定目标文件夹位置。例如,以下操作将把 mkfile 文件移动到 public_html 目录(已经存在)中,文件名仍然是 mkfile。
[root@localhost ~]# mv mkfile public_html/
[root@localhost ~]# ls -l public_html/mkfile
-rwxr-xr-x 1 root root 62488 9 月 16 14:09 public_html/mkfile
which 命令用于查找 Linux 命令程序并显示所在的具体位置,其搜索范围主要由用户的环境变量 PATH 决定(可以执行“echo $PATH”命令查看),这个范围也是 Linux 操作系统在执行命令或程序时的默认搜索路径。
which 命令使用要查找的命令或程序名作为参数,默认当找到第一个目标后即不再继续查找,若希望在所有搜索路径中查找,可以添加“-a”选项。例如,执行“which ls”命令后,可以找到名为 ls 的、位于/usr/bin/ls 的命令程序文件,具体操作如下:
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
注意:由于Shell 内置的命令并没有对应的程序文件,因此使用which 查找内部命令时, 将找不到对应的程序。例如,查找内部命令history 的位置时,会提示在搜索路径中没有这个程序文件,具体操作如下:
[root@localhost ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
find 命令是 Linux 操作系统中功能非常强大的查找命令,可以根据目标的名称、类型、大小等不同属性进行精细查找。find 命令在查找时采用递归的方式,其使用形式相当灵活, 也可以相当复杂。这里只介绍最常用的几种用法。find 命令的基本使用格式如下:
find [查找范围] [查找条件表达式]
其中,查找范围对应的是在其中查找文件或子目录的目录位置(可以有多个),而查找条件则决定了 find 命令根据哪些属性、特征进行查找。较常用的几种查找条件类型如下所述。
[root@localhost ~]# find /etc -name "resol*.conf"
/etc/resolv.conf
使用“-type”查找条件可以过滤出指定类型的文件。例如,以下操作将在/boot 目录中查找出所有的文件夹(对应的类型为 d),而忽略其他类型的文件。
[root@localhost ~]# find /boot -type d
/boot
/boot/grub
/boot/grub2
/boot/grub2/themes
/boot/grub2/themes/system
/boot/grub2/i386-pc
/boot/grub2/locale
/boot/grub2/fonts
需要同时使用多个查找条件时,各表达式之间可以使用逻辑运算符“-a”与“-o”分别表示而且(and)、或者(or)。例如,以下两个操作使用了两个查找条件,即“超过 1024kB”和“名称以 vmlinuz 开头”,但分别使用“-a”“-o”组合两个条件,前者表示两个条件必须同时满足, 后者表示只需满足其中任何一个条件即可。
[root@localhost ~]# find /boot -size +1024k -a -name "vmlinuz*"
/boot/vmlinuz-3.10.0-514.el7.x86_64
/boot/vmlinuz-0-rescue-6a1f8b226b12469494db9ff4d72c5e53
[root@localhost ~]# find /boot -size +1024k -o -name "vmlinuz*"
/boot/grub2/fonts/unicode.pf2
/boot/System.map-3.10.0-514.el7.x86_64
/boot/vmlinuz-3.10.0-514.el7.x86_64
/boot/initrd-plymouth.img
/boot/initramfs-0-rescue-6a1f8b226b12469494db9ff4d72c5e53.img
/boot/vmlinuz-0-rescue-6a1f8b226b12469494db9ff4d72c5e53
/boot/initramfs-3.10.0-514.el7.x86_64.img
/boot/initramfs-3.10.0-514.el7.x86_64kdump.img