命令行界面

在宁皓独立开发者训练营中,有些训练任务需要在命令行界面下完成。Windows 用户可以安装一个 Cmder,macOS 用户可以使用系统自带的终端作为命令行界面。

在训练任务中需要使用在命令行界面下做的一些事情:

  • 使用命令创建应用
  • 启动应用在本地的开发服务
  • 安装项目需要的功能包
  • 执行命令快速创建应用需要的各种零部件
  • 远程连接管理服务器
  • 部署服务端应用
  • 对开发的项目做源代码管理

Cmder(Windows)

Cmder 是一款在 Windows 系统中使用的命令行界面。

我们需要安装一个完整版的 Cmder 作为在 Windows 系统中使用的命令行界面工具。当您在训练视频中听到 “打开终端”,如果您的电脑的操作系统用的是 Windows,就可以打开 cmder。

官方网站https://cmder.net/

Cmder 截图

安装与使用

在 cmder 官方下载完整版的 cmder,将解压之后得到的 cmder 目录放在系统的 Program Files 目录中,然后可以在桌面上创建一个 cmder.exe 的快捷方式。

使用 cmder,可以右键点击 cmder 或是它的快捷方式,然后选择以 管理员身份运行,打开以后可以点击右下角的绿色加号小图标,新建一个 Bash as admin 类型的标签窗口,在这个标签窗口输入要执行的命令。

配置文件

因为我们会选择使用 Bash as admin 类型的 cmder,对应的配置文件应该是 cmder/config/user_profile.sh,也就是在这个文件里的配置会影响 Bash as admin 类型的 cmder。暂时我们只需要知道这个文件的存在即可。

终端(macOS)

终端(Terminal)是 macOS 系统中自带的一款命令行界面。在训练视频中,执行命令的时候一般都会在终端下面完成,如果您用的操作系统是 Windows,可以使用 Cmder 代替终端。

使用终端

终端是 macOS 系统自带的工具,不需要额外安装,在系统的启动台或者使用聚焦搜索,都可以打开终端,打开以后就可以在上面执行文字命令了。

打开终端

通过聚焦搜索找到终端

偏好设置

通过终端的 偏好设置,你可以设置终端使用的主题、字体字号、光标的样式等等。

打开终端,在终端菜单下面可以打开编好设置(command + ,),然后在描述文件标签的下面,选择使用 Homebrew,字体是 Monaco 18,光标用的是下划线。

终端的偏好设置

终端的偏好设置

配置文件

通过用户主目录下的 .zshrc 与 .zprofile 这两个文件可以修改终端的相关配置。

因为文件的名字里是以点开头的,这种文件在系统里默认会被隐藏起来,也就是即使你打开了文件所在的目录,也可能看不到 .zshrc 或 .zprofile 这两个文件。在终端可以使用 vi 或 code(VSCode 编辑器里带的一个命令行工具) 命令打开并编辑这两个文件。

使用 vi 命令编辑

vi ~/.zprofile

执行上面的命令会用 vi 编辑器打开当前登录用户主目录下的 .zprofile 文件。

使用 code 命令编辑

code ~/.zprofile

执行上面的命令会使用 VSCode 编辑器打开当前登录用户主目录下的 .zprofile 这个文件。

修改提示符

打开终端,在光标左边的东西就是提示符,默认这个提示符看起来可能像下面这样:

wanghao@wanghaodeMacBook ~ %

在提示符里会显示当前登录到系统中的用户(wanghao)与电脑的名字(wanghaodeMacBook),还有当前所在的目录(~),另外在结尾还有一个 % 符号。在训练营的视频内容中,终端的提示符是一个简单的 → 符号,如果你希望使用同样的提示符,可以通过修改 ~/.zshrc 这个文件。

vi ~/.zshrc

vi 是一个在命令行界面下使用的文本编辑器,它后面是要编辑的文件的位置,如果文件不存在就会新创建一个。打开以后,先按一下小写的 i 按键,这会打开编辑器的编辑模式,这样就可以编辑文件内容了,在文件中添加下面这行代码:

PROMPT='→ '

上面这行配置的就是终端的命令提示符。完成编辑以后,按一下 esc 退出编辑模式,再输入 :wq 并按下回车*,*这样会保存并且退出文件,注意要在英文状态下输入这些命令。修改了配置文件以后,需要重启终端才能生效,或者可以执行一下 srouce ~/.zshrc,这时你会发现命令提示符就会是我们修改之后的样子了。

