Skip to content

命令行

命令行的概念

本节的概念在历史的进程中被逐渐模糊了边界,非常容易混淆,但是也没有区分的必要。我们不需要记住这些概念,有需要的时候再回来查阅即可。

早期的计算机体积庞大,安置在机房中。一台计算机通常会同时被多人使用,每位用户都在一个接入点进行工作,这些接入点被称为终端(Terminal)。终端是电信号的终点和起点——用户通过键盘输入命令,终端将命令转换为电信号,通过线路传输到计算机本体;而程序运行的结果在终端被转换成文字,显示在屏幕上,供用户阅读。

终端更偏向于接入点的概念,而控制台(Console)则指代维持终端正常工作的一整套机器。老概念中的控制台可能包含按钮、开关、指示灯等,用于控制终端的工作状态,就像宇宙飞船的控制面板;现代的console的形式更灵活,典型例子有Xbox、PlayStation、Switch等游戏机,它们使用手柄进行操控。

在终端上能进行什么样的操作?用户输入一行指令,等待计算机计算结果,然后结果显示在终端上。这种交互方式被称为命令行界面(Command Line Interface,CLI)。

其实,命令行界面在我们的生活中十分常见。比如营销短信最后会提示你“回复TD退订”,这里你输入TD之后发送,就完成了一次和营销系统的交互。

另外一个例子是,微信中的许多公众号都支持公众号自动回复。我们在聊天框里面输入我们想要获取的信息,然后微信机器人就会自动返回结果。如右图中,我们可以在一年中的某些时期通过学生清华公众号查询自己的阳光长跑次数。这也是一种命令行界面。

不过,在计算机领域,人们习惯了在终端进行命令行操作,也因此把旧式的终端移植到了现代的计算机上,其被称为终端模拟器(Terminal Emulator)。终端模拟器一般是个黑乎乎的页面,上面只有文字,你可以输入一行命令,然后按下回车键,界面上就会显示计算机的回应。

命令行需要用户从键盘敲入,为了提高效率,人们用shell处理用户的输入。Shell是一种辅助程序,可以根据用户的输入,解析命令,然后调用相应的程序。Shell本身并不做计算,只是在实际执行的程序外面套了层壳(shell)。

举个例子,以下是一段命令行脚本:

for i in {1..3}; do
    printf $i
done

bash(一种shell)运行,等价于:

printf 1
printf 2
printf 3
这是一个Asciicast,没有声音,你可以直接从上面复制文字!

可见,合理利用shell,可以大大提高效率。最经典的shell是the Bourne shell (sh),日常我们常用的shell有bashzsh。它们略有区别,但大部分命令是共通的。可以在命令行中输入echo $SHELL确认你当前用的是哪个shell。

如何打开命令行

系统均自带命令行,有一些IDE也内置了终端模拟器。

下面我们介绍一些进入命令行的方法。

  • Windows的cmd命令行:Win+R,输入cmd,回车。
  • Windows的PowerShell(不常用):Win+R,输入powershell,回车。
  • macOS:打开“终端”(或“Terminal”)应用。新安装的系统最好先执行xcode-select --install安装一些必要的工具。
  • Linux:打开“终端”应用,或按Ctrl+Alt+T(部分Linux发行版可能不支持)。
  • Visual Studio:在菜单栏中选择Tools > Command Line > Developer Command Prompt or Developer PowerShell
  • Visual Studio Code:按Ctrl+`,或在菜单栏中选择View > Integrated Terminal
  • 自己安装的环境:例如git bash、WSL、Windows Terminal等,直接打开程序即可。

基础命令

从本节开始,我们默认大家使用sh的语法。Linux和Mac自带的shell都支持,使用Windows的同学请注意:

Windows下默认的两个命令行界面(cmd和PowerShell)与其他系统的命令行语法均不同,但是我们提到的所有命令都有相对应的版本,可以在网上搜索到。如果你希望使用和我们一样的命令,可以使用装git的时候默认安装的git bash,或者参考配置开发环境中的方法安装WSL。

一个命令一般包含一个命令名和若干个参数,参数之间用空格分隔。例如ls -als是命令名,-a是参数。有些命令有长参数名,例如ls --all,这两种写法是等价的。#之后的内容是注释,不会被执行。

在shell中输入命令后按下回车,就可以看到结果。如果程序运行时间太长,你不打算继续等待,可以按下Ctrl+C终止程序。

Shell的一个基本概念是“当前目录”(current directory),它表示你当前所在的目录。在命令行中,你可以通过pwd命令查看当前目录是什么,通过ls命令查看当前目录下有哪些文件和文件夹。默认情况下,.开头的文件和文件夹是隐藏的,可以使用ls -a命令查看。

如果要切换当前目录,可以使用cd命令。例如,cd ..表示切换到当前目录的上一级目录,cd folder表示切换到当前目录下的folder文件夹。这些操作可以用/来连接,例如cd ../folder表示切换到上一级目录中的folder文件夹。

系统上有一个根目录,可以认为是包括了所有文件夹的总文件夹1,它的路径是/。那么cd /usr就表示切换到根目录下的usr文件夹。

系统上的每个用户都还有一个自己的根目录,也被称为home目录。在Windows上,它的路径是C:\Users\用户名;在Linux上的路径是/home/用户名;在Mac上的路径是/Users/用户名。我们不需要记住这个位置,在shell中,可以使用~表示home目录。这个目录比较重要,因为大部份的配置文件都被放在这里。

现在假设我们得到了一个程序prog放在当前目录下,我们想要运行它,可以使用./prog命令。这里./表示当前目录,不可省略,否则shell会到环境变量PATH中的目录中寻找prog

部分命令,一般是安装命令,需要管理员权限才能运行。比如apt install g++是一个Ubuntu上的一个安装编译器的命令,为了使用管理员权限运行,我们在前面加上sudo

sudo apt install g++

运行时,它可能会提示你输入你的帐户密码来授权它进行管理员操作。为了保障安全,输入密码的时候是不会显示输入的,输完后回车即可。如果你的帐户没有管理员权限,那么即使输入了密码,命令也无法成功运行。

请注意,管理员操作通常是有风险的,因为它可以修改系统的任何文件。如果你不确定你在做什么,不要使用管理员权限。

Shell的启动脚本

每一次打开shell的时候,bash都会执行~/.bashrc里面的所有命令,因此我们可以在里面放一些常用的设置。

比如,我们可以设置一些别名:

alias ll='ls -l'

这样输入ll就相当于输入ls -l了。

相对应的,zsh会运行~/.zshrc。请根据你的shell来选择。

下一项工作是?

你已经可以使用shell了!你可以自行搜索文档,探索你的shell的更多用法;或者在实践中学习,许多工具都有命令行版本。


  1. Windows是特例,它有很多个盘符,但是在git bash和WSL下都是有根目录的概念的。