在学习编程的过程中,咱们无法避免地要去装备各种各样的环境变量等等,然后翻开终端测验等等。可是有的同学即使是学习了很长一段时间的编程,也仍是对指令行、环境变量等等这些概念一头雾水。但是,这些底子概念事实上是贯穿于咱们整个开发和学习过程中的,因而十分有必要去了解。

假如之前咱们学过其它编程言语例如C言语等等,信任也触摸过指令行这个东西,在咱们的印象中,指令行差不多便是一个“黑框框”。

什么是命令行和GUI?什么是环境变量?

正是由于这个黑框框,看起来是那么的“简陋”,甚至是那么的抽象,导致许多同学会有点“抵触”它,觉得在每天运用视窗的年代,咱们并不需求它,它是原始而杂乱的。

在指令行中,不可避免地咱们要去经过输入指令的方法,来完结一些操作,而不是像平常相同点点鼠标就行了,这导致一些同学更是“敬而远之”。

但事实上,即使是现在图形化越来越好的状况下,指令行仍然是不可或缺的一部分。

假如说你是一个电脑日常运用者,那么即使是不了解指令行也能够很好地运用电脑。但假如你是一个开发者,那么指令行也是必需求触摸的一个方面了。

之前在b站上面刷到这样一个视频:

什么是命令行和GUI?什么是环境变量?

事实上这并非是骇人听闻,作为开发者,一些根底的层面咱们的确需求去了解一下,而不能仅仅关注代码这么写。

当然,这是不是说明咱们要专门去深化学习一下cmd怎么用呢?那倒也不必,但至少得有所了解和会底子运用,以及一些底子概念等等,不然在后续开发也是会踩坑的。

事实上,咱们简直在初学任何一门言语例如Java,C言语,Python等等,在初学时编写出来的程序都是指令行程序

比方说关于学习Java的同学,在最开端装备JDK环境变量的时分,一般会测验编译一个程序,便是经过指令行操作,而且其间System.out.println办法打印音讯,也是输出到指令行窗口。

当然了,大多数编程言语也供给了编写图形化界面的API可供咱们编写出带有窗口的图形化界面应用程序,例如Java的swing包等等。不过我觉得在开端学习一个编程言语的时分,是彻底没有必要去学习图形化编程的。而且Java也不太适合做图形化程序,假如咱们对编写图形用户界面程序感兴趣的话,主张去学习一下C#言语,C#言语编写一个图形用户界面程序比Java便利太多了。

1,知道指令行和图形化界面

(1) 指令行(CLI):运用杂乱可是功用强大

事实上最先开端的电脑操作体系都是没有现在的图形化操作界面的,几十年前,电脑遍及运用的是MS-DOS操作体系,开机之后只要输入指令的黑色背景和白色字符的界面。也因而在之前电脑的学习本钱是十分高的,每天必须背下来许多的指令才能很好地操作电脑,进入到某个文件夹、创建文件夹等,都需求经过指令来完结。

因而,指令行界面(command-line interfaceCLI)是在图形用户界面得到遍及之前运用最为广泛的用户界面,它一般不支持鼠标,用户经过键盘输入指令,计算机接收到指令后,予以履行,也有人称之为字符用户界面(CUI)。

(2) 图形用户界面(GUI):快捷易用且直观

图形用户界面是一种人与计算机通讯的界面显现格局,允许用户运用鼠标等输入设备操作屏幕上的图标或菜单选项,以挑选指令、调用文件、启动程序或履行其它一些日常使命。与经过键盘输入文本或字符指令来完结例行使命的字符界面相比,图形用户界面有许多长处。

现在众所周知的Windows操作体系,便是一个强大的图形操作体系。咱们平常所运用的大多数软件,都是有图形用户界面的。

事实上,图形界面的产生是为了简化咱们运用计算机,能够说,图形界面对许多指令行操作进行了封装

可是,现在不管是什么操作体系,都保留了指令行这个功用,这是由于:

  • 指令行界面较图形用户界面大大地节约了计算机体系的资源
  • 指令行能够完结愈加灵敏的功用
  • 更好地操控操作体系
  • 比起GUI,指令行能够更好地完结自动化