修改了描述文件与提示符之后的终端

修改了描述文件与提示符之后的终端

常用命令

下面是几个经常会用到的命令行工具。

pwd(输出当前位置)

pwd (print working directory)命令可以查看当前所在的位置。

执行 pwd ,得到的结果是一个路径,这个路径是用目录名字加斜线表示的*,*通过这个路径我们就可以知道自己当前所在的位置,这个位置其实就是系统里的某个目录。

示例

→ pwd
/Users/wanghao/desktop

执行 pwd 命令,显示当前所在位置是 /Users/wanghao/desktop。

ls(列出资源)

ls(list)命令可以列出指定位置里的资源,也就是列出某个位置里包含的文件与目录。

列出当前位置里的资源

执行 ls 命令,如果不指定具体位置,就会列出当前所在位置里的东西。

示例

→ ls
README.md    dist        package.json    src ...

列出指定位置里的资源

在 ls 命令的后面可以加上一个具体的位置,这样可以列出这个位置里包含的资源。

示例

→ ls ~/desktop/xuanwu
README.md    dist        package.json    src ...

列出资源的详细信息

如果想列出资源更详细的信息,可以配合使用 l(长格式) 与 a(所有) 这两个选项。

示例

→ ls -la
total 832
drwxr-xr-x   20 wanghao  staff     640 Feb 25 17:31 .
drwxr-xr-x@  59 wanghao  staff    1888 Apr 26 10:50 ..
drwxr-xr-x   12 wanghao  staff     384 Apr 26 10:55 .git
-rw-r--r--    1 wanghao  staff     283 Mar  7 22:15 .gitignore
-rw-r--r--    1 wanghao  staff     315 Mar  7 22:15 README.md
drwxr-xr-x@   8 wanghao  staff     256 Feb  5 09:41 dist
drwxr-xr-x  860 wanghao  staff   27520 Jan 24 09:01 node_modules
-rw-r--r--    1 wanghao  staff    1580 May  5 09:45 package.json
drwxr-xr-x   22 wanghao  staff     704 May  5 09:45 src
...

使用 l 选项会用长格式显示资源,每一行是一个资源(文件或目录),每一栏分别表示不同的东西,比如 drwxr-xr-x 表示的是资源的权限,wanghao 是资源的拥有者,staff 表示资源所属的用户组。使用了 a 这个选项以后会列出所有资源(包含隐藏文件),比如 .git 与 .gitignore,这两个文件的名字是以点开头的,在不使用 a 选项的情况下,列出资源时是不会显示这种文件的。

cd(改变当前位置)

cd(change directory)命令可以改变当前位置,也就是进入到系统的某个目录的下面。

进入到某个位置

在 cd 命令的后面加上一个具体的路径,可以进入到这个指定的位置。

示例

cd ~/desktop

~/desktop 是一个路径,这里的 ~(波浪号)指的位置就是用户的主目录。执行上面这行命令可以进入到用户主目录下面的 desktop 这个目录里面,这个目录里的东西默认会出现在你的电脑桌面上。 确定当前所在位置可以用 pwd 命令,列出当前位置里的资源可以执行 ls 命令。

回到上一级目录

在 cd 命令的后面加上 ../,可以进入到当前目录的上一级目录。

示例

cd ../

../两个点加一条斜线)表示的是上一级目录,比如当前位置是在 /Users/wanghao/desktop*,*对于这个位置来说,它的上一级目录就是 /Users/wanghao。这样如果执行 cd ../ 以后,用 pwd 输出当前的位置,得到的结果会显示当前是在 /Users/wanghao 这个位置上。

../../ 表示的是上一级目录的上一级目录, ./ 一个点加一条斜线表示的是当前目录。

mkdir(创建目录)

mkdir(make directory)命令可以创建目录。

在当前位置创建目录

在 mkdir 命令的后面加上要创建的目录的名字,可以创建一个目录。

示例

mkdir xuanwu

上面命令会在当前目录下创建一个叫 xuanwu 的目录。

在指定位置创建目录

在 mkdir 命令的后面可以加上要创建的目录的具体位置。

示例

mkdir -p ~/desktop/projects/xuanwu

注意上面我们在命令里用了一个 p 选项,如果不用这个选项必须要保证新目录的父目录是存在的,也就是在桌面上应该有个 projects 目录,这样才能正常地创建 xuanwu 这个目录,如果 projects 这个目录不存在,执行命令时就会报错:No such file or directory。用了 p 选项以后,如果需要的目录不存在就会自动创建需要的目录。

