终端(Terminal)
什么是终端?
我们知道,要让计算机执行计算,必须将指令和数据输入到计算机当中。
早期的计算机并没有鼠标、显示器等“高科技”产物,程序员需要将数据标记在卡片或磁带上,或者是是用电传打字机(teletype)输入进计算机进行计算。 上面的图片展示的设备叫做VT100,是一种具有显示器的终端,能够将使用者的输入传输进计算机、显示计算机的输出、并支持光标控制等多项任务。 当拥有图形界面的操作系统(如Windows)开始流行后,显示器被好看的图形界面所占用,终端则是以硬件模拟器(terminal emulator)的方式继续存在,如今大家使用的终端大多是在模拟VT100。
既然终端是一种硬件,我们在终端里究竟是和谁在交互?
操作系统为用户提供了一个“交互界面”,这个程序(软件)叫做壳层(shell)。在Windows中,图形用户界面由
explorer.exe
提供,命令行界面由powershell.exe
或cmd.exe
提供。在Unix系统中,命令行界面有sh
、bash
、zsh
、fish
等多种实现。未来我们提及终端的时候,更多指的是终端模拟器外加上操作系统壳层程序所组成的整体。
打开终端
点击菜单栏中的 终端--新建终端,或者按下Ctrl+Shift+`(ESC下面的键),或者在面板中点击加号打开一个新的终端。 VSCode的面板中可以左右分屏或创建多个终端,大家可以自己试试。
认识终端
我们首先来理解一下终端上显示的到底是什么,再来学习如何让终端执行我们的“命令”。
以Windows为例,当你打开终端后,你可能会看到终端上显示着类似于下面这样的文字(取决于大家Windows的版本,显示的实际内容可能会略有出入):
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。
安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
PS D:\sicp\lab00>
首先前面几行是关于微软的一些信息,我们不用管它。终端的最下面一行显示了这样一段文字:
PS D:\sicp\lab00>
我们把这串字符称为“提示符”(Prompt),它本身代表了一些当前系统的信息,并“提示”你,终端正在待命,你可以在光标处输入命令! 那这串提示符的信息该怎么理解?我们可以把它分解为以下几个部分:
- 第一部分是
PS
,表示当前终端使用的是Powershell,不同的终端可能会展示不同的内容。 - 第二部分是
D:\sicp\lab00
,表示终端的“当前工作目录”。这个概念我们会在后面“文件查找与当前工作目录的切换”的部分会详细讲解。 - 第三部分是
>
,提醒你可以在它后面输入命令了。
终端中的提示符的格式是可以自定义的。每个平台都可能有不同的格式。所以我们再以macOS为例,看看助教的笔记本终端长什么样。
可以看到,第一行仍然是操作系统相关的信息,但是提示符比较花哨,显示了三个部分:
- 第一行左侧蓝色的
~
,表示当前的工作目录。 - 第一行右侧淡蓝色的当前时间。
- 第二行左侧绿色的
>
,表示可以在后面输入命令。
~
是什么?部分壳层程序提供波浪号扩展(Tilde Expansion)的功能,
~
将被展开成环境变量$HOME
,也就是用户的“家目录”,类似于Windows的C:\User\YOURNAME
。
我也用的macOS,为什么我的和助教的不一样?
macOS中的默认的提示符是
$
。 感兴趣的话,你可以抄助教的终端配方:
- Oh My Zsh https://ohmyz.sh
- Powerlevel10k https://github.com/romkatv/powerlevel10k
执行命令
现在,大家应该理解了“提示符”的含义。接下来我们就可以试试在终端上输入命令执行了。
我们首先输入一个简单的命令来看看Python是否安装成功!
如下图所示,请大家向终端敲入命令:python3 --version
,然后按下回车键。
使用Windows的同学:为什么我按下回车什么都不显示,或者是运行
python3
弹出了应用商店?Windows和其他的操作系统有所不同,Windows下的安装的Python3程序叫做
python
,其他操作系统叫做python3
,我们需要给python
设置一个别名来消除不同操作系统之间的差别。如果我们不进行这一步,我们在执行
python3
时会运行Windows提供的一个缺省程序,跳转到应用商店安装Python3。对于使用Windows的同学,我们建议大家正确配置别名,使得输入python3
也能执行Python3,而不是打开Windows应用商店。
首先,在终端中执行以下指令:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
这个指令的意思是,将当前用户的脚本执行策略设置为
RemoteSigned
,允许执行本地创建的脚本,以及从网络上下载下来且具有数字签名的脚本。 执行指令后,终端不会有任何输出。接着,我们打开文件资源管理器,在“文档”文件夹下新建一个叫做
WindowsPowerShell
(注意大小写)的文件夹,并创建一个叫做Profile.ps1
的文件。用VSCode打开
Profile.ps1
,写入以下内容并保存:Set-Alias -Name python3 -Value python
很显然,这个指令的意思是,将
python3
设置为python
的别名。 别名只在当前终端会话中有效,因此我们要把它写入Profile.ps1
,使得你每次启动终端都自动设置别名。如果你的操作正确,此时开启一个新的终端,运行
python3 --version
将打印Python版本。
可以看到,终端(实际上是操作系统)执行了我们输入命令,并把结果"Python 3.10.7"输出到了终端中——这代表助教所安装的Python的版本是3.10.7。 大家看到的结果不必和助教这边显示的完全相同,只需要看到输出了你安装的Python版本号即可。
大家还可以看到,终端又在最下方输出了一行提示符,提示大家可以输入新的命令了!
到这里,大家已经用终端执行了第一个非常简单的指令。
在以后的课程讲义和各类沟通交流中,我们应当避免使用图片来显示命令的运行结果,倾向于使用文本的方式来进行展示。
根据习惯,我们使用$
这一简短的符号来代替原本图片中一长串的提示符。未来大家会在网络上看到更多这样的表达。但是请大家注意,提示符是交互程序打印在终端上给你看的,在输入其他人给的命令时,不要把提示符也敲进去!
比如,查看Python版本号的例子可以用下面的文本进行描述:
$ python3 --version
Python 3.10.7