{"_path":"/docs/tools/cli","_draft":false,"_partial":false,"_empty":false,"title":"命令行界面","description":"在宁皓独立开发者训练营中，有些训练任务需要在命令行界面下完成。Windows 用户可以安装一个 Cmder，macOS 用户可以使用系统自带的终端作为命令行界面。","excerpt":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"命令行界面"},"children":[{"type":"text","value":"命令行界面"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在宁皓独立开发者训练营中，有些训练任务需要在命令行界面下完成。Windows 用户可以安装一个 Cmder，macOS 用户可以使用系统自带的终端作为命令行界面。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在训练任务中需要使用在命令行界面下做的一些事情："}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"使用命令创建应用"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"启动应用在本地的开发服务"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"安装项目需要的功能包"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"执行命令快速创建应用需要的各种零部件"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"远程连接管理服务器"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"部署服务端应用"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"对开发的项目做源代码管理"}]}]},{"type":"element","tag":"h2","props":{"id":"cmderwindows"},"children":[{"type":"text","value":"Cmder（Windows）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cmder 是一款在 Windows 系统中使用的命令行界面。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"我们需要安装一个完整版的 Cmder 作为在 Windows 系统中使用的命令行界面工具。当您在训练视频中听到 “打开终端”，如果您的电脑的操作系统用的是 Windows，就可以打开 cmder。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"官方网站"}]},{"type":"text","value":"："},{"type":"element","tag":"a","props":{"href":"https://cmder.net/","rel":["nofollow","noopener","noreferrer"],"target":"_blank"},"children":[{"type":"text","value":"https://cmder.net/"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Cmder 截图","src":"/images/docs/tools/cmd/cmder.png"},"children":[]}]},{"type":"element","tag":"h3","props":{"id":"安装与使用"},"children":[{"type":"text","value":"安装与使用"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cmder 官方下载完整版的 cmder，将解压之后得到的 cmder 目录放在系统的 Program Files 目录中，然后可以在桌面上创建一个 cmder.exe 的快捷方式。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 cmder，可以右键点击 cmder 或是它的快捷方式，然后选择以 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"管理员身份运行"}]},{"type":"text","value":"，打开以后可以点击右下角的绿色加号小图标，新建一个 Bash as admin 类型的标签窗口，在这个标签窗口输入要执行的命令。"}]},{"type":"element","tag":"h3","props":{"id":"配置文件"},"children":[{"type":"text","value":"配置文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"因为我们会选择使用 Bash as admin 类型的 cmder，对应的配置文件应该是 cmder/config/user_profile.sh，也就是在这个文件里的配置会影响 Bash as admin 类型的 cmder。暂时我们只需要知道这个文件的存在即可。"}]},{"type":"element","tag":"h2","props":{"id":"终端macos"},"children":[{"type":"text","value":"终端（macOS）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端（Terminal）是 macOS 系统中自带的一款命令行界面。在训练视频中，执行命令的时候一般都会在终端下面完成，如果您用的操作系统是 Windows，可以使用 Cmder 代替终端。"}]},{"type":"element","tag":"h3","props":{"id":"使用终端"},"children":[{"type":"text","value":"使用终端"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端是 macOS 系统自带的工具，不需要额外安装，在系统的启动台或者使用聚焦搜索，都可以打开终端，打开以后就可以在上面执行文字命令了。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"打开终端","src":"/images/docs/tools/cmd/open-terminal.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"通过聚焦搜索找到终端"}]}]},{"type":"element","tag":"h3","props":{"id":"偏好设置"},"children":[{"type":"text","value":"偏好设置"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"通过终端的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"偏好设置"}]},{"type":"text","value":"，你可以设置终端使用的主题、字体字号、光标的样式等等。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"打开终端，在终端菜单下面可以打开编好设置（command + ,），然后在描述文件标签的下面，选择使用 Homebrew，字体是 Monaco 18，光标用的是下划线。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"终端的偏好设置","src":"/images/docs/tools/cmd/terminal-profile.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"终端的偏好设置"}]}]},{"type":"element","tag":"h3","props":{"id":"配置文件-1"},"children":[{"type":"text","value":"配置文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"通过用户主目录下的 .zshrc 与 .zprofile 这两个文件可以修改终端的相关配置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"因为文件的名字里是以点开头的，这种文件在系统里默认会被隐藏起来，也就是即使你打开了文件所在的目录，也可能看不到 .zshrc 或 .zprofile 这两个文件。在终端可以使用 vi 或 code（VSCode 编辑器里带的一个命令行工具） 命令打开并编辑这两个文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"使用 vi 命令编辑"}]}]},{"type":"element","tag":"code","props":{"code":"vi ~/.zprofile\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/.zprofile\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会用 vi 编辑器打开当前登录用户主目录下的 .zprofile 文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"使用 code 命令编辑"}]}]},{"type":"element","tag":"code","props":{"code":"code ~/.zprofile\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"code ~/.zprofile\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会使用 VSCode 编辑器打开当前登录用户主目录下的 .zprofile 这个文件。"}]},{"type":"element","tag":"h3","props":{"id":"修改提示符"},"children":[{"type":"text","value":"修改提示符"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"打开终端，在光标左边的东西就是提示符，默认这个提示符看起来可能像下面这样："}]},{"type":"element","tag":"code","props":{"code":"wanghao@wanghaodeMacBook ~ %\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"wanghao@wanghaodeMacBook ~ %\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在提示符里会显示当前登录到系统中的用户（wanghao）与电脑的名字（wanghaodeMacBook），还有当前所在的目录（~），另外在结尾还有一个 % 符号。在训练营的视频内容中，终端的提示符是一个简单的 → 符号，如果你希望使用同样的提示符，可以通过修改 ~/.zshrc 这个文件。"}]},{"type":"element","tag":"code","props":{"code":"vi ~/.zshrc\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/.zshrc\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"vi"}]},{"type":"text","value":" 是一个在命令行界面下使用的文本编辑器，它后面是要编辑的文件的位置，如果文件不存在就会新创建一个。打开以后，先按一下小写的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"i"}]},{"type":"text","value":" 按键，这会打开编辑器的编辑模式，这样就可以编辑文件内容了，在文件中添加下面这行代码："}]},{"type":"element","tag":"code","props":{"code":"PROMPT='→ '\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"PROMPT='→ '\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这行配置的就是终端的命令提示符。完成编辑以后，按一下 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"esc"}]},{"type":"text","value":" 退出编辑模式，再输入 "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":":wq"}]},{"type":"text","value":" 并按下回车*，*这样会保存并且退出文件，注意要在英文状态下输入这些命令。修改了配置文件以后，需要重启终端才能生效，或者可以执行一下 srouce ~/.zshrc，这时你会发现命令提示符就会是我们修改之后的样子了。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"修改了描述文件与提示符之后的终端","src":"/images/docs/tools/cmd/terminal-prompt.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"修改了描述文件与提示符之后的终端"}]}]},{"type":"element","tag":"h2","props":{"id":"常用命令"},"children":[{"type":"text","value":"常用命令"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"下面是几个经常会用到的命令行工具。"}]},{"type":"element","tag":"h3","props":{"id":"pwd输出当前位置"},"children":[{"type":"text","value":"pwd（输出当前位置）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"pwd"}]},{"type":"text","value":" （print working directory）命令可以查看当前所在的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"pwd"}]},{"type":"text","value":" ，得到的结果是一个路径，这个路径是用目录名字加斜线表示的*，*通过这个路径我们就可以知道自己当前所在的位置，这个位置其实就是系统里的某个目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ pwd\n/Users/wanghao/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ pwd\n/Users/wanghao/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 pwd 命令，显示当前所在位置是 /Users/wanghao/desktop。"}]},{"type":"element","tag":"h3","props":{"id":"ls列出资源"},"children":[{"type":"text","value":"ls（列出资源）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"ls（list）命令可以列出指定位置里的资源，也就是列出某个位置里包含的文件与目录。"}]},{"type":"element","tag":"h4","props":{"id":"列出当前位置里的资源"},"children":[{"type":"text","value":"列出当前位置里的资源"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 ls 命令，如果不指定具体位置，就会列出当前所在位置里的东西。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls\nREADME.md    dist        package.json    src ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls\nREADME.md    dist        package.json    src ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"列出指定位置里的资源"},"children":[{"type":"text","value":"列出指定位置里的资源"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 ls 命令的后面可以加上一个具体的位置，这样可以列出这个位置里包含的资源。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls ~/desktop/xuanwu\nREADME.md    dist        package.json    src ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls ~/desktop/xuanwu\nREADME.md    dist        package.json    src ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"列出资源的详细信息"},"children":[{"type":"text","value":"列出资源的详细信息"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果想列出资源更详细的信息，可以配合使用 l（长格式） 与 a（所有） 这两个选项。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls -la\ntotal 832\ndrwxr-xr-x   20 wanghao  staff     640 Feb 25 17:31 .\ndrwxr-xr-x@  59 wanghao  staff    1888 Apr 26 10:50 ..\ndrwxr-xr-x   12 wanghao  staff     384 Apr 26 10:55 .git\n-rw-r--r--    1 wanghao  staff     283 Mar  7 22:15 .gitignore\n-rw-r--r--    1 wanghao  staff     315 Mar  7 22:15 README.md\ndrwxr-xr-x@   8 wanghao  staff     256 Feb  5 09:41 dist\ndrwxr-xr-x  860 wanghao  staff   27520 Jan 24 09:01 node_modules\n-rw-r--r--    1 wanghao  staff    1580 May  5 09:45 package.json\ndrwxr-xr-x   22 wanghao  staff     704 May  5 09:45 src\n...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls -la\ntotal 832\ndrwxr-xr-x   20 wanghao  staff     640 Feb 25 17:31 .\ndrwxr-xr-x@  59 wanghao  staff    1888 Apr 26 10:50 ..\ndrwxr-xr-x   12 wanghao  staff     384 Apr 26 10:55 .git\n-rw-r--r--    1 wanghao  staff     283 Mar  7 22:15 .gitignore\n-rw-r--r--    1 wanghao  staff     315 Mar  7 22:15 README.md\ndrwxr-xr-x@   8 wanghao  staff     256 Feb  5 09:41 dist\ndrwxr-xr-x  860 wanghao  staff   27520 Jan 24 09:01 node_modules\n-rw-r--r--    1 wanghao  staff    1580 May  5 09:45 package.json\ndrwxr-xr-x   22 wanghao  staff     704 May  5 09:45 src\n...\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 l 选项会用长格式显示资源，每一行是一个资源（文件或目录），每一栏分别表示不同的东西，比如 drwxr-xr-x 表示的是资源的权限，wanghao 是资源的拥有者，staff 表示资源所属的用户组。使用了 a 这个选项以后会列出所有资源（包含隐藏文件），比如 .git 与 .gitignore，这两个文件的名字是以点开头的，在不使用 a 选项的情况下，列出资源时是不会显示这种文件的。"}]},{"type":"element","tag":"h3","props":{"id":"cd改变当前位置"},"children":[{"type":"text","value":"cd（改变当前位置）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cd（change directory）命令可以改变当前位置，也就是进入到系统的某个目录的下面。"}]},{"type":"element","tag":"h4","props":{"id":"进入到某个位置"},"children":[{"type":"text","value":"进入到某个位置"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cd 命令的后面加上一个具体的路径，可以进入到这个指定的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cd ~/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ~/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"~/desktop 是一个路径，这里的 ~（"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"波浪号"}]},{"type":"text","value":"）指的位置就是用户的主目录。执行上面这行命令可以进入到用户主目录下面的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"desktop"}]},{"type":"text","value":" 这个目录里面，这个目录里的东西默认会出现在你的电脑桌面上。 确定当前所在位置可以用 pwd 命令，列出当前位置里的资源可以执行 ls 命令。"}]},{"type":"element","tag":"h4","props":{"id":"回到上一级目录"},"children":[{"type":"text","value":"回到上一级目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cd 命令的后面加上 ../，可以进入到当前目录的上一级目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cd ../\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ../\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"../"}]},{"type":"text","value":"（"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"两个点加一条斜线"}]},{"type":"text","value":"）表示的是上一级目录，比如当前位置是在 /Users/wanghao/desktop*，*对于这个位置来说，它的上一级目录就是 /Users/wanghao。这样如果执行 cd ../ 以后，用 pwd 输出当前的位置，得到的结果会显示当前是在 /Users/wanghao 这个位置上。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"../../"}]},{"type":"text","value":" 表示的是上一级目录的上一级目录， "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"./"}]},{"type":"text","value":" 一个点加一条斜线表示的是当前目录。"}]},{"type":"element","tag":"h3","props":{"id":"mkdir创建目录"},"children":[{"type":"text","value":"mkdir（创建目录）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"mkdir（make directory）命令可以创建目录。"}]},{"type":"element","tag":"h4","props":{"id":"在当前位置创建目录"},"children":[{"type":"text","value":"在当前位置创建目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 mkdir 命令的后面加上要创建的目录的名字，可以创建一个目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"mkdir xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"mkdir xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面命令会在当前目录下创建一个叫 xuanwu 的目录。"}]},{"type":"element","tag":"h4","props":{"id":"在指定位置创建目录"},"children":[{"type":"text","value":"在指定位置创建目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 mkdir 命令的后面可以加上要创建的目录的具体位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"mkdir -p ~/desktop/projects/xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"mkdir -p ~/desktop/projects/xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"注意上面我们在命令里用了一个 p 选项，如果不用这个选项必须要保证新目录的父目录是存在的，也就是在桌面上应该有个 projects 目录，这样才能正常地创建 xuanwu 这个目录，如果 projects 这个目录不存在，执行命令时就会报错：No such file or directory。用了 p 选项以后，如果需要的目录不存在就会自动创建需要的目录。"}]},{"type":"element","tag":"h3","props":{"id":"cp复制"},"children":[{"type":"text","value":"cp（复制）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cp（copy）命令可以复制文件或目录。"}]},{"type":"element","tag":"h4","props":{"id":"复制文件"},"children":[{"type":"text","value":"复制文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 cp 命令的时候需要提供想要复制的文件与复制到的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cp assets/example.env .env\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cp assets/example.env .env\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这行命令会复制当前位置里的 assets 目录里的 example.env 这个文件，复制到的位置是当前目录，名字叫 .env。也就是在当前目录下应该会有一个 .env 文件，这个文件就是 assets/example.env 的复制品。"}]},{"type":"element","tag":"h4","props":{"id":"复制目录"},"children":[{"type":"text","value":"复制目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 cp 命令复制目录的时候需要加上 R 选项，这样可以复制指定的目录以及它里面包含的所有东西。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cp -R config ../config_bak\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cp -R config ../config_bak\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令会复制当前位置里的 config 这个目录（包含目录里的所有文件与目录），将复制品放在上一级目录里，名字是 config_bak。"}]},{"type":"element","tag":"h3","props":{"id":"rm删除"},"children":[{"type":"text","value":"rm（删除）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"rm（remove）命令可以删除文件或目录。"}]},{"type":"element","tag":"h4","props":{"id":"删除文件"},"children":[{"type":"text","value":"删除文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 rm 命令删除文件时，需要提供要删除的文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"rm package-lock.json\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"rm package-lock.json\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令会将当前目录下的 package-lock.json 这个文件删除掉。"}]},{"type":"element","tag":"h4","props":{"id":"删除目录"},"children":[{"type":"text","value":"删除目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 rm 命令删除目录时可以提供 r（递归） 与 f（强制） 这两个选项，这样会强制将指定目录以及它里面包含的全部东西一块删除掉。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"rm -rf ~/desktop/nid-node/node_modules\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"rm -rf ~/desktop/nid-node/node_modules\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令，会强制将桌面上的 nid-node 目录里的 node_modules 这个目录以及它里面包含的东西全部都删除掉。"}]},{"type":"element","tag":"h3","props":{"id":"vi命令行编辑器"},"children":[{"type":"text","value":"vi（命令行编辑器）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"vi（visual）是一个在命令行界面下使用的编辑器，可以用它编辑或创建文本文件。"}]},{"type":"element","tag":"h4","props":{"id":"打开编辑器"},"children":[{"type":"text","value":"打开编辑器"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 vi 命令的后面加上要编辑的文件的具体位置，执行以后就会用 vi 编辑器打开指定的文件。如果要编辑当前目录下的文件，可以直接输入文件的名字。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"vi ~/desktop/xuanwu/README.md\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/desktop/xuanwu/README.md\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 vi 编辑的文件可以不存在，但要保证文件所在目录是存在的，如果目录不存在，保存文件时就会报错：Can't open file for writing。所以在用 vi 编辑或创建文件之前，先保存文件目录是存在的，如果不存在，可以使用 mkdir 命令创建所需目录。"}]},{"type":"element","tag":"h4","props":{"id":"编辑文件"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"编辑文件"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 vi 编辑文件内容，需要打开编辑模式，按一下 i 按键可以打开编辑模式，这时窗口底部会显示 — INSERT —，完成编辑以后按 esc 按键可以退出编辑模式。"}]},{"type":"element","tag":"h4","props":{"id":"保存文件并退出"},"children":[{"type":"text","value":"保存文件并退出"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"编辑了文件内容以后，如果想要保存对文件的修改并退出 vi 编辑器，先确定当前在正常模式下，按 esc 可以退出其它模式回到正常模式，然后执行："}]},{"type":"element","tag":"code","props":{"code":":wq\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":":wq\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"w 表示写入，q 表示退出，输入 "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":":wq"}]},{"type":"text","value":" 以后按下回车，这样就会保存对文件的修改，然后关掉 vi 编辑器。"}]},{"type":"element","tag":"h4","props":{"id":"放弃修改直接强制退出"},"children":[{"type":"text","value":"放弃修改直接强制退出"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果不想保存对文件的修改，打算强制退出 vi 编辑器，可以执行："}]},{"type":"element","tag":"code","props":{"code":":q!\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":":q!\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"q 表示退出，! 表示强制。"}]},{"type":"element","tag":"h4","props":{"id":"翻页查看文件"},"children":[{"type":"text","value":"翻页查看文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"按 ctrl + f 按键可以向下翻页查看文件，按 ctrl + b 按键可以向上翻页查看文件。"}]},{"type":"element","tag":"h4","props":{"id":"搜索文件内容"},"children":[{"type":"text","value":"搜索文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在正常模式下，输入 /，后面加上要搜索的关键词，按下回车，可以搜索并定位到当前文件包含指定关键词的地方。按 n 可以定位到下一个匹配的地方，按 N 可以定位到上一个匹配的地方。"}]},{"type":"element","tag":"h3","props":{"id":"cat输出文件内容"},"children":[{"type":"text","value":"cat（输出文件内容）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cat（concatenate）命令可以将多个文件合并成一个文件，也可以输出指定文件里的内容。"}]},{"type":"element","tag":"h4","props":{"id":"输出文件内容"},"children":[{"type":"text","value":"输出文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cat 命令的后面提供要查看内容的文件，可以输出这个文件里的内容。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cat ~/.ssh/id_rsa.pub\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cat ~/.ssh/id_rsa.pub\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这行命令会输出在用户主目录下的 .ssh 目录里的 id_rsa.pub 这个文件里的内容。"}]},{"type":"element","tag":"h2","props":{"id":"相关概念"},"children":[{"type":"text","value":"相关概念"}]},{"type":"element","tag":"h3","props":{"id":"终端"},"children":[{"type":"text","value":"终端"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端就是一种命令行界面工具，当您在训练营中听到或看到 “在终端” 或 “打开终端” 时，Windows 用户可以打开 cmder，macOS 用户可以打开系统自带的终端。"}]},{"type":"element","tag":"h3","props":{"id":"用户主目录"},"children":[{"type":"text","value":"用户主目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在操作系统里的用户一般都有一个主目录，这个目录的位置在不同的操作系统里是不一样的，比如在 macOS 系统里，wanghao 这个用户的主目录的位置应该是 /Users/wanghao，在 Ubuntu 系统里，wanghao 这个用户的主目录应该是在 /home/wanghao。"}]},{"type":"element","tag":"h4","props":{"id":"进入用户主目录"},"children":[{"type":"text","value":"进入用户主目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端可以使用 ~（波浪号）表示当前用户的主目录所在的位置，比如在 macOS 系统里，当前登录的用户如果是 wanghao，这个 ~ 表示的位置应该就是 /Users/wanghao，所以进入到这个位置，可以执行："}]},{"type":"element","tag":"code","props":{"code":"cd ~\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ~\n"}]}]}]},{"type":"element","tag":"h3","props":{"id":"根目录"},"children":[{"type":"text","value":"根目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"根目录指的是某个地方的第一级别的目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"比如一个项目的位置是 ~/desktop/nid-node，对于这个项目来说，它的根目录指的就是 ~/desktop/nid-node。如果我们在这个项目的根目录下创建了一个 README.md 文件，那这个文件的位置应该就是 ~/desktop/nid-node/README.md。"}]},{"type":"element","tag":"h4","props":{"id":"系统根目录"},"children":[{"type":"text","value":"系统根目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 macOS 与 Linux 类型的操作系统里，系统的根目录指的是 / 这个位置，比如执行 cd / 命令，会进入到系统根目录的下面。/Users 这个路径，可以描述为系统根目录下面的 Users 这个目录。"}]},{"type":"element","tag":"h3","props":{"id":"路径"},"children":[{"type":"text","value":"路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"路径可以用来表示在操作系统里的一个目录或文件的位置，路径由目录与斜线组成，如果是表示文件的路径，在路径中还会包含文件的名字。"}]},{"type":"element","tag":"h4","props":{"id":"目录的路径"},"children":[{"type":"text","value":"目录的路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"表示目录的路径由目录的名字与斜线组成。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这个路径从系统的根目录开始，这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录。"}]},{"type":"element","tag":"h4","props":{"id":"文件的路径"},"children":[{"type":"text","value":"文件的路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"表示文件的路径由目录的名字、斜线与文件组成。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这个路径从系统的根目录开始，这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录里的 src 目录里的 main.ts 这个文件。也就是 main.ts 这个文件在 src 目录的下面，src 在 xuanwu 的下面，xuanwu 在 desktop 目录里，desktop 在 wanghao 这个目录里，wanghao 在 Users 这个目录里，Users 这个目录在系统的根目录的下面。"}]},{"type":"element","tag":"h4","props":{"id":"相对路径"},"children":[{"type":"text","value":"相对路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"相对路径指的是相对于当前位置的路径。相对路径表示的实际位置，会随着当前位置的变化而变化。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"src/main.ts\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"相对路径不以系统根目录（/）开始。描述上面这个相对路径，可以说当前目录下的 src 目录里的 main.ts。如果当前位置是 /Users/wanghao/desktop/xuanwu，相对于这个位置，上面这个路径在系统中的实际位置应该就是："}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"绝对路径"},"children":[{"type":"text","value":"绝对路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"绝对路径指的就是一个目录或文件在系统中的实际位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"绝对路径会从系统的根目录开始。描述上面这个绝对路径，可以说在系统根目录下的 Users 里的 wanghao 里的 desktop 这个目录。"}]},{"type":"element","tag":"h3","props":{"id":"环境变量"},"children":[{"type":"text","value":"环境变量"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"环境变量（environment variables）就是在系统环境中存在的一些变量，程序可以读取这些环境变量并获取到它们的值。"}]},{"type":"element","tag":"h4","props":{"id":"查看环境变量"},"children":[{"type":"text","value":"查看环境变量"}]},{"type":"element","tag":"code","props":{"code":"printenv\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"printenv\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端执行 printenv 命令可以输出当前已有的一些环境变量以及它们对应的值。环境变量的名字一般全部使用大写字母，等号右边是环境变量对应的值。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"LANG=zh_CN.UTF-8\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"LANG=zh_CN.UTF-8\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"LANG 是环境变量的名字，zh*CN.UTF-8 是 LANG 这个环境变量对应的值。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"在 Windows 系统中通过 Cmder 执行 printenv 命令","src":"/images/docs/tools/cmd/cmder-printenv.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"在 Windows 系统中通过 Cmder 执行 printenv 命令"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"在 macOS 系统中通过终端执行 printenv 命令","src":"/images/docs/tools/cmd/terminal-printenv.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"*在 macOS 系统中通过终端执行 printenv 命令_"}]},{"type":"element","tag":"h4","props":{"id":"设置环境变量"},"children":[{"type":"text","value":"设置环境变量"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端，执行 export 命令可以添加环境变量，被添加的环境变量只能在当前这个终端标签里使用。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"export MACHINE_NAME=玄武\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"export MACHINE_NAME=玄武\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会添加一个环境变量叫 MACHINE*NAME，它的值是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"玄武"}]},{"type":"text","value":"。这样在当前这个终端标签里运行的程序，都可以读取到 MACHINE_NAME 这个环境变量，得到的值就是 *玄武_ 。执行 printenv 可以确定一下是否包含了 MACHINE_NAME 这个环境变量。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"关掉这个终端标签，重新再打开，之前设置的环境变量就不见了。如果你希望每次打开终端的时候自动设置一些环境变量，可以将设置环境变量用的命令添加到终端的配置文件里，在 macOS 系统里就是 ~/.zprofile，Windows 系统里是 cmder/config/user-profile.sh。"}]},{"type":"element","tag":"h3","props":{"id":"path"},"children":[{"type":"text","value":"PATH"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"PATH 是一个环境变量，它的值是一组路径，在终端执行命令的时候，会在这些路径里查找是否包含要执行的命令程序。"}]},{"type":"element","tag":"h4","props":{"id":"输出-path-的值"},"children":[{"type":"text","value":"输出 PATH 的值"}]},{"type":"element","tag":"code","props":{"code":"printenv PATH\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"printenv PATH\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"得到的结果应该是一组路径，不同的路径之间会用冒号分隔开，在这些路径里都会包含一些可以执行的命令程序。"}]},{"type":"element","tag":"code","props":{"code":"/usr/local/bin:/usr/bin:/bin: ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/usr/local/bin:/usr/bin:/bin: ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"设置-path-的值"},"children":[{"type":"text","value":"设置 PATH 的值"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"安装了软件以后，可能会包含一些命令行工具，如果想在终端直接使用它们，需要将包含这些命令行工具的目录添加到 PATH 里。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"export PATH=$PATH:/Applications/flutter/bin\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"export PATH=$PATH:/Applications/flutter/bin\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端的配置文件里添加上面这行代码，结果就是在 PATH 这个环境变量里添加了一个新的路径，位置是 /Applications/flutter/bin，也就是在这个位置里包含的命令行工具，以后都可以直接在终端执行。这里的 $PATH 引用的是原来的 PATH 这个环境变量的值。"}]},{"type":"element","tag":"h2","props":{"id":"钥匙"},"children":[{"type":"text","value":"钥匙"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"钥匙（keys）是加密解密用的东西（文本文件），在训练营中，向远程仓库推送代码的时候，登录管理远程服务器的时候都会用到在本地电脑里存放的钥匙。钥匙一般都成对出现，一个密钥（private key）对应一个公钥（public key）。我们可以给当前登录到系统的用户生成一对钥匙，其中密钥是私密的，决对不能交给别人，但是公钥可以放心交到其它地方使用。"}]},{"type":"element","tag":"h3","props":{"id":"生成钥匙对"},"children":[{"type":"text","value":"生成钥匙对"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"当前用户的钥匙对会放在用户主目录下的 .ssh 这个目录里，你可以先确定一下是否已经为当前用户生成了钥匙对。"}]},{"type":"element","tag":"code","props":{"code":"ls ~/.ssh\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ls ~/.ssh\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令，如果发现用户主目录下的 .ssh 里面，有 id_rsa（密钥） 与 id_rsa.pub（公钥） 这两个文件，说明当前用户已经拥有了钥匙对。如果没有这两个文件，可以执行 ssh-keygen 命令生成它们。"}]},{"type":"element","tag":"code","props":{"code":"ssh-keygen\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ssh-keygen\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端，执行 ssh-keygen 命令，并一路回车，完成以后就会在用户主目录下的 .ssh 目录里生成一对钥匙。这个命令只需要执行一次，重复执行会覆盖掉之前生成的钥匙对。"}]},{"type":"element","tag":"h3","props":{"id":"查看公钥文件内容"},"children":[{"type":"text","value":"查看公钥文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在配置三方服务使用钥匙验证身份的时候，我们需要复制用户的公钥文件里的内容。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"查看公钥文件里的内容可以执行："}]},{"type":"element","tag":"code","props":{"code":"cat ~/.ssh/id_rsa.pub\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cat ~/.ssh/id_rsa.pub\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"输出的内容看起来像这样："}]},{"type":"element","tag":"code","props":{"code":"ssh-rsa AAAAB3NzaC1yc2EAAX...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ssh-rsa AAAAB3NzaC1yc2EAAX...\n"}]}]}]},{"type":"element","tag":"h2","props":{"id":"技巧"},"children":[{"type":"text","value":"技巧"}]},{"type":"element","tag":"h3","props":{"id":"知道命令来自哪里"},"children":[{"type":"text","value":"知道命令来自哪里"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果你想知道一个命令行工具到底在哪儿，可以用 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"which"}]},{"type":"text","value":" 命令，比如我想知道 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ls"}]},{"type":"text","value":" 这个命令行工具的位置，可以执行："}]},{"type":"element","tag":"code","props":{"code":"which ls\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"which ls\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"得到的结果就是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ls"}]},{"type":"text","value":" 这个命令行工具的位置，具体在哪取决于你的操作系统。在 macOS 系统里，这个工具是在 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/bin/ls"}]},{"type":"text","value":" 。在 Windows 系统里，如果你用的是 bash 类型的 Cmder，会显示这个工具的位置是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin/ls"}]},{"type":"text","value":" 。"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"usr"}]},{"type":"text","value":" 一般表示的是 user，也就是用户的意思，"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"bin"}]},{"type":"text","value":" 这个目录里通常包含的是一些可以执行的程序。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"这个 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin"}]},{"type":"text","value":" 应该是 Cmder 设置的一个目录的别名，因为在 Windows 系统里并没有这个地方，实际的位置应该是 Cmder 里的某个目录的下面。在我的系统里，"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin"}]},{"type":"text","value":" 真正的位置是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/C/Program\\ Files/cmder/vendor/git-for-windows/usr/bin"}]},{"type":"text","value":" ，进入到这个目录的下面，列出目录里的资源，你会发现一些 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":".exe"}]},{"type":"text","value":" 后缀的文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 Windows 系统里，带这种 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":".exe"}]},{"type":"text","value":" 后缀的文件就是可执行的程序。在后面我们会用到这里面的一些命令行工具，比如远程连接服务器用的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" ，生成密钥文件用的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh-keygen"}]},{"type":"text","value":" 等等。Windows 系统默认都不带这些东西，这也是我们为什么要用 Cmder 来代替 Windows 系统自带的命令行界面。"}]},{"type":"element","tag":"h3","props":{"id":"获取命令的帮助信息"},"children":[{"type":"text","value":"获取命令的帮助信息"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果你了解某个命令行工具的用法，可以在命令的后面加上 help 选项，比如："}]},{"type":"element","tag":"code","props":{"code":"ls --help\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ls --help\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果命令不提供 help 这个选项，可以试着用 man（manual） 命令查看命令的使用说明，比如："}]},{"type":"element","tag":"code","props":{"code":"man ls\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"man ls\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"命令的说明文档可能会分页显示，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":" 键可以向后翻页，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" 键可以向前翻页，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"q"}]},{"type":"text","value":" 键可以退出文档。"}]}]},"body":{"type":"root","children":[{"type":"element","tag":"h1","props":{"id":"命令行界面"},"children":[{"type":"text","value":"命令行界面"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在宁皓独立开发者训练营中，有些训练任务需要在命令行界面下完成。Windows 用户可以安装一个 Cmder，macOS 用户可以使用系统自带的终端作为命令行界面。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在训练任务中需要使用在命令行界面下做的一些事情："}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"使用命令创建应用"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"启动应用在本地的开发服务"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"安装项目需要的功能包"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"执行命令快速创建应用需要的各种零部件"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"远程连接管理服务器"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"部署服务端应用"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"对开发的项目做源代码管理"}]}]},{"type":"element","tag":"h2","props":{"id":"cmderwindows"},"children":[{"type":"text","value":"Cmder（Windows）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cmder 是一款在 Windows 系统中使用的命令行界面。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"我们需要安装一个完整版的 Cmder 作为在 Windows 系统中使用的命令行界面工具。当您在训练视频中听到 “打开终端”，如果您的电脑的操作系统用的是 Windows，就可以打开 cmder。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"官方网站"}]},{"type":"text","value":"："},{"type":"element","tag":"a","props":{"href":"https://cmder.net/","rel":["nofollow","noopener","noreferrer"],"target":"_blank"},"children":[{"type":"text","value":"https://cmder.net/"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Cmder 截图","src":"/images/docs/tools/cmd/cmder.png"},"children":[]}]},{"type":"element","tag":"h3","props":{"id":"安装与使用"},"children":[{"type":"text","value":"安装与使用"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cmder 官方下载完整版的 cmder，将解压之后得到的 cmder 目录放在系统的 Program Files 目录中，然后可以在桌面上创建一个 cmder.exe 的快捷方式。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 cmder，可以右键点击 cmder 或是它的快捷方式，然后选择以 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"管理员身份运行"}]},{"type":"text","value":"，打开以后可以点击右下角的绿色加号小图标，新建一个 Bash as admin 类型的标签窗口，在这个标签窗口输入要执行的命令。"}]},{"type":"element","tag":"h3","props":{"id":"配置文件"},"children":[{"type":"text","value":"配置文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"因为我们会选择使用 Bash as admin 类型的 cmder，对应的配置文件应该是 cmder/config/user_profile.sh，也就是在这个文件里的配置会影响 Bash as admin 类型的 cmder。暂时我们只需要知道这个文件的存在即可。"}]},{"type":"element","tag":"h2","props":{"id":"终端macos"},"children":[{"type":"text","value":"终端（macOS）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端（Terminal）是 macOS 系统中自带的一款命令行界面。在训练视频中，执行命令的时候一般都会在终端下面完成，如果您用的操作系统是 Windows，可以使用 Cmder 代替终端。"}]},{"type":"element","tag":"h3","props":{"id":"使用终端"},"children":[{"type":"text","value":"使用终端"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端是 macOS 系统自带的工具，不需要额外安装，在系统的启动台或者使用聚焦搜索，都可以打开终端，打开以后就可以在上面执行文字命令了。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"打开终端","src":"/images/docs/tools/cmd/open-terminal.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"通过聚焦搜索找到终端"}]}]},{"type":"element","tag":"h3","props":{"id":"偏好设置"},"children":[{"type":"text","value":"偏好设置"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"通过终端的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"偏好设置"}]},{"type":"text","value":"，你可以设置终端使用的主题、字体字号、光标的样式等等。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"打开终端，在终端菜单下面可以打开编好设置（command + ,），然后在描述文件标签的下面，选择使用 Homebrew，字体是 Monaco 18，光标用的是下划线。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"终端的偏好设置","src":"/images/docs/tools/cmd/terminal-profile.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"终端的偏好设置"}]}]},{"type":"element","tag":"h3","props":{"id":"配置文件-1"},"children":[{"type":"text","value":"配置文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"通过用户主目录下的 .zshrc 与 .zprofile 这两个文件可以修改终端的相关配置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"因为文件的名字里是以点开头的，这种文件在系统里默认会被隐藏起来，也就是即使你打开了文件所在的目录，也可能看不到 .zshrc 或 .zprofile 这两个文件。在终端可以使用 vi 或 code（VSCode 编辑器里带的一个命令行工具） 命令打开并编辑这两个文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"使用 vi 命令编辑"}]}]},{"type":"element","tag":"code","props":{"code":"vi ~/.zprofile\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/.zprofile\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会用 vi 编辑器打开当前登录用户主目录下的 .zprofile 文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"使用 code 命令编辑"}]}]},{"type":"element","tag":"code","props":{"code":"code ~/.zprofile\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"code ~/.zprofile\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会使用 VSCode 编辑器打开当前登录用户主目录下的 .zprofile 这个文件。"}]},{"type":"element","tag":"h3","props":{"id":"修改提示符"},"children":[{"type":"text","value":"修改提示符"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"打开终端，在光标左边的东西就是提示符，默认这个提示符看起来可能像下面这样："}]},{"type":"element","tag":"code","props":{"code":"wanghao@wanghaodeMacBook ~ %\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"wanghao@wanghaodeMacBook ~ %\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在提示符里会显示当前登录到系统中的用户（wanghao）与电脑的名字（wanghaodeMacBook），还有当前所在的目录（~），另外在结尾还有一个 % 符号。在训练营的视频内容中，终端的提示符是一个简单的 → 符号，如果你希望使用同样的提示符，可以通过修改 ~/.zshrc 这个文件。"}]},{"type":"element","tag":"code","props":{"code":"vi ~/.zshrc\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/.zshrc\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"vi"}]},{"type":"text","value":" 是一个在命令行界面下使用的文本编辑器，它后面是要编辑的文件的位置，如果文件不存在就会新创建一个。打开以后，先按一下小写的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"i"}]},{"type":"text","value":" 按键，这会打开编辑器的编辑模式，这样就可以编辑文件内容了，在文件中添加下面这行代码："}]},{"type":"element","tag":"code","props":{"code":"PROMPT='→ '\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"PROMPT='→ '\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这行配置的就是终端的命令提示符。完成编辑以后，按一下 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"esc"}]},{"type":"text","value":" 退出编辑模式，再输入 "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":":wq"}]},{"type":"text","value":" 并按下回车*，*这样会保存并且退出文件，注意要在英文状态下输入这些命令。修改了配置文件以后，需要重启终端才能生效，或者可以执行一下 srouce ~/.zshrc，这时你会发现命令提示符就会是我们修改之后的样子了。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"修改了描述文件与提示符之后的终端","src":"/images/docs/tools/cmd/terminal-prompt.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"修改了描述文件与提示符之后的终端"}]}]},{"type":"element","tag":"h2","props":{"id":"常用命令"},"children":[{"type":"text","value":"常用命令"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"下面是几个经常会用到的命令行工具。"}]},{"type":"element","tag":"h3","props":{"id":"pwd输出当前位置"},"children":[{"type":"text","value":"pwd（输出当前位置）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"pwd"}]},{"type":"text","value":" （print working directory）命令可以查看当前所在的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"pwd"}]},{"type":"text","value":" ，得到的结果是一个路径，这个路径是用目录名字加斜线表示的*，*通过这个路径我们就可以知道自己当前所在的位置，这个位置其实就是系统里的某个目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ pwd\n/Users/wanghao/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ pwd\n/Users/wanghao/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 pwd 命令，显示当前所在位置是 /Users/wanghao/desktop。"}]},{"type":"element","tag":"h3","props":{"id":"ls列出资源"},"children":[{"type":"text","value":"ls（列出资源）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"ls（list）命令可以列出指定位置里的资源，也就是列出某个位置里包含的文件与目录。"}]},{"type":"element","tag":"h4","props":{"id":"列出当前位置里的资源"},"children":[{"type":"text","value":"列出当前位置里的资源"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 ls 命令，如果不指定具体位置，就会列出当前所在位置里的东西。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls\nREADME.md    dist        package.json    src ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls\nREADME.md    dist        package.json    src ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"列出指定位置里的资源"},"children":[{"type":"text","value":"列出指定位置里的资源"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 ls 命令的后面可以加上一个具体的位置，这样可以列出这个位置里包含的资源。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls ~/desktop/xuanwu\nREADME.md    dist        package.json    src ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls ~/desktop/xuanwu\nREADME.md    dist        package.json    src ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"列出资源的详细信息"},"children":[{"type":"text","value":"列出资源的详细信息"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果想列出资源更详细的信息，可以配合使用 l（长格式） 与 a（所有） 这两个选项。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"→ ls -la\ntotal 832\ndrwxr-xr-x   20 wanghao  staff     640 Feb 25 17:31 .\ndrwxr-xr-x@  59 wanghao  staff    1888 Apr 26 10:50 ..\ndrwxr-xr-x   12 wanghao  staff     384 Apr 26 10:55 .git\n-rw-r--r--    1 wanghao  staff     283 Mar  7 22:15 .gitignore\n-rw-r--r--    1 wanghao  staff     315 Mar  7 22:15 README.md\ndrwxr-xr-x@   8 wanghao  staff     256 Feb  5 09:41 dist\ndrwxr-xr-x  860 wanghao  staff   27520 Jan 24 09:01 node_modules\n-rw-r--r--    1 wanghao  staff    1580 May  5 09:45 package.json\ndrwxr-xr-x   22 wanghao  staff     704 May  5 09:45 src\n...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"→ ls -la\ntotal 832\ndrwxr-xr-x   20 wanghao  staff     640 Feb 25 17:31 .\ndrwxr-xr-x@  59 wanghao  staff    1888 Apr 26 10:50 ..\ndrwxr-xr-x   12 wanghao  staff     384 Apr 26 10:55 .git\n-rw-r--r--    1 wanghao  staff     283 Mar  7 22:15 .gitignore\n-rw-r--r--    1 wanghao  staff     315 Mar  7 22:15 README.md\ndrwxr-xr-x@   8 wanghao  staff     256 Feb  5 09:41 dist\ndrwxr-xr-x  860 wanghao  staff   27520 Jan 24 09:01 node_modules\n-rw-r--r--    1 wanghao  staff    1580 May  5 09:45 package.json\ndrwxr-xr-x   22 wanghao  staff     704 May  5 09:45 src\n...\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 l 选项会用长格式显示资源，每一行是一个资源（文件或目录），每一栏分别表示不同的东西，比如 drwxr-xr-x 表示的是资源的权限，wanghao 是资源的拥有者，staff 表示资源所属的用户组。使用了 a 这个选项以后会列出所有资源（包含隐藏文件），比如 .git 与 .gitignore，这两个文件的名字是以点开头的，在不使用 a 选项的情况下，列出资源时是不会显示这种文件的。"}]},{"type":"element","tag":"h3","props":{"id":"cd改变当前位置"},"children":[{"type":"text","value":"cd（改变当前位置）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cd（change directory）命令可以改变当前位置，也就是进入到系统的某个目录的下面。"}]},{"type":"element","tag":"h4","props":{"id":"进入到某个位置"},"children":[{"type":"text","value":"进入到某个位置"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cd 命令的后面加上一个具体的路径，可以进入到这个指定的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cd ~/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ~/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"~/desktop 是一个路径，这里的 ~（"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"波浪号"}]},{"type":"text","value":"）指的位置就是用户的主目录。执行上面这行命令可以进入到用户主目录下面的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"desktop"}]},{"type":"text","value":" 这个目录里面，这个目录里的东西默认会出现在你的电脑桌面上。 确定当前所在位置可以用 pwd 命令，列出当前位置里的资源可以执行 ls 命令。"}]},{"type":"element","tag":"h4","props":{"id":"回到上一级目录"},"children":[{"type":"text","value":"回到上一级目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cd 命令的后面加上 ../，可以进入到当前目录的上一级目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cd ../\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ../\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"../"}]},{"type":"text","value":"（"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"两个点加一条斜线"}]},{"type":"text","value":"）表示的是上一级目录，比如当前位置是在 /Users/wanghao/desktop*，*对于这个位置来说，它的上一级目录就是 /Users/wanghao。这样如果执行 cd ../ 以后，用 pwd 输出当前的位置，得到的结果会显示当前是在 /Users/wanghao 这个位置上。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"../../"}]},{"type":"text","value":" 表示的是上一级目录的上一级目录， "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"./"}]},{"type":"text","value":" 一个点加一条斜线表示的是当前目录。"}]},{"type":"element","tag":"h3","props":{"id":"mkdir创建目录"},"children":[{"type":"text","value":"mkdir（创建目录）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"mkdir（make directory）命令可以创建目录。"}]},{"type":"element","tag":"h4","props":{"id":"在当前位置创建目录"},"children":[{"type":"text","value":"在当前位置创建目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 mkdir 命令的后面加上要创建的目录的名字，可以创建一个目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"mkdir xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"mkdir xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面命令会在当前目录下创建一个叫 xuanwu 的目录。"}]},{"type":"element","tag":"h4","props":{"id":"在指定位置创建目录"},"children":[{"type":"text","value":"在指定位置创建目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 mkdir 命令的后面可以加上要创建的目录的具体位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"mkdir -p ~/desktop/projects/xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"mkdir -p ~/desktop/projects/xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"注意上面我们在命令里用了一个 p 选项，如果不用这个选项必须要保证新目录的父目录是存在的，也就是在桌面上应该有个 projects 目录，这样才能正常地创建 xuanwu 这个目录，如果 projects 这个目录不存在，执行命令时就会报错：No such file or directory。用了 p 选项以后，如果需要的目录不存在就会自动创建需要的目录。"}]},{"type":"element","tag":"h3","props":{"id":"cp复制"},"children":[{"type":"text","value":"cp（复制）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cp（copy）命令可以复制文件或目录。"}]},{"type":"element","tag":"h4","props":{"id":"复制文件"},"children":[{"type":"text","value":"复制文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 cp 命令的时候需要提供想要复制的文件与复制到的位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cp assets/example.env .env\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cp assets/example.env .env\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这行命令会复制当前位置里的 assets 目录里的 example.env 这个文件，复制到的位置是当前目录，名字叫 .env。也就是在当前目录下应该会有一个 .env 文件，这个文件就是 assets/example.env 的复制品。"}]},{"type":"element","tag":"h4","props":{"id":"复制目录"},"children":[{"type":"text","value":"复制目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 cp 命令复制目录的时候需要加上 R 选项，这样可以复制指定的目录以及它里面包含的所有东西。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cp -R config ../config_bak\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cp -R config ../config_bak\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令会复制当前位置里的 config 这个目录（包含目录里的所有文件与目录），将复制品放在上一级目录里，名字是 config_bak。"}]},{"type":"element","tag":"h3","props":{"id":"rm删除"},"children":[{"type":"text","value":"rm（删除）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"rm（remove）命令可以删除文件或目录。"}]},{"type":"element","tag":"h4","props":{"id":"删除文件"},"children":[{"type":"text","value":"删除文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行 rm 命令删除文件时，需要提供要删除的文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"rm package-lock.json\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"rm package-lock.json\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令会将当前目录下的 package-lock.json 这个文件删除掉。"}]},{"type":"element","tag":"h4","props":{"id":"删除目录"},"children":[{"type":"text","value":"删除目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 rm 命令删除目录时可以提供 r（递归） 与 f（强制） 这两个选项，这样会强制将指定目录以及它里面包含的全部东西一块删除掉。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"rm -rf ~/desktop/nid-node/node_modules\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"rm -rf ~/desktop/nid-node/node_modules\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这个命令，会强制将桌面上的 nid-node 目录里的 node_modules 这个目录以及它里面包含的东西全部都删除掉。"}]},{"type":"element","tag":"h3","props":{"id":"vi命令行编辑器"},"children":[{"type":"text","value":"vi（命令行编辑器）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"vi（visual）是一个在命令行界面下使用的编辑器，可以用它编辑或创建文本文件。"}]},{"type":"element","tag":"h4","props":{"id":"打开编辑器"},"children":[{"type":"text","value":"打开编辑器"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 vi 命令的后面加上要编辑的文件的具体位置，执行以后就会用 vi 编辑器打开指定的文件。如果要编辑当前目录下的文件，可以直接输入文件的名字。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"vi ~/desktop/xuanwu/README.md\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"vi ~/desktop/xuanwu/README.md\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"用 vi 编辑的文件可以不存在，但要保证文件所在目录是存在的，如果目录不存在，保存文件时就会报错：Can't open file for writing。所以在用 vi 编辑或创建文件之前，先保存文件目录是存在的，如果不存在，可以使用 mkdir 命令创建所需目录。"}]},{"type":"element","tag":"h4","props":{"id":"编辑文件"},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"编辑文件"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"使用 vi 编辑文件内容，需要打开编辑模式，按一下 i 按键可以打开编辑模式，这时窗口底部会显示 — INSERT —，完成编辑以后按 esc 按键可以退出编辑模式。"}]},{"type":"element","tag":"h4","props":{"id":"保存文件并退出"},"children":[{"type":"text","value":"保存文件并退出"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"编辑了文件内容以后，如果想要保存对文件的修改并退出 vi 编辑器，先确定当前在正常模式下，按 esc 可以退出其它模式回到正常模式，然后执行："}]},{"type":"element","tag":"code","props":{"code":":wq\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":":wq\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"w 表示写入，q 表示退出，输入 "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":":wq"}]},{"type":"text","value":" 以后按下回车，这样就会保存对文件的修改，然后关掉 vi 编辑器。"}]},{"type":"element","tag":"h4","props":{"id":"放弃修改直接强制退出"},"children":[{"type":"text","value":"放弃修改直接强制退出"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果不想保存对文件的修改，打算强制退出 vi 编辑器，可以执行："}]},{"type":"element","tag":"code","props":{"code":":q!\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":":q!\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"q 表示退出，! 表示强制。"}]},{"type":"element","tag":"h4","props":{"id":"翻页查看文件"},"children":[{"type":"text","value":"翻页查看文件"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"按 ctrl + f 按键可以向下翻页查看文件，按 ctrl + b 按键可以向上翻页查看文件。"}]},{"type":"element","tag":"h4","props":{"id":"搜索文件内容"},"children":[{"type":"text","value":"搜索文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在正常模式下，输入 /，后面加上要搜索的关键词，按下回车，可以搜索并定位到当前文件包含指定关键词的地方。按 n 可以定位到下一个匹配的地方，按 N 可以定位到上一个匹配的地方。"}]},{"type":"element","tag":"h3","props":{"id":"cat输出文件内容"},"children":[{"type":"text","value":"cat（输出文件内容）"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"cat（concatenate）命令可以将多个文件合并成一个文件，也可以输出指定文件里的内容。"}]},{"type":"element","tag":"h4","props":{"id":"输出文件内容"},"children":[{"type":"text","value":"输出文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 cat 命令的后面提供要查看内容的文件，可以输出这个文件里的内容。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"cat ~/.ssh/id_rsa.pub\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cat ~/.ssh/id_rsa.pub\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面这行命令会输出在用户主目录下的 .ssh 目录里的 id_rsa.pub 这个文件里的内容。"}]},{"type":"element","tag":"h2","props":{"id":"相关概念"},"children":[{"type":"text","value":"相关概念"}]},{"type":"element","tag":"h3","props":{"id":"终端"},"children":[{"type":"text","value":"终端"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"终端就是一种命令行界面工具，当您在训练营中听到或看到 “在终端” 或 “打开终端” 时，Windows 用户可以打开 cmder，macOS 用户可以打开系统自带的终端。"}]},{"type":"element","tag":"h3","props":{"id":"用户主目录"},"children":[{"type":"text","value":"用户主目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在操作系统里的用户一般都有一个主目录，这个目录的位置在不同的操作系统里是不一样的，比如在 macOS 系统里，wanghao 这个用户的主目录的位置应该是 /Users/wanghao，在 Ubuntu 系统里，wanghao 这个用户的主目录应该是在 /home/wanghao。"}]},{"type":"element","tag":"h4","props":{"id":"进入用户主目录"},"children":[{"type":"text","value":"进入用户主目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端可以使用 ~（波浪号）表示当前用户的主目录所在的位置，比如在 macOS 系统里，当前登录的用户如果是 wanghao，这个 ~ 表示的位置应该就是 /Users/wanghao，所以进入到这个位置，可以执行："}]},{"type":"element","tag":"code","props":{"code":"cd ~\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cd ~\n"}]}]}]},{"type":"element","tag":"h3","props":{"id":"根目录"},"children":[{"type":"text","value":"根目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"根目录指的是某个地方的第一级别的目录。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"比如一个项目的位置是 ~/desktop/nid-node，对于这个项目来说，它的根目录指的就是 ~/desktop/nid-node。如果我们在这个项目的根目录下创建了一个 README.md 文件，那这个文件的位置应该就是 ~/desktop/nid-node/README.md。"}]},{"type":"element","tag":"h4","props":{"id":"系统根目录"},"children":[{"type":"text","value":"系统根目录"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 macOS 与 Linux 类型的操作系统里，系统的根目录指的是 / 这个位置，比如执行 cd / 命令，会进入到系统根目录的下面。/Users 这个路径，可以描述为系统根目录下面的 Users 这个目录。"}]},{"type":"element","tag":"h3","props":{"id":"路径"},"children":[{"type":"text","value":"路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"路径可以用来表示在操作系统里的一个目录或文件的位置，路径由目录与斜线组成，如果是表示文件的路径，在路径中还会包含文件的名字。"}]},{"type":"element","tag":"h4","props":{"id":"目录的路径"},"children":[{"type":"text","value":"目录的路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"表示目录的路径由目录的名字与斜线组成。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这个路径从系统的根目录开始，这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录。"}]},{"type":"element","tag":"h4","props":{"id":"文件的路径"},"children":[{"type":"text","value":"文件的路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"表示文件的路径由目录的名字、斜线与文件组成。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"上面这个路径从系统的根目录开始，这个路径指的就是系统根目录下的 Users 里面的 wanghao 里的 desktop 目录里的 xuanwu 这个目录里的 src 目录里的 main.ts 这个文件。也就是 main.ts 这个文件在 src 目录的下面，src 在 xuanwu 的下面，xuanwu 在 desktop 目录里，desktop 在 wanghao 这个目录里，wanghao 在 Users 这个目录里，Users 这个目录在系统的根目录的下面。"}]},{"type":"element","tag":"h4","props":{"id":"相对路径"},"children":[{"type":"text","value":"相对路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"相对路径指的是相对于当前位置的路径。相对路径表示的实际位置，会随着当前位置的变化而变化。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"src/main.ts\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"相对路径不以系统根目录（/）开始。描述上面这个相对路径，可以说当前目录下的 src 目录里的 main.ts。如果当前位置是 /Users/wanghao/desktop/xuanwu，相对于这个位置，上面这个路径在系统中的实际位置应该就是："}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop/xuanwu/src/main.ts\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"绝对路径"},"children":[{"type":"text","value":"绝对路径"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"绝对路径指的就是一个目录或文件在系统中的实际位置。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"/Users/wanghao/desktop\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/Users/wanghao/desktop\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"绝对路径会从系统的根目录开始。描述上面这个绝对路径，可以说在系统根目录下的 Users 里的 wanghao 里的 desktop 这个目录。"}]},{"type":"element","tag":"h3","props":{"id":"环境变量"},"children":[{"type":"text","value":"环境变量"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"环境变量（environment variables）就是在系统环境中存在的一些变量，程序可以读取这些环境变量并获取到它们的值。"}]},{"type":"element","tag":"h4","props":{"id":"查看环境变量"},"children":[{"type":"text","value":"查看环境变量"}]},{"type":"element","tag":"code","props":{"code":"printenv\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"printenv\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端执行 printenv 命令可以输出当前已有的一些环境变量以及它们对应的值。环境变量的名字一般全部使用大写字母，等号右边是环境变量对应的值。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"LANG=zh_CN.UTF-8\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"LANG=zh_CN.UTF-8\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"LANG 是环境变量的名字，zh*CN.UTF-8 是 LANG 这个环境变量对应的值。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"在 Windows 系统中通过 Cmder 执行 printenv 命令","src":"/images/docs/tools/cmd/cmder-printenv.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"在 Windows 系统中通过 Cmder 执行 printenv 命令"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"在 macOS 系统中通过终端执行 printenv 命令","src":"/images/docs/tools/cmd/terminal-printenv.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"*在 macOS 系统中通过终端执行 printenv 命令_"}]},{"type":"element","tag":"h4","props":{"id":"设置环境变量"},"children":[{"type":"text","value":"设置环境变量"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端，执行 export 命令可以添加环境变量，被添加的环境变量只能在当前这个终端标签里使用。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"export MACHINE_NAME=玄武\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"export MACHINE_NAME=玄武\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令会添加一个环境变量叫 MACHINE*NAME，它的值是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"玄武"}]},{"type":"text","value":"。这样在当前这个终端标签里运行的程序，都可以读取到 MACHINE_NAME 这个环境变量，得到的值就是 *玄武_ 。执行 printenv 可以确定一下是否包含了 MACHINE_NAME 这个环境变量。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"关掉这个终端标签，重新再打开，之前设置的环境变量就不见了。如果你希望每次打开终端的时候自动设置一些环境变量，可以将设置环境变量用的命令添加到终端的配置文件里，在 macOS 系统里就是 ~/.zprofile，Windows 系统里是 cmder/config/user-profile.sh。"}]},{"type":"element","tag":"h3","props":{"id":"path"},"children":[{"type":"text","value":"PATH"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"PATH 是一个环境变量，它的值是一组路径，在终端执行命令的时候，会在这些路径里查找是否包含要执行的命令程序。"}]},{"type":"element","tag":"h4","props":{"id":"输出-path-的值"},"children":[{"type":"text","value":"输出 PATH 的值"}]},{"type":"element","tag":"code","props":{"code":"printenv PATH\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"printenv PATH\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"得到的结果应该是一组路径，不同的路径之间会用冒号分隔开，在这些路径里都会包含一些可以执行的命令程序。"}]},{"type":"element","tag":"code","props":{"code":"/usr/local/bin:/usr/bin:/bin: ...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/usr/local/bin:/usr/bin:/bin: ...\n"}]}]}]},{"type":"element","tag":"h4","props":{"id":"设置-path-的值"},"children":[{"type":"text","value":"设置 PATH 的值"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"安装了软件以后，可能会包含一些命令行工具，如果想在终端直接使用它们，需要将包含这些命令行工具的目录添加到 PATH 里。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"示例"}]}]},{"type":"element","tag":"code","props":{"code":"export PATH=$PATH:/Applications/flutter/bin\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"export PATH=$PATH:/Applications/flutter/bin\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端的配置文件里添加上面这行代码，结果就是在 PATH 这个环境变量里添加了一个新的路径，位置是 /Applications/flutter/bin，也就是在这个位置里包含的命令行工具，以后都可以直接在终端执行。这里的 $PATH 引用的是原来的 PATH 这个环境变量的值。"}]},{"type":"element","tag":"h2","props":{"id":"钥匙"},"children":[{"type":"text","value":"钥匙"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"钥匙（keys）是加密解密用的东西（文本文件），在训练营中，向远程仓库推送代码的时候，登录管理远程服务器的时候都会用到在本地电脑里存放的钥匙。钥匙一般都成对出现，一个密钥（private key）对应一个公钥（public key）。我们可以给当前登录到系统的用户生成一对钥匙，其中密钥是私密的，决对不能交给别人，但是公钥可以放心交到其它地方使用。"}]},{"type":"element","tag":"h3","props":{"id":"生成钥匙对"},"children":[{"type":"text","value":"生成钥匙对"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"当前用户的钥匙对会放在用户主目录下的 .ssh 这个目录里，你可以先确定一下是否已经为当前用户生成了钥匙对。"}]},{"type":"element","tag":"code","props":{"code":"ls ~/.ssh\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ls ~/.ssh\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"执行上面的命令，如果发现用户主目录下的 .ssh 里面，有 id_rsa（密钥） 与 id_rsa.pub（公钥） 这两个文件，说明当前用户已经拥有了钥匙对。如果没有这两个文件，可以执行 ssh-keygen 命令生成它们。"}]},{"type":"element","tag":"code","props":{"code":"ssh-keygen\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ssh-keygen\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在终端，执行 ssh-keygen 命令，并一路回车，完成以后就会在用户主目录下的 .ssh 目录里生成一对钥匙。这个命令只需要执行一次，重复执行会覆盖掉之前生成的钥匙对。"}]},{"type":"element","tag":"h3","props":{"id":"查看公钥文件内容"},"children":[{"type":"text","value":"查看公钥文件内容"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在配置三方服务使用钥匙验证身份的时候，我们需要复制用户的公钥文件里的内容。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"查看公钥文件里的内容可以执行："}]},{"type":"element","tag":"code","props":{"code":"cat ~/.ssh/id_rsa.pub\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"cat ~/.ssh/id_rsa.pub\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"输出的内容看起来像这样："}]},{"type":"element","tag":"code","props":{"code":"ssh-rsa AAAAB3NzaC1yc2EAAX...\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ssh-rsa AAAAB3NzaC1yc2EAAX...\n"}]}]}]},{"type":"element","tag":"h2","props":{"id":"技巧"},"children":[{"type":"text","value":"技巧"}]},{"type":"element","tag":"h3","props":{"id":"知道命令来自哪里"},"children":[{"type":"text","value":"知道命令来自哪里"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果你想知道一个命令行工具到底在哪儿，可以用 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"which"}]},{"type":"text","value":" 命令，比如我想知道 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ls"}]},{"type":"text","value":" 这个命令行工具的位置，可以执行："}]},{"type":"element","tag":"code","props":{"code":"which ls\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"which ls\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"得到的结果就是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ls"}]},{"type":"text","value":" 这个命令行工具的位置，具体在哪取决于你的操作系统。在 macOS 系统里，这个工具是在 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/bin/ls"}]},{"type":"text","value":" 。在 Windows 系统里，如果你用的是 bash 类型的 Cmder，会显示这个工具的位置是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin/ls"}]},{"type":"text","value":" 。"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"usr"}]},{"type":"text","value":" 一般表示的是 user，也就是用户的意思，"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"bin"}]},{"type":"text","value":" 这个目录里通常包含的是一些可以执行的程序。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"这个 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin"}]},{"type":"text","value":" 应该是 Cmder 设置的一个目录的别名，因为在 Windows 系统里并没有这个地方，实际的位置应该是 Cmder 里的某个目录的下面。在我的系统里，"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/usr/bin"}]},{"type":"text","value":" 真正的位置是 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"/C/Program\\ Files/cmder/vendor/git-for-windows/usr/bin"}]},{"type":"text","value":" ，进入到这个目录的下面，列出目录里的资源，你会发现一些 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":".exe"}]},{"type":"text","value":" 后缀的文件。"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"在 Windows 系统里，带这种 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":".exe"}]},{"type":"text","value":" 后缀的文件就是可执行的程序。在后面我们会用到这里面的一些命令行工具，比如远程连接服务器用的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" ，生成密钥文件用的 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh-keygen"}]},{"type":"text","value":" 等等。Windows 系统默认都不带这些东西，这也是我们为什么要用 Cmder 来代替 Windows 系统自带的命令行界面。"}]},{"type":"element","tag":"h3","props":{"id":"获取命令的帮助信息"},"children":[{"type":"text","value":"获取命令的帮助信息"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果你了解某个命令行工具的用法，可以在命令的后面加上 help 选项，比如："}]},{"type":"element","tag":"code","props":{"code":"ls --help\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"ls --help\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"如果命令不提供 help 这个选项，可以试着用 man（manual） 命令查看命令的使用说明，比如："}]},{"type":"element","tag":"code","props":{"code":"man ls\n"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"man ls\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"命令的说明文档可能会分页显示，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":" 键可以向后翻页，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" 键可以向前翻页，按 "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"q"}]},{"type":"text","value":" 键可以退出文档。"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"cmderwindows","depth":2,"text":"Cmder（Windows）","children":[{"id":"安装与使用","depth":3,"text":"安装与使用"},{"id":"配置文件","depth":3,"text":"配置文件"}]},{"id":"终端macos","depth":2,"text":"终端（macOS）","children":[{"id":"使用终端","depth":3,"text":"使用终端"},{"id":"偏好设置","depth":3,"text":"偏好设置"},{"id":"配置文件-1","depth":3,"text":"配置文件"},{"id":"修改提示符","depth":3,"text":"修改提示符"}]},{"id":"常用命令","depth":2,"text":"常用命令","children":[{"id":"pwd输出当前位置","depth":3,"text":"pwd（输出当前位置）"},{"id":"ls列出资源","depth":3,"text":"ls（列出资源）"},{"id":"cd改变当前位置","depth":3,"text":"cd（改变当前位置）"},{"id":"mkdir创建目录","depth":3,"text":"mkdir（创建目录）"},{"id":"cp复制","depth":3,"text":"cp（复制）"},{"id":"rm删除","depth":3,"text":"rm（删除）"},{"id":"vi命令行编辑器","depth":3,"text":"vi（命令行编辑器）"},{"id":"cat输出文件内容","depth":3,"text":"cat（输出文件内容）"}]},{"id":"相关概念","depth":2,"text":"相关概念","children":[{"id":"终端","depth":3,"text":"终端"},{"id":"用户主目录","depth":3,"text":"用户主目录"},{"id":"根目录","depth":3,"text":"根目录"},{"id":"路径","depth":3,"text":"路径"},{"id":"环境变量","depth":3,"text":"环境变量"},{"id":"path","depth":3,"text":"PATH"}]},{"id":"钥匙","depth":2,"text":"钥匙","children":[{"id":"生成钥匙对","depth":3,"text":"生成钥匙对"},{"id":"查看公钥文件内容","depth":3,"text":"查看公钥文件内容"}]},{"id":"技巧","depth":2,"text":"技巧","children":[{"id":"知道命令来自哪里","depth":3,"text":"知道命令来自哪里"},{"id":"获取命令的帮助信息","depth":3,"text":"获取命令的帮助信息"}]}]}},"_type":"markdown","_id":"content:docs:1.tools:1.cli.md","_source":"content","_file":"docs/1.tools/1.cli.md","_extension":"md"}