menu_book
description
在宁皓独立开发者训练营中,有些训练任务需要在命令行界面下完成。Windows 用户可以安装一个 Cmder,macOS 用户可以使用系统自带的终端作为命令行界面。
在训练任务中需要使用在命令行界面下做的一些事情:
Cmder 是一款在 Windows 系统中使用的命令行界面。
我们需要安装一个完整版的 Cmder 作为在 Windows 系统中使用的命令行界面工具。当您在训练视频中听到 “打开终端”,如果您的电脑的操作系统用的是 Windows,就可以打开 cmder。
官方网站:https://cmder.net/
在 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。暂时我们只需要知道这个文件的存在即可。
终端(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 (print working directory)命令可以查看当前所在的位置。
执行 pwd ,得到的结果是一个路径,这个路径是用目录名字加斜线表示的*,*通过这个路径我们就可以知道自己当前所在的位置,这个位置其实就是系统里的某个目录。
示例
→ pwd
/Users/wanghao/desktop
执行 pwd 命令,显示当前所在位置是 /Users/wanghao/desktop。
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(change directory)命令可以改变当前位置,也就是进入到系统的某个目录的下面。
在 cd 命令的后面加上一个具体的路径,可以进入到这个指定的位置。
示例
cd ~/desktop
~/desktop 是一个路径,这里的 ~(波浪号)指的位置就是用户的主目录。执行上面这行命令可以进入到用户主目录下面的 desktop 这个目录里面,这个目录里的东西默认会出现在你的电脑桌面上。 确定当前所在位置可以用 pwd 命令,列出当前位置里的资源可以执行 ls 命令。
在 cd 命令的后面加上 ../,可以进入到当前目录的上一级目录。
示例
cd ../
../(两个点加一条斜线)表示的是上一级目录,比如当前位置是在 /Users/wanghao/desktop*,*对于这个位置来说,它的上一级目录就是 /Users/wanghao。这样如果执行 cd ../ 以后,用 pwd 输出当前的位置,得到的结果会显示当前是在 /Users/wanghao 这个位置上。
../../ 表示的是上一级目录的上一级目录, ./ 一个点加一条斜线表示的是当前目录。
mkdir(make directory)命令可以创建目录。
在 mkdir 命令的后面加上要创建的目录的名字,可以创建一个目录。
示例
mkdir xuanwu
上面命令会在当前目录下创建一个叫 xuanwu 的目录。
在 mkdir 命令的后面可以加上要创建的目录的具体位置。
示例
mkdir -p ~/desktop/projects/xuanwu
注意上面我们在命令里用了一个 p 选项,如果不用这个选项必须要保证新目录的父目录是存在的,也就是在桌面上应该有个 projects 目录,这样才能正常地创建 xuanwu 这个目录,如果 projects 这个目录不存在,执行命令时就会报错:No such file or directory。用了 p 选项以后,如果需要的目录不存在就会自动创建需要的目录。
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(remove)命令可以删除文件或目录。
执行 rm 命令删除文件时,需要提供要删除的文件。
示例
rm package-lock.json
执行上面这个命令会将当前目录下的 package-lock.json 这个文件删除掉。
用 rm 命令删除目录时可以提供 r(递归) 与 f(强制) 这两个选项,这样会强制将指定目录以及它里面包含的全部东西一块删除掉。
示例
rm -rf ~/desktop/nid-node/node_modules
执行上面这个命令,会强制将桌面上的 nid-node 目录里的 node_modules 这个目录以及它里面包含的东西全部都删除掉。
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(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 命令
*在 macOS 系统中通过终端执行 printenv 命令_
在终端,执行 export 命令可以添加环境变量,被添加的环境变量只能在当前这个终端标签里使用。
示例
export MACHINE_NAME=玄武
执行上面的命令会添加一个环境变量叫 MACHINE*NAME,它的值是 玄武。这样在当前这个终端标签里运行的程序,都可以读取到 MACHINE_NAME 这个环境变量,得到的值就是 *玄武_ 。执行 printenv 可以确定一下是否包含了 MACHINE_NAME 这个环境变量。
关掉这个终端标签,重新再打开,之前设置的环境变量就不见了。如果你希望每次打开终端的时候自动设置一些环境变量,可以将设置环境变量用的命令添加到终端的配置文件里,在 macOS 系统里就是 ~/.zprofile,Windows 系统里是 cmder/config/user-profile.sh。
PATH 是一个环境变量,它的值是一组路径,在终端执行命令的时候,会在这些路径里查找是否包含要执行的命令程序。
printenv PATH
得到的结果应该是一组路径,不同的路径之间会用冒号分隔开,在这些路径里都会包含一些可以执行的命令程序。
/usr/local/bin:/usr/bin:/bin: ...
安装了软件以后,可能会包含一些命令行工具,如果想在终端直接使用它们,需要将包含这些命令行工具的目录添加到 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/ls 。usr 一般表示的是 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 键可以退出文档。