附录 A:命令行速成教程

该附录是一个命令行的超级速成教程,它主要是为了让你在一两天内快速上手命令行,而不是教你一些高级的 Shell 用法。

介绍:别说话,开始用 Shell

该附录是一个命令行的速成教程,命令行可以让你的计算机执行任务。作为一个速成教程,它不会像我其他的书一样教得很详细。它只是为了让你能够像一个真正的程序员一样使用你的电脑。当你学完这个附录,你将能够掌握每个使用 Shell 的人每天进行的最基本的一些操作。你还会明白目录和其他一些概念的基础知识。

我唯一要给你的建议就是:什么也别说了,开始用 Shell 吧。如果你对命令行感到恐惧,唯一克服的方法就是去学习和攻克它。编程语言就是用更高级的方式去控制你的计算机,而命令行就是编程语言的雏形。一旦你掌握了命令行,你就能够更轻松地学习编程语言。

55.1.1 如何使用附录

使用附录最好的方式如下:

  • 准备一个本子和一根笔。
  • 从附录最开始做好每一个练习。
  • 当你遇到任何不懂的地方时,把它记在你的本子上。留一些空白以便之后补充答案。
  • 当你完成一个练习,回头来看你的本子,并重新审视你的问题。试着通过上网搜索或者请教别人来回答这些问题。(如果实在搞不懂欢迎去微信公众号“学习癌”相应章节下面查看大家讨论或者在后台留言,你会很快得到答案。
  • 每个练习都按这样的步骤来,写下你的问题,然后回头去找答案,当你做完这些,你会比你想象的更了解命令行的使用。

55.1.2 你需要记东西

在命令行的学习中我会要求你记东西,这是掌握知识最快的方法。我知道对某些人来说记东西非常痛苦,但是你得克服它,让自己记住。记忆是学习知识的不二法门,你必须要克服这种恐惧。

以下是记忆方法:

  • 告诉自己你可以做到,别试着找捷径,坐下来认真去记。
  • 把你要记的东西写在一些索引卡片上,然后一半一半分成两堆。
  • 每天花 15-30 分钟时间去记忆这些卡片,试着回忆每一张上面的内容。把没记清楚的放一块儿重点记忆,直到烂熟于心。然后再全部过一遍,检查自己有没有全部记住。
  • 在你晚上睡觉之前,把你之前没记住的卡片拿出来复习 5 分钟再睡。

还有其他一些技巧,比如你可以把你要学的东西写在一张纸上,然后贴到你经常能看到的墙上,当你看到墙的时候就顺便复习一遍。

如果你每天都坚持这样做,你应该能记住我让你记的大多数内容。一旦你这样做了,基本上其他任何东西都会变得更简单和更直觉(intuitive),这也是记忆的目的。它不仅是为了教会你抽象的概念,更是为了让你不用想就知道,这也是你去学习更难的知识所必需的基础。

附录练习 1 环境配置

在该附录中,你将需要做以下三件事情:

  • 用你的 Shell (命令行、Terminal、Powershell)做一些操作。
  • 学习你做的这些操作。
  • 自己去做更多的操作。

在最开始的这个练习中,你需要打开你的 Terminal,并让它正常运行,以便去做接下来的练习。

55.2.1 跟我做

macOS

用 MacOS 的童鞋可以这样做:

  • 按住 Command 键+空格。
  • 右上角会出现搜索框。
  • 输入 terminal。
  • 点击 Terminal 以打开,它看起来像个黑盒子。
  • 把 Terminal 放在 Dock(右键点击下面的 Terminal 图标,在“选项”中勾选“在Dock中保留”)

现在你已经打开了 Terminal,并把它放在了 Dock 以便快速访问。

Linux

我假设如果你使用 Linux 你已经知道如何找到并打开 Terminal 了。

Windows

在 Windows 系统下我们要用 Powershell。有些人习惯用一个叫 cmd.exe 的程序来工作,但是它没有 Poweshell 好用。如果你用的是 Windows 7 以及以上的版本,可以这样做:

  • 点击开始
  • 在“搜索程序和文件”中输入 Powershell(Windows 10 可以直接在左下角搜索框输入)
  • 点击回车

如果你用的不是 Windows 7 或者以上版本,你真的该考虑升级了。如果你不想或者没办法升级,可以去微软官网下载适合你系统版本的 Powershell。因为我没用过 XP,所以不知道整个过程是不是一样,但愿如此吧。

55.2.2 你学到的

你学到了如何打开 Terminal,以进行附录中后面的练习。

55.2.3 附加练习

这一节有一个庞大的附加练习,其他节都没有这么多。记忆这些内容能让你的大脑准备好去学习后面的东西,相信我,这会让你后面的学习更加轻松和顺畅。

Linux/macOS

把以下命令符列表写在卡片上,名字在左,含义在右,随着附录的学习每天复习。

命令符含义
pwd打印工作目录
hostname计算机网络运营商名称
mkdir创建目录
cd切换目录
ls列示目录
rmdir移除目录
pushd前往新目录地址
popd返回原目录地址
cp复制文件或目录
mv移动文件或目录
less在文件中翻页
cat打印整个文件
xargs执行参数值
find查找文件
grep在文件中查找内容
man打开帮助手册
apropos查找合适的帮助内容
env查看环境
echo打印参数值
export输出/设置新环境变量
exit退出 shell
sudo危险! 获得 root 权限 慎用!

Windows

如果你用的是 Windows,以下是你的命令符列表:

命令符含义
pwd打印工作目录
hostname计算机网络运营商名称
mkdir创建目录
cd切换目录
ls列示目录
rmdir移除目录
pushd前往新目录地址
popd返回原目录地址
cp复制文件或目录
robocopy超强复制
mv移动文件或目录
more在文件中翻页
type打印整个文件
forfiles在多个文件执行命令
dir -r查找文件
select-string在文件中查找内容
help打开帮助手册
helpctr查找合适的帮助内容
env查看环境
echo打印参数值
set输出/设置新环境变量
exit退出 shell
runas危险! 获得 root 权限 慎用!

练习练习练习,记忆记忆记忆,直到你能够对这些命令符脱口而出,而且记忆必须是双向的,你得能够看着命令符说出它的作用,也得知道要执行某个操作需要哪个命令符。通过这种方式,你可以逐步构建起自己的计算机语言词汇,但是也不要花费太多时间,如果你感到厌倦了就往下进行,在学习中强化记忆。

附录练习2 路径,文件夹,目录 (pwd)

在这个练习中你将学习如何用 pwd 命令打印当前正在工作的目录。

55.3.1 跟我做

我会教你如何阅读我展示给你的会话(session)。你不用输入我列出来的所有内容,只用输入其中一部分: - 不用输入 $ (Unix 系统)或者 > (Windows 系统)。那只是我用来说明我的会话中得到的输出结果。 - 你输入 $ 或者 > 后面的内容,然后回车。比如如果我写的是 $ pwd,你就只用输入 pwd 然后回车就行。 - 然后你就可以在 $ 或者 > 之后我得到的输出结果。

让我们先做个简单的练习,你就明白了:

Linux/macOS

练习 2 会话

  1. $ pwd
  2. /Users/zedshaw
  3. $

Windows

练习 2 Windows 会话

  1. PS C:\Users\zed> pwd Path

C:\Users\zed

PS C:\Users\zed>

警告!
在附录部分我需要节省空间以至于你能专注在命令行的重要细节上。为此,我将去掉 > 之前的内容,这也意味着你的呈现结果可能会跟我的不太一样,不过没关系,记住 > 之后的内容是你要输入的,在 Unix 系统下是 $

55.3.2 你学到的

你的提示符可能跟我的不太一样,你的 $ 前面可能是你用户名和电脑名。Windows 系统下可能也会不一样。不过最重要的是你看到的也是如下的模式: - 有一个提示符。 - 你在提示符后面输入命令,在本练习中是 pwd 。 - 它打印了一些东西。 - 重复。

你已经学习了 pwd 的作用,即“打印工作目录”。什么是目录?目录就是文件夹,它们是同一个东西。当你打开你电脑的文件查看器去寻找文件的时候,你就是在文件夹中穿梭,这些文件夹就是我说的“目录”。

55.3.3 附加练习

  • 输入 20 遍 pwd,边打边说“打印工作目录”。
  • 写下这个命令输出的文件路径,用你的文件查看器找到这个文件。
  • 我是认真的,输 20 遍,大声说出它的意思。

附录练习3 如果你迷路了

在学习上个练习的时候你可能会有点迷路,不知道你自己在哪儿,或者不知道文件在哪儿,也不知道怎么继续。要解决这个问题,我会教你停止迷路的命令。

不管你什么时候迷的路,很大可能是因为你输入命令的时候不知道你停在哪儿。你要做的就是输入 pwd 以查看你当前所在的目录,这将会告诉你你现在在哪儿。

接下来你需要回到你想回去的地方 —— 你的 home,你需要输入 cd ~ ,然后你就能回到你的 home。也就是说,任何时候只要你迷路了,你都可以先输入 pwd ,再输入 cd ~ ,前者让你知道你现在在哪,后者让你回到 home 以便重新开始。

55.4.1 跟我做

现在用 pwd 弄明白你在哪儿,然后用 cd ~ 回到 home,这样可以确保你总是在正确的地方。

55.4.2 你学到的

如果你迷路了,如何返回 home。

附录练习4 创建目录(mkdir)

在这个练习中,你将学习如何用 mkdir 命令创建新目录。

55.5.1 跟我做

记住!在进行这个练习之前,你需要先用 pwdcd ~ 回到 home!在做附录之后的每个练习前,都要先回到 home!

Linux/macOS

练习 4 会话

  1. $ pwd
  2. $ cd ~
  3. $ mkdir temp
  4. $ mkdir temp/stuff
  5. $ mkdir temp/stuff/things
  6. $ mkdir -p temp/stuff/things/orange/apple/pear/grape
  7. $

Windows

练习 4 Windows 会话

  1. > pwd
  2. > cd ~
  3. > mkdir temp
  4. Directory: C:\Users\zed
  5. Mode LastWriteTime Length Name
  6. ---- ------------- ------ ----
  7. d---- 12/17/2011 9:02 AM temp
  8. > mkdir temp/stuff
  9. Directory: C:\Users\zed\temp
  10. Mode LastWriteTime Length Name
  11. ---- ------------- ------ ----
  12. d---- 12/17/2011 9:02 AM stuff
  13. > mkdir temp/stuff/things
  14. Directory: C:\Users\zed\temp\stuff
  15. Mode LastWriteTime Length Name
  16. ---- ------------- ------ ----
  17. d---- 12/17/2011 9:03 AM things
  18. > mkdir temp/stuff/things/orange/apple/pear/grape
  19. Directory: C:\Users\zed\temp\stuff\things\orange\apple\pear
  20. Mode LastWriteTime Length Name
  21. ---- ------------- ------ ----
  22. d---- 12/17/2011 9:03 AM grape
  23. >

pwdcd ~ 命令我只列这一次,但是记住,做每个练习之前你都要做这个操作。

55.5.2 你学到的

现在我们开始输入多行命令了,这些是你使用 mkdir 的多种不同方式。mkdir 命令是用来做什么的?他是用来创建目录的。如果你问出了这个问题,那么你需要回过头去复习一下命令表了,再好好记记你做的卡片吧。

创建新目录是什么意思?就是新建文件夹。以上练习中你做的事情就是在目录中创建多层目录。这就叫做“路径”(path),它是一种描述“temp 文件夹下的 stuff 文件夹下的 things 文件夹”的方式。它是你想在计算机的文件夹树中放入某些东西时的路径指向,它构成了你计算机的硬盘。

警告!
在这个附录中,我将用 / 来表示路径,因为它适用于所有的电脑。然而,Windows 用户需要知道,你们也可以用 \

55.5.3 附加练习

  • “路径”的概念可能一开始会让你感到困惑。别担心,我们之后会多次用到这个概念,你会慢慢明白的。
  • 在 temp 目录中再创建 20 个不同层级的目录。在图形界面的文件查看器中查看这些文件夹。
  • 创建一个名称用 “ ” 括起来的目录:mkdir "I Have Fun"
  • 如果临时文件夹已经存在了你的电脑就会报错。用 cd 切换到一个你能控制的工作目录下,然后再试。Windows 桌面是一个很好的选择。

附录练习 5 切换目录 (cd)

在这个练习中,你将学习如何使用 cd 命令从一个目录切换到另一个目录。

55.6.1 跟我做

在这部分练习中我会再给你一次指导说明:

  • 不用输入 $ (Unix 系统)或者 > (Windows 系统)。
  • 你输入 $ 或者 > 后面的内容,然后回车。比如如果我写的是 $ cd,你就只用输入 cd 然后回车就行。
  • 回车之后你会在 $ 或者 > 之后看到你的输出结果。
  • 每次练习之前要先用 pwdcd ~ 回到 home,回到你最开始的地方。

Linux/macOS

练习 5 会话

  1. $ cd temp
  2. $ pwd
  3. ~/temp
  4. $ cd stuff
  5. $ pwd
  6. ~/temp/stuff
  7. $ cd things
  8. $ pwd
  9. ~/temp/stuff/things
  10. $ cd orange/
  11. $ pwd
  12. ~/temp/stuff/things/orange
  13. $ cd apple/
  14. $ pwd
  15. ~/temp/stuff/things/orange/apple
  16. $ cd pear/
  17. $ pwd
  18. ~/temp/stuff/things/orange/apple/pear
  19. $ cd grape/
  20. $ pwd
  21. ~/temp/stuff/things/orange/apple/pear/grape
  22. $ cd ..
  23. $ cd ..
  24. $ pwd
  25. ~/temp/stuff/things/orange/apple
  26. $ cd ..
  27. $ cd ..
  28. $ pwd
  29. ~/temp/stuff/things
  30. $ cd ../../..
  31. $ pwd
  32. ~/
  33. $ cd temp/stuff/things/orange/apple/pear/grape
  34. $ pwd
  35. ~/temp/stuff/things/orange/apple/pear/grape
  36. $ cd ../../../../../../../
  37. $ pwd
  38. ~/
  39. $

Windows

练习 5 Windows 会话

  1. > cd temp
  2. > pwd
  3. Path
  4. ----
  5. C:\Users\zed\temp
  6. > cd stuff
  7. > pwd
  8. Path
  9. ----
  10. C:\Users\zed\temp\stuff
  11. > cd things
  12. > pwd
  13. Path
  14. ----
  15. C:\Users\zed\temp\stuff\things
  16. > cd orange
  17. > pwd
  18. Path
  19. ----
  20. C:\Users\zed\temp\stuff\things\orange
  21. > cd apple
  22. > pwd
  23. Path
  24. ----
  25. C:\Users\zed\temp\stuff\things\orange\apple
  26. > cd pear
  27. > pwd
  28. Path
  29. ----
  30. C:\Users\zed\temp\stuff\things\orange\apple\pear
  31. > cd grape
  32. > pwd
  33. Path
  34. ----
  35. C:\Users\zed\temp\stuff\things\orange\apple\pear\grape
  36. > cd ..
  37. > cd ..
  38. > cd ..
  39. > pwd
  40. Path
  41. ----
  42. C:\Users\zed\temp\stuff\things\orange
  43. > cd ../..
  44. > pwd
  45. Path
  46. ----
  47. C:\Users\zed\temp\stuff
  48. > cd ..
  49. > cd ..
  50. > cd temp/stuff/things/orange/apple/pear/grape
  51. > cd ../../../../../../../
  52. > pwd
  53. Path
  54. ----
  55. C:\Users\zed
  56. >

55.6.2 你学到的

你已经在上一个练习中创建了以上这些目录,你刚才只是用 cd 命令在这些目录之间来回移动,同时在练习中我还用了 pwd 命令来看自己当前所处的位置,所以别把 pwd 输出的内容当作命令输入进去。例如,在第三行,你看到 ~/temp,但那只是 pwd 命令的输出结果,不要把它作为你要输入的内容。

你还应该看到我如何使用 .. 命令来沿着路径向上。

55.6.3 附加练习

在一个拥有图形用户界面(graphical user interface,GUI) 的电脑上学习命令行界面(command line interface,CLI) 的一个非常重要的事情就是要明白它们是如何一起工作的。我最早开始使用计算机的时候还没有 GUI,我们在 DOS 界面上进行所有的操作。后来,当计算机变成强大的图形界面时,我很容易就能把一些 CLI 的目录和 GUI上面的目录和 GUI 的窗口和文件夹对应上。

然而如今大多数人对 CLI、路径和目录毫无概念。事实上,也很难教会他们。唯一可能的办法就是持续地去用 CLI,直到有一天你用起 CLI 来会跟 GUI 一样自然流畅。

这就需要你花时间去寻找 GUI 下文件查看器里的目录,然后在 CLI 下切换到这些目录。以下是你接下来要做的:

  • 用一个命令切换到 apple 目录下。
  • 用一个命令切换回 temp 目录,但不是续着上一步来做。
  • 试试如何用一个命令切换到你的“home 目录”。
  • 切换到你的 Document 目录下,然后用 GUI 下的文件查看器找到它。(MacOS 下是 Finder,Windows 下是文件资源管理器,即“我的电脑”或“计算机”)
  • 切换到你的 Downloads 目录,然后用你的文件浏览器找到它。
  • 用你的文件浏览器找到其他目录,然后在 CLI 下切换到该目录。
  • 还记得你给目录名加过引号吗?你也可以在命令中加入引号,比如,如果你有一个目录是 I Have Fun,然后你可以输入:cd "I Have Fun"

附录练习 6 列示目录 (ls)

在这个练习中你将学习如何用 ls 命令列示一个目录中的内容。

55.7.1 跟我做

在你开始之前,确保你回到 temp 的上一层目录。如果你不知道你在哪儿,用 pwd 来查看,然后切换到要求的地方。

Linux/macOS

练习 6 会话

  1. $ cd temp
  2. $ ls stuff
  3. $ cd stuff
  4. $ ls things
  5. $ cd things
  6. $ ls orange
  7. $ cd orange
  8. $ ls apple
  9. $ cd apple
  10. $ ls pear
  11. $ cd pear
  12. $ ls
  13. $ cd grape
  14. $ ls
  15. $ cd ..
  16. $ ls grape
  17. $ cd ../../../
  18. $ ls orange
  19. $ cd ../../
  20. $ ls stuff
  21. $

Windows

练习 6 Windows 会话

  1. > cd temp
  2. > ls
  3. Directory: C:\Users\zed\temp
  4. Mode LastWriteTime Length Name
  5. ---- ------------- ------ ----
  6. d---- 12/17/2011 9:03 AM stuff
  7. > cd stuff
  8. > ls
  9. Directory: C:\Users\zed\temp\stuff
  10. Mode LastWriteTime Length Name
  11. ---- ------------- ------ ----
  12. d---- 12/17/2011 9:03 AM things
  13. > cd things
  14. > ls
  15. Directory: C:\Users\zed\temp\stuff\things
  16. Mode LastWriteTime Length Name
  17. ---- ------------- ------ ----
  18. d---- 12/17/2011 9:03 AM orange
  19. > cd orange
  20. > ls
  21. Directory: C:\Users\zed\temp\stuff\things\orange
  22. Mode LastWriteTime Length Name
  23. ---- ------------- ------ ----
  24. d---- 12/17/2011 9:03 AM apple
  25. > cd apple
  26. > ls
  27. Directory: C:\Users\zed\temp\stuff\things\orange\apple
  28. Mode LastWriteTime Length Name
  29. ---- ------------- ------ ----
  30. d---- 12/17/2011 9:03 AM pear
  31. > cd pear
  32. > ls
  33. Directory: C:\Users\zed\temp\stuff\things\orange\apple\pear
  34. Mode LastWriteTime Length Name
  35. ---- ------------- ------ ----
  36. d---- 12/17/2011 9:03 AM grape
  37. > cd grape
  38. > ls
  39. > cd ..
  40. > ls
  41. Directory: C:\Users\zed\temp\stuff\things\orange\apple\pear
  42. Mode LastWriteTime Length Name
  43. ---- ------------- ------ ----
  44. d---- 12/17/2011 9:03 AM grape
  45. > cd ..
  46. > ls
  47. Directory: C:\Users\zed\temp\stuff\things\orange\apple
  48. Mode LastWriteTime Length Name
  49. ---- ------------- ------ ----
  50. d---- 12/17/2011 9:03 AM pear
  51. > cd ../../..
  52. > ls
  53. Directory: C:\Users\zed\temp\stuff
  54. Mode LastWriteTime Length Name
  55. ---- ------------- ------ ----
  56. d---- 12/17/2011 9:03 AM things
  57. > cd ..
  58. > ls
  59. Directory: C:\Users\zed\temp
  60. Mode LastWriteTime Length Name
  61. ---- ------------- ------ ----
  62. d---- 12/17/2011 9:03 AM stuff
  63. >

55.7.2 你学到的

ls 命令列示出了你当前所在目录的内容。你能看到我使用 cd 命令在不同目录之间切换,然后列示出它们里面有些什么内容,然后让我决定接下来要去哪个目录。

ls 命令有很多选项,我们会在学习 help 命令时学习如何获取帮助。

55.7.3 附加练习

  • 把每一个命令都输一遍,你必须通过输入来学习这些命令,只是读它们是不够的。
  • 在 Unix 下,让你在 temp 目录下,试试 ls -lR 命令。
  • 在 Windows 系统下,用 dir -R 做同样的操作。
  • cd 去到你电脑上的其他目录,然后用 ls 看看它们里面有什么。
  • 把新的问题添加到你的本子上。我知道你可能会有一些,因为关于这个命令的内容我没有全讲到。
  • 记住如果你迷路了,用 lspwd 命令查看你在哪儿,然后用 cd 命令去到你应该去的地方。

附录练习 7 移除目录 (rmdir)

在这个练习中,你将学习如何移除一个空目录。

55.8.1 跟我做

Linux/macOS

练习 7 会话

  1. $ cd temp
  2. $ ls stuff
  3. $ cd stuff/things/orange/apple/pear/grape/
  4. $ cd ..
  5. $ rmdir grape
  6. $ cd ..
  7. $ rmdir pear
  8. $ cd ..
  9. $ ls apple
  10. $ rmdir apple
  11. $ cd ..
  12. $ ls orange
  13. $ rmdir orange
  14. $ cd ..
  15. $ ls things
  16. $ rmdir things
  17. $ cd ..
  18. $ ls stuff
  19. $ rmdir stuff
  20. $ pwd
  21. ~/temp
  22. $
警告!
如果你在 MacOS 系统下尝试用 rmdir 命令, 但是系统拒绝移除这个目录,即使你百分百确定它是空的,事实上的确有个文件在里面,叫做 .DS_Store 。遇到这种情况,输入 rm -rf <dir> (将 <dir> 替换成你要移除的目录名)。

Windows

练习 7 Windows 会话

  1. > cd temp
  2. > ls
  3. Directory: C:\Users\zed\temp
  4. Mode LastWriteTime Length Name
  5. ---- ------------- ------ ----
  6. d---- 12/17/2011 9:03 AM stuff
  7. > cd stuff/things/orange/apple/pear/grape/
  8. > cd ..
  9. > rmdir grape
  10. > cd ..
  11. > rmdir pear
  12. > cd ..
  13. > rmdir apple
  14. > cd ..
  15. > rmdir orange
  16. > cd ..
  17. > ls
  18. Directory: C:\Users\zed\temp\stuff
  19. Mode LastWriteTime Length Name
  20. ---- ------------- ------ ----
  21. d---- 12/17/2011 9:14 AM things
  22. > rmdir things
  23. > cd ..
  24. > ls
  25. Directory: C:\Users\zed\temp
  26. Mode LastWriteTime Length Name
  27. ---- ------------- ------ ----
  28. d---- 12/17/2011 9:14 AM stuff
  29. > rmdir stuff
  30. > pwd
  31. Path
  32. ----
  33. C:\Users\zed\temp
  34. > cd ..
  35. >

55.8.2 你学到的

我现在开始把这些目录混在一起用了,所以你一定要专心,确保自己都输对了。如果你犯错了,只能说明你不专心。如果你发现自己犯了很多错,休息一下,或者干脆今天就不学了,明天再继续。

在这个例子中,你学会了如何移除一个目录,非常简单。你只需要去到它的上层目录,然后输入 rmdir <dir> ,用你要移除的目录名替换掉 <dir> 即可。

55.8.3 附加练习

  • 创建 20 个目录,然后移除它们。
  • 创建一个 10 层路径的目录,然后一次移除一个,就像我之前做的那样。
  • 如果你试着移除一个有内容的目录,你会收到报错。我会在后面的练习中教你如何移除它们。

附录练习 8 来回移动 (pushd, popd)

在这个练习中,你将学习如何用 pushd 命令保存你当前的位置然后去到一个新的位置,以及如何用 popd 命令返回之前保存的位置。

55.9.1 跟我做

Linux/macOS

练习 8 会话

  1. $ cd temp
  2. $ mkdir i/like/icecream
  3. $ pushd i/like/icecream
  4. ~/temp/i/like/icecream ~/temp
  5. $ popd
  6. ~/temp
  7. $ pwd
  8. ~/temp
  9. $ pushd i/like
  10. ~/temp/i/like ~/temp
  11. $ pwd
  12. ~/temp/i/like
  13. $ pushd icecream
  14. ~/temp/i/like/icecream ~/temp/i/like ~/temp
  15. $ pwd
  16. ~/temp/i/like/icecream
  17. $ popd
  18. ~/temp/i/like ~/temp
  19. $ pwd
  20. ~/temp/i/like
  21. $ popd
  22. ~/temp
  23. $ pushd i/like/icecream
  24. ~/temp/i/like/icecream ~/temp
  25. $ pushd
  26. ~/temp ~/temp/i/like/icecream
  27. $ pwd
  28. ~/temp
  29. $ pushd
  30. ~/temp/i/like/icecream ~/temp
  31. $ pwd
  32. ~/temp/i/like/icecream
  33. $

Windows

练习 8 Windows 会话

  1. > cd temp
  2. > mkdir i/like/icecream
  3. Directory: C:\Users\zed\temp\i\like
  4. Mode LastWriteTime Length Name
  5. ---- ------------- ------ ----
  6. d---- 12/20/2011 11:05 AM icecream
  7. > pushd i/like/icecream
  8. > popd
  9. > pwd
  10. Path
  11. ----
  12. C:\Users\zed\temp
  13. > pushd i/like
  14. > pwd
  15. Path
  16. ----
  17. C:\Users\zed\temp\i\like
  18. > pushd icecream
  19. > pwd
  20. Path
  21. ----
  22. C:\Users\zed\temp\i\like\icecream
  23. > popd
  24. > pwd
  25. Path
  26. ----
  27. C:\Users\zed\temp\i\like
  28. > popd
  29. >
警告!
在 Windows 系统下,你一般不用像 Linux 系统那样用 -p ,但是我想这应该是最近的更新,如果你用老的 Windows 系统的 Powershell,应该还是需要 -p 的,所以每个人的情况可能不太一样,你可以试试看。

55.9.2 你学到的

你正在通过这些命令进入程序员的世界,这些命令很常用,所以我必须要教给你们。它们能让你暂时地去到别的目录,然后再回来,并在两者之间随意切换。

pushd 命令会把你当前的目录“push”到一个列表里,然后它会切换到另外一个目录,就好像在说:“保存我现在的位置,然后去到那儿”。

popd 命令则是把你从你之前去到的目录那里拉回来。

最后,在 Unix 下使用 pushd 的话,如果你后面不加任何东西,它会在你的当前目录和你之前保存的目录之间来回切换。但是在 Powershell 下这个就不适用了。

55.9.3 附加练习

  • 用这些命令在你电脑的目录之间来回移动。
  • 移除 i/like/icecream 目录,然后自己创建一些,并在它们中间来回切换。
  • 跟自己解释 pushdpopd 的输入结果,注意它和堆栈的概念很类似。
  • 虽然你已经知道了,但是要记住 mkdir -p (在 Linux/MacOS 下)会创建一个完整的路径,即使所有的目录都不存在。这也就是我在本练习开头所做的。
  • 记住 Window 也会创建一个完整的路径,并且不需要 -p

附录练习 9 创建空文件 (Touch, New-Item)

在这个练习中你将学习如何使用 touch (MacOS)或者 new-item (Windows) 命令来创建空文件。

55.10.1 跟我做

Linux/macOS

练习 9 会话

  1. $ cd temp
  2. $ touch iamcool.txt
  3. $ ls iamcool.txt
  4. $

Windows

练习 9 Windows 会话

  1. > cd temp
  2. > New-Item iamcool.txt -type file
  3. > ls
  4. Directory: C:\Users\zed\temp
  5. Mode LastWriteTime Length Name
  6. ---- ------------- ------ -----
  7. a--- 12/17/2011 9:03 AM iamcool.txt
  8. >

55.10.2 你学到的

你学习了如何创建空文件。在 Unix 系统下用 touch ,在 Windows 系统下用 New-Item

55.10.3 附加练习

  • Unix:创建一个目录,切换到该目录下,然后在它里面创建一个文件,然后再切换到该目录的上一次,用 rmdir 命令移除该目录。你会收到报错,试着理解一下为什么。
  • Windows:做同样的事情,但是你不会收到报错,你会收到一个提示符问你是否真的要移除这个目录。

附录练习 10 复制文件 (cp)

在这个练习中,你将学习如何用 cp 命令把一个文件从一个地址复制到另一个地址。

55.11.1 跟我做

Linux/macOS

练习 10 会话

  1. $ cd temp
  2. $ cp iamcool.txt neat.txt
  3. $ ls
  4. iamcool.txt neat.txt
  5. $ cp neat.txt awesome.txt
  6. $ ls
  7. awesome.txt iamcool.txt neat.txt
  8. $ cp awesome.txt thefourthfile.txt
  9. $ ls
  10. awesome.txt iamcool.txt neat.txt thefourthfile.txt
  11. $ mkdir something
  12. $ cp awesome.txt something/
  13. $ ls
  14. awesome.txt iamcool.txt neat.txt something thefourthfile.txt
  15. $ ls something/ awesome.txt
  16. $ cp -r something newplace
  17. $ ls newplace/ awesome.txt
  18. $

Windows

练习 10 Windows 会话

  1. > cd temp
  2. > cp iamcool.txt neat.txt
  3. > ls
  4. Directory: C:\Users\zed\temp
  5. Mode LastWriteTime Length Name
  6. ---- ------------- ------ ----
  7. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  8. -a--- 12/22/2011 4:49 PM 0 neat.txt
  9. > cp neat.txt awesome.txt
  10. > ls
  11. Directory: C:\Users\zed\temp
  12. Mode LastWriteTime Length Name
  13. ---- ------------- ------ ----
  14. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  15. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  16. -a--- 12/22/2011 4:49 PM 0 neat.txt
  17. > cp awesome.txt thefourthfile.txt
  18. > ls
  19. Directory: C:\Users\zed\temp
  20. Mode LastWriteTime Length Name
  21. ---- ------------- ------ ----
  22. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  23. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  24. -a--- 12/22/2011 4:49 PM 0 neat.txt
  25. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  26. > mkdir something
  27. Directory: C:\Users\zed\temp
  28. Mode LastWriteTime Length Name
  29. ---- ------------- ------ ----
  30. d---- 12/22/2011 4:52 PM something
  31. > cp awesome.txt something/
  32. > ls
  33. Directory: C:\Users\zed\temp
  34. Mode LastWriteTime Length Name
  35. ---- ------------- ------ ----
  36. d---- 12/22/2011 4:52 PM something
  37. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  38. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  39. -a--- 12/22/2011 4:49 PM 0 neat.txt
  40. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  41. > ls something
  42. Directory: C:\Users\zed\temp\something
  43. Mode LastWriteTime Length Name
  44. ---- ------------- ------ ----
  45. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  46. > cp -recurse something newplace
  47. > ls newplace
  48. Directory: C:\Users\zed\temp\newplace
  49. Mode LastWriteTime Length Name
  50. ---- ------------- ------ ----
  51. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  52. >

55.11.2 你学到的

现在你会复制文件了,它很简单。在这个练习中,我还创建了一个新目录,并且把一个文件复制到了那个新目录中。

我要告诉你一个关于程序员和系统管理员的秘密。他们很懒,我也很懒,我的朋友同样很懒。这也正是为什么我们要用计算机。我们热衷于让计算机为我们做无聊的事情。这个练习到目前为止你已经输入了很多重复的命令来学习它们,但是实际情况不是这样的,通常如果你发现自己在做一些无聊和重复的事情,就已经有一个程序员在想办法如何让这件事情变得简单,你只是不知道而已。

关于程序员的另一件事情就是,他们可能没你想的那么聪明。如果你觉得他们输入的东西有多么高深莫测,那你就错了。在你做练习的时候,你可以先试着先想想这些命令的名字和含义,然后再输入。一般你会想到一个名字或者一些缩写。如果你还是想象不出来,就回过头复习一下或者在网上搜一搜。

5.11.3 附加练习

  • cp -r 命令复制更多包含文件的目录。
  • 把一个文件复制到你的 home 目录或者桌面。
  • 在图形用户界面找到这些文件,然后用文本编辑器打开它们。
  • 注意我有时候会放一个 / 在目录结尾,这样是为了确保这是一个目录,如果不是的话,我会收到报错。

附录练习 11 移动文件 (mv)

在这个练习中,你将会学习如何使用 mv 命令把一个文件从一个地方移动到另一个地方。

55.12.1 跟我做

Linux/macOS

练习 11 会话

  1. $ cd temp
  2. $ mv awesome.txt uncool.txt
  3. $ ls
  4. newplace uncool.txt
  5. $ mv newplace oldplace
  6. $ ls
  7. oldplace uncool.txt
  8. $ mv oldplace newplace
  9. $ ls
  10. newplace uncool.txt
  11. $

Windows

练习 11 Windows 会话

  1. > cd temp
  2. > mv awesome.txt uncool.txt
  3. > ls
  4. Directory: C:\Users\zed\temp
  5. Mode LastWriteTime Length Name
  6. ---- ------------- ------ ----
  7. d---- 12/22/2011 4:52 PM newplace
  8. d---- 12/22/2011 4:52 PM something
  9. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  10. -a--- 12/22/2011 4:49 PM 0 neat.txt
  11. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  12. -a--- 12/22/2011 4:49 PM 0 uncool.txt
  13. > mv newplace oldplace
  14. > ls
  15. Directory: C:\Users\zed\temp
  16. Mode LastWriteTime Length Name
  17. ---- ------------- ------ ----
  18. d---- 12/22/2011 4:52 PM oldplace
  19. d---- 12/22/2011 4:52 PM something
  20. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  21. -a--- 12/22/2011 4:49 PM 0 neat.txt
  22. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  23. -a--- 12/22/2011 4:49 PM 0 uncool.txt
  24. > mv oldplace newplace
  25. > ls newplace
  26. Directory: C:\Users\zed\temp\newplace
  27. Mode LastWriteTime Length Name
  28. ---- ------------- ------ ----
  29. -a--- 12/22/2011 4:49 PM 0 awesome.txt
  30. > ls
  31. Directory: C:\Users\zed\temp
  32. Mode LastWriteTime Length Name
  33. ---- ------------- ------ ----
  34. d---- 12/22/2011 4:52 PM newplace
  35. d---- 12/22/2011 4:52 PM something
  36. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  37. -a--- 12/22/2011 4:49 PM 0 neat.txt
  38. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  39. -a--- 12/22/2011 4:49 PM 0 uncool.txt
  40. >

55.12.2 你学到的

移动文件,或者重命名,很简单:给出原来的名字和新的名字即可。

55.12.3 附加练习

  • 将 newplace 目录下的一个文件移动到另一个目录下,然后再移动回来。

附录练习 12 浏览文件 (less, MORE)

做这个练习需要用到目前为止已经学过的一些命令。你还需要一个能创建文本文档(.txt)的文本编辑器,以下是你要做的:

  • 打开你的文本编辑器,在新文件中输入一些东西。在 macOS 下,你可以用 TextWrangler,在 Windows 系统下你可以用 Notepad++,在 Linux 下可以用 Gedit。其他任何文本编辑器也都可以。
  • 把这个文件保存到桌面,然后命名为 test.txt。
  • 在 Shell 中用你学到的命令把这个文件复制到当前的工作目录—— temp 目录下。

做完这些,再完成下面的练习。

55.13.1 跟我做

Linux/macOS

练习 12 会话

  1. $ less test.txt [displays file here]
  2. $

就是这些,输入 q 即可退出 less 浏览模式。

Windows

练习 12 Windows 会话

  1. > more test.txt [displays file here]
  2. >
警告!
在前面的练习结果中,我用了 [displays file here] 来指代程序的输出结果,因为有些输出结果比较复杂。你要知道你的输出结果不是这个。

55.13.2 你学到的

这只是查看文件内容的一种方法。它很有用,因为当文件有很多行的时候,它可以翻页。在附加练习部分你会做更多的操作。

55.13.3 附加练习

  • 再次打开你的文本文件,通过复制粘贴的方法把内容扩充到 50-100 行。
  • 再把它复制到 temp 目录下。
  • 现在再做一遍练习,这一遍可以翻页,Unix 系统可以用 空格键和 w 来上下翻页,Windows 系统直接用空格键即可。
  • 再看看你创建的其他一些空文件。
  • cp 命令会覆盖一些已经存在的文件,所以要复制的时候要小心。

附录练习 13 Stream 文件 (cat)

在做这个练习之前你需要再多做一些准备工作,以便在练习中使用。用编辑器创建另一个名为 test2.txt 的文件,但是这次直接把它保存在 temp 目录下。

55.14.1 跟我做

Linux/macOS

练习 13 会话

  1. $ less test2.txt [displays file here]
  2. $ cat test2.txt I am a fun guy.
  3. Don't you know why? Because I make poems, that make babies cry.
  4. $ cat test.txt
  5. Hi there this is cool.
  6. $

Windows

练习 13 Windows 会话

  1. > more test2.txt [displays file here]
  2. > cat test2.txt I am a fun guy.
  3. Don't you know why? Because I make poems, that make babies cry.
  4. > cat test.txt
  5. Hi there this is cool.
  6. >

55.14.2 你学到的

你已经学习了第一个命令,这个命令只是为了让你检查一下那个文件确实在。然后你把这个文件 cat 到屏幕,cat 命令是把整个文件内容全部呈现到屏幕上,没有翻页或者停止。

55.14.3 附加练习

  • 再创建几个文件并使用 cat 命令。
  • Unix:试试 cat test.txt test2.txt ,看看会发生什么。
  • Windows: 试试 cat test.txt,test2.txt,看看会发生什么。

附录练习 14 移除文件 (rm)

在这个练习中你将学习如何用 rm 命令移除(删除)一个文件。

55.15.1 跟我做

Linux

练习 14 会话

  1. $ cd temp
  2. $ ls
  3. uncool.txt iamcool.txt neat.txt something thefourthfile.txt
  4. $ rm uncool.txt
  5. $ ls
  6. iamcool.txt neat.txt something thefourthfile.txt
  7. $ rm iamcool.txt neat.txt thefourthfile.txt
  8. $ ls something
  9. $ cp -r something newplace
  10. $
  11. $ rm something/awesome.txt
  12. $ rmdir something
  13. $ rm -rf newplace
  14. $ ls
  15. $

Windows

练习 14 Windows 会话

  1. > cd temp
  2. > ls
  3. Directory: C:\Users\zed\temp
  4. Mode LastWriteTime Length Name
  5. ---- ------------- ------ ----
  6. d---- 12/22/2011 4:52 PM newplace
  7. d---- 12/22/2011 4:52 PM something
  8. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  9. -a--- 12/22/2011 4:49 PM 0 neat.txt
  10. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  11. -a--- 12/22/2011 4:49 PM 0 uncool.txt
  12. > rm uncool.txt
  13. > ls
  14. Directory: C:\Users\zed\temp
  15. Mode LastWriteTime Length Name
  16. ---- ------------- ------ ----
  17. d---- 12/22/2011 4:52 PM newplace
  18. d---- 12/22/2011 4:52 PM something
  19. -a--- 12/22/2011 4:49 PM 0 iamcool.txt
  20. -a--- 12/22/2011 4:49 PM 0 neat.txt
  21. -a--- 12/22/2011 4:49 PM 0 thefourthfile.txt
  22. > rm iamcool.txt
  23. > rm neat.txt
  24. > rm thefourthfile.txt
  25. > ls
  26. Directory: C:\Users\zed\temp
  27. Mode LastWriteTime Length Name
  28. ---- ------------- ------ ----
  29. d---- 12/22/2011 4:52 PM newplace
  30. d---- 12/22/2011 4:52 PM something
  31. > cp -r something newplace
  32. > rm something/awesome.txt
  33. > rmdir something
  34. > rm -r newplace
  35. > ls
  36. >

55.15.2 你学到的

这个练习我们学习了如何删除文件。还记得之前我让你们用 rmdir 命令移除包含内容的目录时失败了吗?是因为你不能用 rmdir 移除包含内容的目录。要移除这个目录,首先要删除它里面的文件,这也正是这个练习中所学到的。

55.15.3 附加练习

  • 删除 temp 目录中目前为止所有的练习文件。
  • 当你对文件进行递归删除的时候要千万小心。(译者注:递归删除就是你想删一个文件夹,而这个文件夹下还有其它的东西,它就会先把其它的东西删掉,再删这个文件夹)

附录练习 15 退出 Terminal (exit)

55.16.1 跟我做

Linux/macOS

练习 15 会话

  1. $ exit

Windows

练习 15 Windows 会话

  1. > exit

55.16.2 你学到的

最后一个练习是如何退出 Terminal,非常简单,但是我需要你再做一些练习。

55.16.3 附加练习

在本速成课的最后,我想让你用一下帮助系统,看看以下这些命令的解释和用法,学习如何使用它们。

以下是 Unix 系统下你要查询的命令列表:

  • xargs
  • sudo
  • chmod
  • chown

以下是 Windows 系统下你要查询的命令列表:

  • forfiles
  • runas
  • attrib
  • icacls

弄明白这些是什么,试试用用这些命令,然后把它们添加到你的索引卡片上。

命令行后续

你已经完成了命令行速成教程,基本掌握了一些基础命令的用法。但其实还有很多的技巧和键序列你没有见过。我会在这个教程的最后引导你去搜索和了解它们。

55.17.1 Unix Bash References

在 Unix 系统下,你使用的 Shell 叫做 Bash。它不是最好的 shell,但它无处不在。以下是一些关于 Bash 的列表:

55.17.2 PowerShell References

在 Windows 系统下只有 Powershell。以下是一些关于 Powershell 的列表;