所以说,GUI和CLI并非是互相代替的联系,而是互补的联系。

在咱们编程开发的学习过程中,咱们触摸到的许多东西,都是指令行程序:

  • 版别操控东西Git
  • 项目构建东西Maven
  • npm包管理器(前端开发)
  • Java的编译器javac

假如说彻底不会指令行,那么触摸装备这些东西的时分,会遇到许多难题。

2,指令行的底子运用

按下win + r键翻开运转,输入cmd就能够翻开这个黑黑的指令行窗口了!当然,直接在使命栏的搜索中输入cmd也能够,这个便是体系自带的指令提示符东西。

什么是命令行和GUI?什么是环境变量?

咱们在里边能够履行一些常用指令,例如咱们能够经过ping指令检查衔接一个网站的推迟以检测这个网站的速度和自己的网络状况:

ping cn.bing.com

输入上述指令回车,即可得到下列成果:

什么是命令行和GUI?什么是环境变量?

(1) 指令的底子格局

经过上述指令,咱们发现指令的格局事实上很简略,简直一切指令都是以下格局:

指令 参数1 参数2 ...

上述ping指令中,有一个参数便是你要测验推迟的网址,有些指令没有参数,而有些指令有多个参数,多个参数用空格隔开,大多数指令的参数是能够自由组合的,有的参数是必须的,而有的能够省略。。。

至于参数的次序、有无、格局、含义等等,这就取决于这个指令本身的规划及其作用了!

大多数指令都会供给协助选项,一般在指令后边带上参数--help或许-h等等,这取决于不同的指令,例如显现java指令的用法:

什么是命令行和GUI?什么是环境变量?

假如咱们一开端触摸指令,或许会有点迷糊,不知道这些指令怎么用,因而咱们能够经过检查指令协助,或许是经过上网查阅等等来学会指令的运用。

当然,咱们一般在学习一个指令行开发东西的时分,也会去学习其底子的指令行用法,网上的教程也许多。

其实,咱们许多人排挤运用指令行是由于咱们对运用指令行没有信心,认为很难像电影里那些黑客那样十分熟练地运用指令行。而当咱们测验去学习时,也总是会看到包含大量指令说明的书本或教程,一下子咱们或许就害怕了。其实,关于初学者来说,你底子不需求去看那些书,由于它们大部分是为体系管理员写的。而关于一个程序员,你只需求从了解那些最常用的底子指令开端,比方lscdpwdcp等,并测验重复运用它,当你习气并习气运用这些指令今后,便能够更进一步,测验写一些自动化脚本来协助你完结一些工作。

(2) 当时途径

不管是程序开发,仍是运用指令行,咱们必需求清晰一个概念:当时途径

当时途径也称作运转途径,为什么要有运转途径这个东西呢?原因事实上很简略,由于许多程序会涉及到文件读写的操作,在指定的是相对途径的时分,程序就会以运转途径为根底去查找。

每个指令或许程序运转时,都会有它的运转途径

运转途径一般会显现在指令行窗口中当时行的最前面:

什么是命令行和GUI?什么是环境变量?

可见咱们直接翻开指令行的时分,运转途径默许是咱们的用户文件夹(家目录)

在Windows下有一个指令是dir,能够显现当时途径下的一切文件,咱们来试一下,直接在cmd中输入dir回车履行即可:

什么是命令行和GUI?什么是环境变量?

咱们并没有给dir指令指定要列出文件的方位,可是它仍然输出了成果,很显然dir输出了当时途径下的文件列表。

同样地,一些指令需求咱们指定一个文件途径去履行,例如删去文件del指令,需求给定要删去的文件途径作为参数。

del 要删去的文件途径

这个途径能够是绝对途径,比方我要删去C:\Users\swsk33\Downloads\a.txt这个文件:

del "C:\Users\swsk33\Downloads\a.txt"

那假如你输入的是相对途径会怎么样呢?例如下面这个:

del test.txt

很显然,会删去咱们当时途径下的text.txt文件

假定咱们的当时途径是C:\Users\swsk33,那么上述指令就会把咱们传入的相对途径test.txt和当时途径拼接以找到这个文件的方位,这样删去的便是C:\Users\swsk33\test.txt

