简单易懂的命令行工具(入门篇)
编写背景
对于绝大多数的IT工作者,命令行几乎是所有人日常工作中使用频率很高的工具之一。但是对于普通用户来说,命令行工具就是隐藏在云海中的星星,遥不可及却又时而显现。命令行在日常操作时通常不会进入我们的视野,但是当我们踏入计算机专业相关的技术时,掌握命令行使用方法就是无法逃脱的宿命。这篇文章我们会以尽量简单易懂的方式来讲述命令行工具的前世今生。
命令行工具是什么,能干什么
看到这里,可能会有同学问一个触及灵魂问题:命令行工具是什么?
先用一句话来概括:命令行工具是一个用来操作系统的,没有图形化界面的工具。
我们先不着急来解释这句话,先来看一下命令行工具是如何出现的。
现如今我们使用的操作系统都是具有图形化界面的。简言之呢,我们的输入输出都是在一个二维的屏幕上进行的。虽然我们已经很习惯这样的交互方式,但是在大概30多年前,那时候的计算机完全不是这样的二维交互,而是一维交互。由于文字书写的顺序一般是水平方向的,因此早年的设计者们便采用了“内容按照一行为单位垂直方向排布”的模式,很像我们平常书写文章的顺序。这种方式就是命令行工具的交互方式。换句话说,命令行工具就是30年前的操作系统界面。而后时光飞速发展,现在的操作系统都具有非常完善并且酷炫的图形化界面。老式的一维操作界面不再是默认操作系统的方式。不过,它并没有完全从操作系统中消失,而是以命令行工具的方式默默地存在(一个可运行的程序)。到这里,聪明的你就会意识到,操作系统界面可以做什么,命令行工具也就可以做什么,而且命令行工具是与操作系统密切绑定的。
为什么要提到“命令行工具是与操作系统密切绑定的”呢,这是因为命令行工具在常见的几个操作系统(Windows、MacOS、Ubuntu等)上都是不怎么一样的。不过,万变不离其宗,它们的核心是相通的,掌握任何一个工具都可以迁移到其他工具的使用。
如何打开命令行工具
上面已经说到,每个系统中都保留有命令行工具,这里就要揭晓它们在哪里了。
对于Windows系统,我们可以通过徽标键WinKey+R
打开“运行”窗口,然后输入cmd
来打开命令行工具。Windows命令行工具外观如下图所示。由于通常命令行工具的背景是黑色的,有时我们会戏称其为“黑窗口”。
对于MacOS系统,我们可以在启动台LaunchPad
中的其他Others
中找到终端Terminal
。这个终端Terminal就是MacOS上的命令行工具。
Ubuntu系统可以通过快捷键Ctrl+Alt+T
快速启动终端Terminal。
命令行工具的交互方式
通过观察Windows、MacOS、Ubuntu的命令行窗口,我们可以发现,打开窗口后,会有一行内容,行尾有一个光标在闪烁。闪烁的光标处,我们可以输入命令来执行各种操作。我们当前所在目录,会在光标前面列出。MacOS、Ubuntu等Unix/Linux系统,当前目录的前方会指出当前使用的用户和用户所属的用户组。关于用户的概念我们之后进行介绍,首先了解几个操作系统的“术语”。
绝对路径、相对路径、目录、文件夹
文件夹这个词相信大多数接触过计算机的人都不会陌生。我们可以放置各种各样的文件在一个文件夹中,并且文件夹中依然可以有一个文件夹。如果我们假设有一个文件夹是最开始的文件夹,其他的文件夹都是在这个文件夹内部创建的,那么所有的文件和文件夹组成的文件系统,就是一棵树的形状。
在计算机系统中,我们通常称文件夹(Folder)为目录(Directory)。文件系统中,最原始的文件夹就被称为根目录(Root Directory)。从根目录出发,我们可以找到一条路径到某一个指定的目录或文件,我们将这条路径经过的目录依次列出,并且使用特定的符号进行分隔,得到的一串字符就是这个目录绝对路径。在Windows系统中,路径分隔符是反斜杠(\),而在Unix/Linux系统中,路径分隔符是斜杠(/)。
了解了绝对路径,相对路径就好理解了。相对路径是目录A相对目录B的路径,换言之,也就是找到一条路径从目录B到目录A。相对路径的表示中有两个符号:一个点(.)用来表示当前目录;两个点(..)表示当前目录的上一级目录。
题外话
也许有小伙伴注意到,Windows系统中,不同分区各自具有一个根目录,比如“C:\
”, “D:\
”。而Unix/Linux系统似乎只有一个根目录“/
”。那么,Unix/Linux系统中如果有多个分区,那些分区在哪里呢。
这个问题的回答要涉及Unix/Linux文件系统的设计原则。简要地说,Unix/Linux文件系统中,一切目录都是特殊的文件,并且规定加载系统的分区的根目录是整体系统的根目录,其他的分区以目录的形式放到一个指定的目录中(通常是/dev
)。举个栗子,如果系统所在的分区是C,另外还有一个分区D。那么系统的根目录就是C盘的根目录,分区D的根目录是/dev/D
.
Unix/Linux系统中,有一个特殊的目录是~
,它代表的是当前用户的家目录。换句话说,不同用户的~
目录是不一样的。
可执行文件
计算机中的文件可以大体分为两类,一类是文本文件,它的特征是可以使用文本编辑器(比如记事本)查看和编辑内容;另一类是二进制文件,它的特征是使用文本编辑器打开了,多数也是无法查看的乱码。大多数编写的程序代码、网页、一些配置文件都是文本文件;而常见的图片、音频、视频文件都是二进制文件。
在二进制文件中,有一类特殊的文件,它可以让计算机完成一些指令,这样的文件称为可执行文件(程序)。在Windows系统上,后缀名为exe的文件通常是可执行文件。我们编写的程序代码,也需要转化成可执行文件才可以被计算机理解。而所有的可执行文件,都可以向系统命令一样在命令行中被执行。(本质上,系统命令就是系统自带的可执行文件)
执行命令
命令行工具中,每一个操作都对应一个命令。系统预设了许多命令来完成基础的操作,例如:dir/ls
列出目录下的文件或文件夹,date
查看、修改系统时间,cd
切换当前目录等等。系统预设的命令列表通常可以通过<strong>help</strong>
命令进行查看。
输入命令之后,需要按下回车键(Enter)进行执行。执行结果会接着输入的命令显示。
命令通常由一个单词(可能是缩写)组成,命令后面可以带上一个参数列表,用于指定操作的细节。参数使用空格(Space)进行分隔,如果参数内部存在空格,那么这个参数需要使用双引号或单引号括起来。
获取命令帮助信息
系统中预设的命令加上各种程序,我们可以执行的命令可以说是数不胜数。除了常用的命令,我们大概率是记不住它们的参数细节。因此我们需要了解如何获取命令的帮助信息。
上网查用法
大多数命令百度一下都可以得到使用方法。
Windows下的help命令
Windows系统中,我们通常使用help <命令名>
的方式查看系统命令的帮助信息。Windows系统是大小写不敏感的,输入大写或小写不会影响结果。dir命令的帮助信息大致是以下这样。
DIR
Display a list of files and subfolders.
Syntax
DIR [pathname(s)] [display_format] [file_attributes] [sorted] [time] [options]
Key
[pathname] The drive, folder, and/or files to display,
this can include wildcards:
* Match any characters
? Match any ONE character
[display_format]
/P Pause after each screen of data.
/W Wide List format, sorted horizontally.
/D Wide List format, sorted by vertical column.
......
- 第2行:命令简介:显示一个文件和文件夹的列表
- 第5行:命令句法结构:DIR命令要放在最前面,第一类参数是pathname路径名称,第二类参数是display_format显示格式,第三类参数是file_attributes(用于显示的)文件属性,第四类参数是sorted排序方式,第五类参数是time(用于显示和排序的)时间,第六类参数是options选项。每一类参数都具有多种可能的取值,有的参数之间是共存的,有的参数之间是互斥的,需要依情况而定。下文(Key部分)对参数进行详细解释。
- 第7-10行:解释pathname参数的使用
- 第12-15行:解释display_format参数的使用:这一类参数可能有3种取值/P(显示一页后暂停)、/W(宽列表格式,水平方向排序)、/D(宽列表格式,垂直方向排序)
句法结构(上述第5行)中可能出现的符号以及对应的含义如下表所示
表示法 | 含义 |
没有被任何括号括起来的内容 | 内容需要以原文形式出现在对应位置 |
<在尖括号中的内容> | 说明此处按照要求必须指定一个值,尖括号中的内容是提示 |
[在方括号中的内容] | 可选项,方括号中的内容是提示 |
{在花括号中的内容} | 一个选项列表,需要从中选择一个 |
竖直分隔符( | ) | 互斥选项列表的分隔符 |
省略号 (…) | 可以重复出现的项目 |
举例:
DIR [pathname(s)]
:DIR需要照抄,[pathname]是可选项
find [/v] "<String>"
:find需要照抄,/v是可选项,”<String>”是必填项
在线命令手册在:Windows 命令 | Microsoft Docs(简体中文参考)
Unix、Linux系统下的man命令
help <命令名>
的方式可以查看系统命令的帮助信息,不过帮助信息通常并不详细。man <命令名>
是用来查看详细的命令使用方法的。一个在线man命令手册的URL:Linux man pages online(英文)。注意:Unix/Linux系统是大小写敏感的。参数大小写不同会对应两个不同的选项。
LS(1) User Commands
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..
- 第3行:命令描述:ls可以列出目录中的内容。
- 第5行:命令句法结构:ls放在开始,后面接OPTION选项,并且选项可以有多个;后面接FILE文件,并且文件可以有多个。
- 第7-8行:命令的详细介绍。这里指出ls命令用于列出关于(多个)文件的信息(Unix/Linux系统中,目录也是一种文件)。默认情况下列出的是当前目录的信息。如果-cftuvSUX或者–sort选项没有被指定,结果默认按照字母升序排列。
- 第12-13行:选项-a/–all:不要忽略以.(点)开头的文件,例如.gitignore。这里的–all是长选项,而-a是对应的短选项,两者在使用的时候具有相同的地位。短选项是用来快速键入常用选项的。有的长选项不具有对应的短选项。
- 第15-16行:选项-A/–almost-all:不列出.(当前目录)和..(父级目录)两个特殊的目录。–almost-all是长选项,-A是对应的短选项。由于系统是大小写敏感的,因此-a和-A不相同。
句法结构(上述第5行)中可能出现的符号以及对应的含义如下表所示
表示法 | 含义 |
没有被任何括号括起来的内容 | 内容需要以原文形式出现在对应位置 |
斜体内容 或 下划线内容 | 说明此处按照要求必须指定一个值 |
[在方括号中的内容] | 可选项,方括号中的内容是提示 |
{在花括号中的内容} | 一个选项列表,需要从中选择一个 |
竖直分隔符( | ) | 互斥选项列表的分隔符 |
省略号 (…) | 可以重复出现的项目 |
举例:
ls [FILE]
:ls需要照抄,[FILE]是可选项
find [-H | -L | -P] path:find需要照抄;[-H, -L, -P]是可选项,内部的3个选项是互斥的们不能同时出现;path是必填项
运行可执行文件
上面我们提到了,可执行文件可以像命令一样被执行。假设D盘的app目录下有一个exec.exe的程序,我们可以通过d:\test\exec.exe的方式执行这个文件。如果当前目录不在d:\test\下,我们需要使用绝对路径或相对路径来引用这个文件,否则会提示“无法找到文件”。
也许有小伙伴注意到,同样都是可执行文件,系统命令不需要指定路径就可以运行而自己的程序需要指定路径才可以运行。系统命令可以在任意目录下执行的奥秘在于一个叫PATH的环境变量。环境变量包含了不少内容,在这里不做展开,有兴趣的同学可以搜索一下。
常用系统命令的例子
列出目录中的内容
- 列出当前目录下的内容(Unix/Linux):
ls
- 列出指定目录下的内容(Unix/Linux):
ls /path/to/directory
- 以列表形式列出目录中文件的详情(Unix/Linux):
ls -l 或 ll
- 列出当前目录下的内容(Windows):
dir
- 列出指定目录下的内容(Windows):
dir /path/to/directory
进入目录
- 进入当前目录下的一个文件夹:
cd directory
- 进入父级目录:
cd ..
- 进入某个绝对路径指定的目录:
cd /path/to/directory
- 进入根目录:
cd /
切换磁盘分区(Windows)
- 进入D盘:
D:
查看当前绝对路径
- Windows:
chdir
- Unix/Linux:
pwd
退出命令行
- 退出命令行:
exit
创建目录
- 创建目录:
mkdir <directory>
删除文件/目录
- 删除文件(Unix/Linux):
rm <file>
- 删除目录(Unix/Linux):
rm -R <directory>
- 删库跑路(Unix/Linux):
<s>sudo rm -Rf /*</s>
- 删除文件(Windows):
del <file>
- 删除目录(Windows):
del <directory>
- 删库跑路(Windows):
<s>del /F /S /Q C:\*</s>