终端(Terminal)

什么是终端?

我们知道,要让计算机执行计算,必须将指令和数据输入到计算机当中。

早期的计算机并没有鼠标、显示器等“高科技”产物,程序员需要将数据标记在卡片或磁带上,或者是是用电传打字机(teletype)输入进计算机进行计算。 上面的图片展示的设备叫做VT100,是一种具有显示器的终端,能够将使用者的输入传输进计算机、显示计算机的输出、并支持光标控制等多项任务。 当拥有图形界面的操作系统(如Windows)开始流行后,显示器被好看的图形界面所占用,终端则是以硬件模拟器(terminal emulator)的方式继续存在,如今大家使用的终端大多是在模拟VT100。

既然终端是一种硬件,我们在终端里究竟是和谁在交互?

操作系统为用户提供了一个“交互界面”,这个程序(软件)叫做壳层(shell)。在Windows中,图形用户界面由explorer.exe提供,命令行界面由powershell.execmd.exe提供。在Unix系统中,命令行界面有shbashzshfish等多种实现。未来我们提及终端的时候,更多指的是终端模拟器外加上操作系统壳层程序所组成的整体。

打开终端

点击菜单栏中的 终端--新建终端,或者按下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中的默认的提示符是$。 感兴趣的话,你可以抄助教的终端配方:

执行命令

现在,大家应该理解了“提示符”的含义。接下来我们就可以试试在终端上输入命令执行了。

我们首先输入一个简单的命令来看看Python是否安装成功! 如下图所示,请大家向终端敲入命令:python3 --version,然后按下回车键。

使用Windows的同学:为什么我按下回车什么都不显示,或者是运行python3弹出了应用商店?

Windows和其他的操作系统有所不同,Windows下的安装的Python3程序叫做python,其他操作系统叫做python3,我们需要给python设置一个别名来消除不同操作系统之间的差别。

如果我们不进行这一步,我们在执行python3时会运行Windows提供的一个缺省程序,跳转到应用商店安装Python3。对于使用Windows的同学,我们建议大家正确配置别名,使得输入python3也能执行Python3,而不是打开Windows应用商店。

  1. 首先,在终端中执行以下指令:

    Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
    

    这个指令的意思是,将当前用户的脚本执行策略设置为RemoteSigned,允许执行本地创建的脚本,以及从网络上下载下来且具有数字签名的脚本。 执行指令后,终端不会有任何输出。

  2. 接着,我们打开文件资源管理器,在“文档”文件夹下新建一个叫做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