cp(复制)

cp(copy)命令可以复制文件或目录。

复制文件

执行 cp 命令的时候需要提供想要复制的文件与复制到的位置。

示例

cp assets/example.env .env

上面这行命令会复制当前位置里的 assets 目录里的 example.env 这个文件,复制到的位置是当前目录,名字叫 .env。也就是在当前目录下应该会有一个 .env 文件,这个文件就是 assets/example.env 的复制品。

复制目录

用 cp 命令复制目录的时候需要加上 R 选项,这样可以复制指定的目录以及它里面包含的所有东西。

示例

cp -R config ../config_bak

执行上面这个命令会复制当前位置里的 config 这个目录(包含目录里的所有文件与目录),将复制品放在上一级目录里,名字是 config_bak。

rm(删除)

rm(remove)命令可以删除文件或目录。

删除文件

执行 rm 命令删除文件时,需要提供要删除的文件。

示例

rm package-lock.json

执行上面这个命令会将当前目录下的 package-lock.json 这个文件删除掉。

删除目录

用 rm 命令删除目录时可以提供 r(递归) 与 f(强制) 这两个选项,这样会强制将指定目录以及它里面包含的全部东西一块删除掉。

示例

rm -rf ~/desktop/nid-node/node_modules

执行上面这个命令,会强制将桌面上的 nid-node 目录里的 node_modules 这个目录以及它里面包含的东西全部都删除掉。

vi(命令行编辑器)

vi(visual)是一个在命令行界面下使用的编辑器,可以用它编辑或创建文本文件。

打开编辑器

在 vi 命令的后面加上要编辑的文件的具体位置,执行以后就会用 vi 编辑器打开指定的文件。如果要编辑当前目录下的文件,可以直接输入文件的名字。

示例

vi ~/desktop/xuanwu/README.md

用 vi 编辑的文件可以不存在,但要保证文件所在目录是存在的,如果目录不存在,保存文件时就会报错:Can't open file for writing。所以在用 vi 编辑或创建文件之前,先保存文件目录是存在的,如果不存在,可以使用 mkdir 命令创建所需目录。

编辑文件

使用 vi 编辑文件内容,需要打开编辑模式,按一下 i 按键可以打开编辑模式,这时窗口底部会显示 — INSERT —,完成编辑以后按 esc 按键可以退出编辑模式。

保存文件并退出

编辑了文件内容以后,如果想要保存对文件的修改并退出 vi 编辑器,先确定当前在正常模式下,按 esc 可以退出其它模式回到正常模式,然后执行:

:wq

w 表示写入,q 表示退出,输入 :wq 以后按下回车,这样就会保存对文件的修改,然后关掉 vi 编辑器。

放弃修改直接强制退出

如果不想保存对文件的修改,打算强制退出 vi 编辑器,可以执行:

:q!

q 表示退出,! 表示强制。

翻页查看文件

按 ctrl + f 按键可以向下翻页查看文件,按 ctrl + b 按键可以向上翻页查看文件。

搜索文件内容

在正常模式下,输入 /,后面加上要搜索的关键词,按下回车,可以搜索并定位到当前文件包含指定关键词的地方。按 n 可以定位到下一个匹配的地方,按 N 可以定位到上一个匹配的地方。

cat(输出文件内容)

cat(concatenate)命令可以将多个文件合并成一个文件,也可以输出指定文件里的内容。

输出文件内容

在 cat 命令的后面提供要查看内容的文件,可以输出这个文件里的内容。

示例

cat ~/.ssh/id_rsa.pub

执行上面这行命令会输出在用户主目录下的 .ssh 目录里的 id_rsa.pub 这个文件里的内容。

相关概念

终端

终端就是一种命令行界面工具,当您在训练营中听到或看到 “在终端” 或 “打开终端” 时,Windows 用户可以打开 cmder,macOS 用户可以打开系统自带的终端。

用户主目录

在操作系统里的用户一般都有一个主目录,这个目录的位置在不同的操作系统里是不一样的,比如在 macOS 系统里,wanghao 这个用户的主目录的位置应该是 /Users/wanghao,在 Ubuntu 系统里,wanghao 这个用户的主目录应该是在 /home/wanghao。

进入用户主目录