指令的参数能够用英文双引号围住,也能够不必。尤其是当参数是文件途径的时分,就最好用英文双引号围住了,由于一些途径中间是带空格的,不必双引号围住会导致指令解析参数的时分,将其拆成多个参数。运用双引号围住就表明这是一个参数。

到此咱们也理解了绝对途径相对途径这个概念:

  • 绝对途径:一个文件的完好途径,一般是以根途径或许盘符作为起点,例如C:\Users\swsk33\test.txt
  • 相对途径:相关于某个文件或许运转途径的途径,在程序规划或许是指令履行的时分,输入相对途径时,都是相关于运转途径来寻觅文件的

咱们仍是用del指令举例,假定咱们的运转途径是C:\Users\swsk33

  • del a.txt 删去当时途径下的a.txt文件,拼接成绝对途径便是删去C:\Users\swsk33\a.txt
  • del .\a.txt 等效于上一条指令,.\就表明当时途径
  • del ..\a.txt 删去当时途径的上一级目录的a.txt文件,拼接成绝对途径便是删去C:\Users\a.txt..\表明上一级目录
  • del ..\..\a.txt 删去当时途径的上一级的上一级目录的a.txt文件,拼接成绝对途径便是删去C:\a.txt,可见能够把多个..\连起来表明多个上级目录
  • del b\a.txt 删去当时途径中b文件夹中的a.txt文件,拼接成绝对途径便是删去C:\Users\swsk33\b\a.txt,等效于指令del .\b\a.txt

可见途径的表明便是这么简略,不同的指令尽管参数格局和含义不相同,可是途径的表明方法、当时途径的概念永远是不变的

在Windows操作体系中,目录用\进行分隔,而Linux操作体系中,途径是用/分隔的,./../用于在Linux操作体系中表明当时途径和上一级途径。

可见绝对途径尽管精准,可是很长,而且只适用于自己的电脑,相对途径就十分的简略,因而大多数时分运用指令传参都传入相对途径作为参数(谁愿意输这么长的指令呢),既然是相对途径,那当然需求一个“参照物”,因而在运转指令的时分,运转途径便是参照。

就如上面咱们履行del a.txt指令,传入的是相对途径a.txt,那a.txt在哪里呢?这时del指令就知道去当时途径下找到a.txt,这便是当时途径的存在含义。

可见有了运转途径,咱们就能够传入愈加简略的相对途径作为参数,程序或许指令也能够利用运转途径和相对途径拼接以找到对应的文件。

(3) 切换当时途径

在指令行窗口中,经过cd指令即可完结切换当时途径。

假定我要切换当时途径到C:\Program Files目录下,则履行:

cd C:\Program Files

什么是命令行和GUI?什么是环境变量?

比照切换前后,发现当时途径就改变了。

咱们当时途径是在C盘下的,假如说要切换的途径坐落其它盘,则还需求在cd后边加上/d参数,例如切换到D:\Program Files,如下:

cd /d D:\Program Files

什么是命令行和GUI?什么是环境变量?

这样才能切换成功。

(4) 批处理脚本

望文生义,批处理便是批量处理一些使命的脚本。事实上,批处理脚本便是把一些要履行的指令写在脚本中,然后鼠标点击运转脚本,就会顺次运转这些指令

批处理文件一般以bat或许cmd作为扩展名,信任咱们平常也见过。

假定咱们现在要完结一系列操作:

  • 先进入D:\dir目录
  • 删去f.txt文件
  • 打印“已完结删去”音讯

咱们就能够用文本文档或许文本文件器写以下内容:

@echo off
cd "D:\dir"
del f.txt
echo 已完结删去

保存为一个扩展名为bat或许cmd的文件,然后双击它,就会从上至下顺次履行咱们的指令了!可见批处理脚本便是把要履行的多条指令按照次序写在一同,点击运转脚本时,这些指令就会顺次履行。

注意榜首行@echo off表明封闭回显,这个写脚本一般就会习气性地加在榜首行,至于具体含义咱们能够上网查。

那有的同学就问了,运转脚本的时分,里边指令的运转途径是什么?

这就要分两种状况讨论了:

  • 鼠标双击脚本:运转途径便是脚本地点途径
  • 在指令行中调用脚本:运转途径便是指令行的运转途径

