命令行到底是什么
那个吓人的黑色窗口,只是一个让你给电脑逐行输入指令的地方。在那里聆听的程序叫做 外壳程序(shell):你输入一条命令,按下回车,它就去办事,然后打字回应你。可以把它想成你在给电脑发短信,而不是用鼠标点它。
外壳程序不能直接碰硬件。它把你真正的请求往下传给 内核(kernel)——操作系统最底层的核心,由它真正去打开文件、读写磁盘、运行程序。你对外壳程序说话,外壳程序再悄悄转告内核。
看懂提示符
在你输入任何东西之前,外壳程序会先显示一小行,叫做提示符(prompt)。它通常以一个美元符号 `
你的第一行命令行
你的第一行命令行
`
你的第一行命令行
四处走动:你的地图
你的文件存放在一层套一层的文件夹里,就像大楼里一间套一间的房间。三条命令就是你全部的地图。`pwd` 在问"我站在哪里?"`ls` 在问"这个房间里有什么?"而 `cd` 的意思是"走进那个房间。"说真的,你需要的差不多就这些。
$ pwd /Users/you/projects $ ls notes.txt website photos $ cd website $ pwd /Users/you/projects/website
动手做事,以及那张隐形成绩单
要运行一条命令,你就输入它的名字然后按回车——就这么简单。`mkdir photos` 会新建一个叫 photos 的文件夹;`echo hello` 只是把 hello 这个词打印回给你看。外壳程序办完事、显示结果,再把提示符交还给你,好让你继续下一条。
这里有一点新手很少注意到:每条命令结束时都会悄悄交回一个退出码(exit code)。0 代表成功;其他任何数字都意味着出了问题。你平时看不到它,但脚本和工具一直在读它,用来决定要不要继续往下走。
$ ls notes.txt notes.txt $ echo $? 0
进阶招式:管道、标志和脚本
管道(pipe)写作 `|`,它把两条命令接起来,让第一条的输出变成第二条的输入——就像把两根花园水管接到一起。`ls | wc -l` 先列出你的文件,再把这份清单直接送进一个计数器,于是你得到的是一个整洁的总数,而不是一大堵文件名的墙。
大多数命令还接受标志(flag)——以短横线开头的小开关,用来改变行为。`ls -l` 显示详细列表;`ls -a` 显示隐藏文件。通常你还能把它们叠在一起,比如 `ls -la`。标志就是一条命令悄悄胜任许多活儿的秘诀。
当你把一堆命令存进一个文件,你就做出了一个脚本。但在系统肯运行它之前,你得用文件权限(file permissions)把它标记为"可运行"——下面的 `+x` 字面意思就是"允许执行"。这就好比一份食谱:能读,和厨房被允许去做,是两回事。
$ chmod +x deploy.sh $ ./deploy.sh
连到另一台机器
有时候你想操控的电脑并不在你面前——它是远方某个数据中心里的一台服务器。SSH 就是那条安全的隧道,让你在那台远程机器上打开一个命令行,像坐在它面前一样打字。你用一行 `ssh [email protected]` 这样的命令连上去,从那一刻起,你的命令就在那边运行,而不是这边。
在任何机器上,无论本地还是远程,有些设置存放在环境变量(environment variables)里——这是外壳程序揣在兜里的带名字的值,比如 `HOME` 或 `PATH`。命令通过读取它们来知道东西在哪。你其实已经见过一个了:`$?` 就是一个保存着上一个退出码的特殊变量。
小结:一张活命速查表
现在你已经够用了:四处走动、查看东西、让电脑干活——全靠打字。把下面这几条命令记牢,找一个你不介意随便折腾的文件夹试一试,那块黑屏就会从吓人变成你最快的工具。
- pwd——我现在在哪?
- ls——这里有哪些文件?(加 -la 看全部)
- cd 文件夹——进去;cd .. 往上;cd ~ 回主目录。
- echo $?——上一条命令成功了吗?(0 = 成功)
- 命令1 | 命令2——把一条的输出用管道送给下一条。
- chmod +x 文件——让你的脚本可以运行。