在终端可以使用 ~(波浪号)表示当前用户的主目录所在的位置,比如在 macOS 系统里,当前登录的用户如果是 wanghao,这个 ~ 表示的位置应该就是 /Users/wanghao,所以进入到这个位置,可以执行:

cd ~

根目录

根目录指的是某个地方的第一级别的目录。

比如一个项目的位置是 ~/desktop/nid-node,对于这个项目来说,它的根目录指的就是 ~/desktop/nid-node。如果我们在这个项目的根目录下创建了一个 README.md 文件,那这个文件的位置应该就是 ~/desktop/nid-node/README.md。

系统根目录

在 macOS 与 Linux 类型的操作系统里,系统的根目录指的是 / 这个位置,比如执行 cd / 命令,会进入到系统根目录的下面。/Users 这个路径,可以描述为系统根目录下面的 Users 这个目录。

路径

路径可以用来表示在操作系统里的一个目录或文件的位置,路径由目录与斜线组成,如果是表示文件的路径,在路径中还会包含文件的名字。

目录的路径

表示目录的路径由目录的名字与斜线组成。

示例

/Users/wanghao/desktop/xuanwu

上面这个路径从系统的根目录开始,这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录。

文件的路径

表示文件的路径由目录的名字、斜线与文件组成。

示例

/Users/wanghao/desktop/xuanwu/src/main.ts

上面这个路径从系统的根目录开始,这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录里的 src 目录里的 main.ts 这个文件。也就是 main.ts 这个文件在 src 目录的下面,src 在 xuanwu 的下面,xuanwu 在 desktop 目录里,desktop 在 wanghao 这个目录里,wanghao 在 Users 这个目录里,Users 这个目录在系统的根目录的下面。

相对路径

相对路径指的是相对于当前位置的路径。相对路径表示的实际位置,会随着当前位置的变化而变化。

示例

src/main.ts

相对路径不以系统根目录(/)开始。描述上面这个相对路径,可以说当前目录下的 src 目录里的 main.ts。如果当前位置是 /Users/wanghao/desktop/xuanwu,相对于这个位置,上面这个路径在系统中的实际位置应该就是:

/Users/wanghao/desktop/xuanwu/src/main.ts

绝对路径

绝对路径指的就是一个目录或文件在系统中的实际位置。

示例

/Users/wanghao/desktop

绝对路径会从系统的根目录开始。描述上面这个绝对路径,可以说在系统根目录下的 Users 里的 wanghao 里的 desktop 这个目录。

环境变量

环境变量(environment variables)就是在系统环境中存在的一些变量,程序可以读取这些环境变量并获取到它们的值。

查看环境变量

printenv

在终端执行 printenv 命令可以输出当前已有的一些环境变量以及它们对应的值。环境变量的名字一般全部使用大写字母,等号右边是环境变量对应的值。

示例

LANG=zh_CN.UTF-8

LANG 是环境变量的名字,zh*CN.UTF-8 是 LANG 这个环境变量对应的值。

在 Windows 系统中通过 Cmder 执行 printenv 命令

在 Windows 系统中通过 Cmder 执行 printenv 命令

在 macOS 系统中通过终端执行 printenv 命令

*在 macOS 系统中通过终端执行 printenv 命令_

设置环境变量

在终端,执行 export 命令可以添加环境变量,被添加的环境变量只能在当前这个终端标签里使用。

示例

export MACHINE_NAME=玄武

执行上面的命令会添加一个环境变量叫 MACHINE*NAME,它的值是 玄武。这样在当前这个终端标签里运行的程序,都可以读取到 MACHINE_NAME 这个环境变量,得到的值就是 *玄武_ 。执行 printenv 可以确定一下是否包含了 MACHINE_NAME 这个环境变量。

关掉这个终端标签,重新再打开,之前设置的环境变量就不见了。如果你希望每次打开终端的时候自动设置一些环境变量,可以将设置环境变量用的命令添加到终端的配置文件里,在 macOS 系统里就是 ~/.zprofile,Windows 系统里是 cmder/config/user-profile.sh。

PATH

PATH 是一个环境变量,它的值是一组路径,在终端执行命令的时候,会在这些路径里查找是否包含要执行的命令程序。

输出 PATH 的值

printenv PATH

得到的结果应该是一组路径,不同的路径之间会用冒号分隔开,在这些路径里都会包含一些可以执行的命令程序。

/usr/local/bin:/usr/bin:/bin: ...

设置 PATH 的值