比方说写了一个脚本名为a.bat,放在D:\bat目录下,那么在指令行中调用意思是:翻开指令行窗口,在其间履行:

start "D:\bat\a.bat"

start指令能够用于在指令行中翻开一个应用程序或许是脚本。

翻开指令行窗口时,指令行的运转途径是C:\Users\swsk33,那么这个脚本中的指令运转途径就也是C:\Users\swsk33

当然,在脚本中运用cd指令也能够切换当时途径,上述删去文件脚本便是先切换到了文件地点目录下。

这里仅仅简略地介绍一下批处理脚本,咱们感兴趣能够上网查阅更多关于批处理的写法。

3,环境变量

(1) 知道环境变量以及Path变量

咱们假如说是学习Java的话,最先开端装置JDK的时分,就需求装备环境变量,咱们假如是今后触摸其他开发东西底子上也需求装备环境变量。那环境变量究竟是什么?为什么咱们要装备这个东西?

先来看一下百度百科对环境变量的定义:

环境变量(environment variables)一般是指在操作体系中用来指定操作体系运转环境的一些参数,如:临时文件夹方位和体系文件夹方位等。

环境变量是在操作体系中一个具有特定名字的目标,它包含了一个或许多个应用程序所将运用到的信息。例如Windows和DOS操作体系中的path环境变量,当要求体系运转一个程序而没有告诉它程序地点的完好途径时,体系除了在当时目录下面寻觅此程序外,还应到path中指定的途径去找。用户经过设置环境变量,来更好的运转进程。

可见环境变量是存在于体系中的一些变量,相当于对一些常用的值起一个名字,咱们引证这个名字即可得到其值。体系中一般有多个环境变量,而每个环境变量的作用也是不相同的。

不过咱们仍是先来知道一下今日的主角:环境变量Path

事实上,咱们在指令行履行的指令,都是一个个指令行程序。体系自带的指令,一般在C:\Windows\System32目录下能够找到。例如咱们前面履行的ping指令,就能够找到:

什么是命令行和GUI?什么是环境变量?

咱们履行指令,事实上便是调用了这些指令行程序,而且这些程序都能够接收并解析参数。

仔细的同学发现咱们Java程序的主函数中有个参数Stirng[] args,包含C言语的main函数中也能够带上int argcchar *argv[]这两个参数,这些便是用于接收指令行参数的

所以说,咱们学会编程之后,也能够自己写一个指令了!

当然了,你输入一个指令的时分,计算机是怎么找到这个指令对应的程序在哪里的呢?事实上,这便是环境变量Path起了作用。

当你履行一个指令的时分,指令行会顺次在下列途径中寻觅这个指令程序:

  1. 当时目录
  2. 环境变量Path中指定的途径

比方咱们输入了ping指令,那么指令行就会去上述途径寻觅ping.exe并调用它。

这时信任咱们理解了装备JDK环境变量的含义地点:让体系能够找到咱们的java指令和javac指令

假定不装备环境变量,你履行java指令时,会报错如下:

什么是命令行和GUI?什么是环境变量?

很显然,体系没有找到java指令程序的地点方位。

因而,之前的环境变量装备,便是把java指令等参加到环境变量Path中,这样体系才能找到它

(2) Windows设定和检查环境变量的办法

在Windows操作体系下,右击此电脑 – 属性 – 体系高档设置

什么是命令行和GUI?什么是环境变量?

点击环境变量按钮,即可进入环境变量的设定页面:

什么是命令行和GUI?什么是环境变量?

什么是命令行和GUI?什么是环境变量?

可见环境变量分为两种:

  • 用户环境变量(上部分):当时用户的环境变量,这里的环境变量只对当时用户收效
  • 体系环境变量(下部分):体系环境变量,对一切用户收效

用户环境变量的优先级会大于体系环境变量。不过咱们一般设定体系环境变量即可

能够点击新建按钮增加一个自定义的环境变量,选中某个环境变量点击修改按钮以修改其值。当然不主张在没有目的的状况下随意修改其值。

(3) 变量的引证

咱们发现现已设定了许许多多环境变量,在Windows中,咱们能够%变量名%的方法来引证它们,也便是用两个%围住变量名,即能够引证这个变量。