安装了软件以后,可能会包含一些命令行工具,如果想在终端直接使用它们,需要将包含这些命令行工具的目录添加到 PATH 里。

示例

export PATH=$PATH:/Applications/flutter/bin

在终端的配置文件里添加上面这行代码,结果就是在 PATH 这个环境变量里添加了一个新的路径,位置是 /Applications/flutter/bin,也就是在这个位置里包含的命令行工具,以后都可以直接在终端执行。这里的 $PATH 引用的是原来的 PATH 这个环境变量的值。

钥匙

钥匙(keys)是加密解密用的东西(文本文件),在训练营中,向远程仓库推送代码的时候,登录管理远程服务器的时候都会用到在本地电脑里存放的钥匙。钥匙一般都成对出现,一个密钥(private key)对应一个公钥(public key)。我们可以给当前登录到系统的用户生成一对钥匙,其中密钥是私密的,决对不能交给别人,但是公钥可以放心交到其它地方使用。

生成钥匙对

当前用户的钥匙对会放在用户主目录下的 .ssh 这个目录里,你可以先确定一下是否已经为当前用户生成了钥匙对。

ls ~/.ssh

执行上面的命令,如果发现用户主目录下的 .ssh 里面,有 id_rsa(密钥) 与 id_rsa.pub(公钥) 这两个文件,说明当前用户已经拥有了钥匙对。如果没有这两个文件,可以执行 ssh-keygen 命令生成它们。

ssh-keygen

在终端,执行 ssh-keygen 命令,并一路回车,完成以后就会在用户主目录下的 .ssh 目录里生成一对钥匙。这个命令只需要执行一次,重复执行会覆盖掉之前生成的钥匙对。

查看公钥文件内容

在配置三方服务使用钥匙验证身份的时候,我们需要复制用户的公钥文件里的内容。

查看公钥文件里的内容可以执行:

cat ~/.ssh/id_rsa.pub

输出的内容看起来像这样:

ssh-rsa AAAAB3NzaC1yc2EAAX...

技巧

知道命令来自哪里

如果你想知道一个命令行工具到底在哪儿,可以用 which 命令,比如我想知道 ls 这个命令行工具的位置,可以执行:

which ls

得到的结果就是 ls 这个命令行工具的位置,具体在哪取决于你的操作系统。在 macOS 系统里,这个工具是在 /bin/ls 。在 Windows 系统里,如果你用的是 bash 类型的 Cmder,会显示这个工具的位置是 /usr/bin/lsusr 一般表示的是 user,也就是用户的意思,bin 这个目录里通常包含的是一些可以执行的程序。

这个 /usr/bin 应该是 Cmder 设置的一个目录的别名,因为在 Windows 系统里并没有这个地方,实际的位置应该是 Cmder 里的某个目录的下面。在我的系统里,/usr/bin 真正的位置是 /C/Program\ Files/cmder/vendor/git-for-windows/usr/bin ,进入到这个目录的下面,列出目录里的资源,你会发现一些 .exe 后缀的文件。

在 Windows 系统里,带这种 .exe 后缀的文件就是可执行的程序。在后面我们会用到这里面的一些命令行工具,比如远程连接服务器用的 ssh ,生成密钥文件用的 ssh-keygen 等等。Windows 系统默认都不带这些东西,这也是我们为什么要用 Cmder 来代替 Windows 系统自带的命令行界面。

获取命令的帮助信息

如果你了解某个命令行工具的用法,可以在命令的后面加上 help 选项,比如:

ls --help

如果命令不提供 help 这个选项,可以试着用 man(manual) 命令查看命令的使用说明,比如:

man ls

命令的说明文档可能会分页显示,按 f 键可以向后翻页,按 b 键可以向前翻页,按 q 键可以退出文档。

训练营路线
选择训练路线
这是您成为应用开发者唯一需要做的系统训练,参加宁皓网独立开发者训练营,给自己一次机会,未来价值百万甚至亿万的应用产品将会出自您手。
预热
理解应用开发,准备开发工具与环境,学习程序语言基础,测试自己是否适合成为开发者。
599
客户端
获得客户端应用开发能力,独立开发 Web 前端应用或 iOS 与安卓应用。
2,999
服务端
获得服务端应用开发能力,独立开发基于 Node.js 技术的服务端应用。
2,999
全栈
获得多平台应用开发能力,独立开发完整应用,包括前端、移动端与服务端。
3,699
3,999