能够在设定环境变量值的时分或许在指令行中,引证环境变量。

上述有一个体系环境变量OS,值为Windows_NT,咱们在指令行中能够输出它的值试试看:

echo %OS%

什么是命令行和GUI?什么是环境变量?

当然还能够这样:

echo 我的操作体系是:%OS%

什么是命令行和GUI?什么是环境变量?

可见是很简略的。

变量名不区分大小写。

(4) Path环境变量

Path环境变量能够说是最重要的环境变量之一,上面也叙述过了它的作用:履行指令时,体系除了在当时目录下寻觅指令可履行文件之外,就会去Path变量中记载的途径查找

咱们先翻开Path变量看一下:

什么是命令行和GUI?什么是环境变量?

可见Path变量是多个途径的集合。点击新建或许阅读按钮能够加一个途径,选中一个途径点击删去能够删去它,上移下移能够调整优先级,修改能够修改其间某个途径值。

一般刚刚装置好体系之后,Path变量会默许有以下途径:

  • %SystemRoot%
  • %SystemRoot%\system32
  • %SystemRoot%\System32\Wbem
  • %SystemRoot%\System32\OpenSSH
  • %SystemRoot%\System32\WindowsPowerShell\v1.0

上面的%SystemRoot%也是变量引证格局,其值为C:\Windows。这也可见为什么体系自带的指令咱们无需像JDK相同装备环境变量就能够履行,由于Path环境变量里边一开端就自带了体系途径。

到这里咱们还有一个疑问:其他环境变量为什么值都是一个字符串,而Path变量是一个列表呢?

事实上Path环境变量的值也是一个字符串,只不过它比较特殊,在Windows设置中为了便利用户操作,就将其显现成列表方法了!

上述截图是我电脑的Path环境变量,它的实践值是这个样子的:

%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\OpenSSH;%SystemRoot%\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\Program Files\Redis;C:\Program Files\dotnet;C:\Program Files\Git\cmd;D:\Program Files\Maven\bin;D:\Program Files\MySQL\bin;D:\Program Files\TDM-GCC\bin;D:\Program Files\nodejs;D:\Program Files\指令行程序;%PYTHON_HOME%;%PYTHON_HOME%\Scripts;%JAVA_HOME%\bin;

可见Path变量中记载的多个途径,是用英文分号;隔开的。事实上点击“修改文本”按钮,就能够以字符串方法修改Path变量了。

当然,以列表方法修改愈加便利,可是咱们仍是有必要了解一下Path变量值的格局。

在Windows7及其以下操作体系中,咱们只能以字符串方法修改Path环境变量,这样的话咱们增加途径时需求注意是否现已手动用分号隔开了途径。

而且,可见在Path变量中,也能够引证其它环境变量。

比方说咱们之前装备的JDK环境变量,咱们先装备了JAVA_HOME变量,其值便是JDK的装置途径。我的JDK装置在C:\Program Files\Zulu\zulu-17,所以其值便是这个。

然后在Path中,咱们增加了%JAVA_HOME%\bin这个途径,引证了上面的JAVA_HOME,因而其值实践上是C:\Program Files\Zulu\zulu-17\bin,而java及其相关的指令都在这个目录下:

什么是命令行和GUI?什么是环境变量?

这样,就把JDK指令地点目录参加到了Path环境变量中,使得咱们能够经过指令行调用它们。

但有的同学会问了:为什么非要先装备一个JAVA_HOME变量呢?直接在Path中参加JDK装置途径\bin不就好了吗?

事实上这样也能够到达作用,在指令行中仍然能够调用到java及其相关指令。之所以先要装备JAVA_HOME,除了由于是官方给出的标准之外,还有以下原因:

  • 许多Java相关的开发东西都需求调用java及其相关指令,而这些东西都会先去找JAVA_HOME这个变量以引证java
  • 便于咱们切换java版别,比方说我的电脑上装置了多个版其他Java,咱们只需修改JAVA_HOME中的值为想要的版其他Java地点途径,即可到达切换版其他作用

所以说,装备JDK环境变量的时分,仍是按照标准来比较好。

可见,Path环境变量能够指定一些指令地点目录,除了要装备的Java指令之外,其它指令行程序假如说咱们要经过指令行调用,也能够自己将其地点途径参加到Path环境变量,就能够在指令行调用它了

假如说不把一个指令行程序的地点方位参加Path环境变量能不能调用它呢?当然能够。

比方说在我的D:\Program Files\指令行程序目录下有aria2c.exe这个指令行程序,假如说在不装备环境变量的状况下直接调用它,则要经过指令行程序地点的绝对途径调用:

"D:\Program Files\指令行程序\aria2c.exe" -h

可见是十分麻烦的,假如每个指令都要写绝对途径调用,那不太麻烦了!可见Path的作用是多么的重要。

现在要调用aria2c这个指令,咱们就能够先把其地点目录D:\Program Files\指令行程序参加到Path中。

咱们还发现,指令行程序都是可履行程序,以exe作为扩展名,但是输指令的时分并不需求带上.exe,的确是这样的,当你输入一个指令的时分,体系会去当时途径或许Path中寻觅这个指令对应的可履行文件,可履行文件不限于.exe.com.bat.cmd等等,能够是可履行文件也能够是脚本等等。

浅显地讲,比方咱们履行指令aria2c,那么体系会去对应途径寻觅aria2c.exearia2c.comaria2c.bataria2c.cmd等等。找到了其间一个就中止寻觅并调用它。

当然了,调用指令的时分,带上扩展名也是可行的,比方说:

aria2c.exe -h

等效于aria2c -h

除此之外,咱们还能够where指令检查某个指令对应的程序在哪个地方,例如:

where java
where npm

什么是命令行和GUI?什么是环境变量?

4,总结

到这里,信任咱们现已学会了指令行的底子运用,以及一些关于指令行的常用概念,以及Path环境变量的作用等等。信任到这里,咱们今后在博客或许是教程中看到以下描述,就不会犯难了:

  • xx途径下履行指令xxx(经过cd指令进入到xx途径然后履行xxx指令)
  • xx途径参加到Path环境变量(在环境变量设置中找到Path,修改,参加xx途径)

咱们理解了Path环境变量的含义,信任咱们今后再遇到xxx不是内部或外部指令这样的报错,就一眼能看出来是由于没有把对应的指令行程序地点目录参加到Path环境变量中去而导致的问题了!

不仅仅是JDK,今后还有许多开发东西,都是要经过指令行调用的,咱们也需求装备环境变量,当然了办法都是相同的,把它们地点方位参加到Path即可。

其他大多数指令行程序,无需先设定类似JAVA_HOME的变量,只需直接将它们可履行文件地点目录参加到Path中即可。

今后的开发,咱们简直每天要触摸到指令行这个东西,而体系自带的cmd并不是那么的好用,因而我引荐咱们能够运用其它功用更高档的指令行终端软件:

  • Tabby
  • Cmder
  • Windows Terminal

十分引荐咱们运用Tabby这个软件,有着十分强大的功用和漂亮的界面:

什么是命令行和GUI?什么是环境变量?

而且,其它许多指令行终端,能够在右键菜单中直接翻开,这样省的咱们每天运用cd指令切换当时目录,十分麻烦。

比方说在C:\Users\swsk33\Downloads文件夹中右键翻开Tabby:

什么是命令行和GUI?什么是环境变量?

那么开启后终端的当时途径便是C:\Users\swsk33\Downloads

什么是命令行和GUI?什么是环境变量?

上图~代表用户目录,我的即为C:\Users\swsk33

可见十分便利,今后要在某个目录下履行指令,无需cd到那个目录下,直接在那个目录下右键翻开终端即可。大多数终端软件都有这个功用。

咱们能够参考这个博客学习Tabby的装备和运用:传送门

除此之外,装备环境变量除了在体系高档设置中,还能够运用这款开源的环境变量设置东西,它能够一键检测Java和Python的装置方位并一键装备:传送门

事实上,在Linux体系中也有环境变量这个概念,而且Linux也有Path这个变量,作用和Windows是相同的,咱们今日知道了Windows中环境变量的含义,今后在Linux中也能很快学会了,Linux环境变量的装备方法有所不同,不过也很简略,咱们上网查查就会了。