前端必备的 Terminal 终端进阶技巧

本文转载自少数派网站

  • 原文:https://sspai.com/post/45534
  • 作者:王禹效

怎样看出电影中哪个人是电脑大神?看他是不是在用终端

这是句玩笑话,但是你可能或多或少从电影中见过某个电脑大神或者专业黑客,在一块黑色的窗口前随便敲一点代码,某个问题就迎刃而解了。虽然实际情况不会这么容易,但是不可否认,终端在电脑中确实具备控制一切的能力

电影中常常出现的情景

你可能会觉得终端太过深奥,其实不然。终端可难可易,有些时候你只需要知道一些简单的用法,就可以自己上手解决一些日常问题了。

本文我会首先带你零基础认识终端,了解其常见用写法,告诉你新手入门哪些地方可以碰,那些地方是雷区。接着会实践一些实用命令,如关闭报错提示,显示隐藏文件夹,修改截图类型,整理应用程序栏等。最后我会分析一下这些实用命令的写法,如何举一反三,并谈几个涉及转换文稿格式,快速安装软件和硬盘扩容等操作的进阶命令。

目录

  • 什么是终端?

  • 如何打开终端?

  • 基础知识

  • 常见玩法

  • 关闭崩溃报错

  • 修改文件日期

  • 不要进入休眠状态

  • 程序假死需要强退

  • 截图保存为 JPEG

  • 关闭截图自动阴影

  • 显示隐藏文件夹

  • 整理程序栏

  • 重置程序栏

  • 打印机械感十足的文字

  • 进阶教程

  • 默认设置 defaults

  • 文件格式转换 textutil

  • 磁盘处理 diskutil

  • 常用但有风险的命令 diskutil

  • 自动安装 brew

  • 文件删除 rm

  • 其它命令

  • 写在文后

什么是终端?

我们总在说在终端中如何操作,那么终端到底是什么呢?为什么它会有这么大的权利?

要说清终端是什么,我们先来看看操作系统的组成。简化来说,操作系统分为两个部分,一部分称作内核,另一部分成为用户交互界面。内核部分负责系统的全部逻辑操作,由海量命令组成,这一部分是系统运行的命脉,不与用户接触;交互界面则是开机之后所有我们所看到的东西,比如窗口,软件,应用程序等等。

null

那么我们若我们想对系统内核的某些操作逻辑做出一些修改,应该怎么办呢?终端就是连接内核与交互界面的这座桥,它允许用户在交互界面上打开一个叫做「Terminal 终端」的应用程序,在其中输入命令,系统会直接给出反馈。

因为终端这座桥,实际允许用户间接控制系统内核,也就是系统的大脑,因此它理论上具备控制一切的权利。

如何打开终端?

终端是系统中一个应用程序,你可以直接在所有程序中找到它,点击打开就行。我比较喜欢使用聚焦搜索,输入「终端」或「Terminal」,看到终端被选中了按下回车即可。

快速打开终端

基础知识

本节会从零开始,一步步讲解基础知识。若你只想查看实际命令,可以完全跳过这一部分。

终端启动后,就会进入一个问你要指令的状态,你只需要将指令输入在光标后,按下键盘回车,指令就会被执行。

那么什么是命令?命令就是你告诉电脑希望它做什么的那句话。若我现在希望告诉电脑说 hi,这句话的命令就是 say hi,就这么简单。

命令由三个部分组成,第一个部分是命令对象,在 say hi 这个命令中,「say」 是我们的命令对象,我们希望电脑说话;第二个部分是修饰命令对象的关键词,可有可无,若我希望电脑说话时慢一点,可以输入 say -r 500 hi,这里的 「-r 500」 则是修饰说话语速的关键词;第三部分是命令内容,这里填写希望电脑说的内容是「hi」这句话。

命令的组成

我们先来尝试让电脑将我们所打的话复述出来,这一步的指令是 echo "想说的话",将这句指令复制进终端并回车后,可以看到,它会将我们输入进去的文字在下一行重新打出来。

echo

终端运行常常离不开对文件,文件夹的操作。

当你需要使用终端对文件夹进行操作时,终端需要你告诉它,你想要修改的文件在哪里,这时我们需要了解路径的概念。系统中的每一个文件都有一个存放位置,这一存放位置就称作路径。

终端启动后,它的默认路径在当前用户文件夹的根目录上,为了确定这一点,你可以输入 pwd 命令来查看当前路径。在下图中,输入命令后,终端告诉我当前路径是 /Users/我的名字

pwd

路径的一般写法为 /文件夹名/文件夹名,但路径其实分为两种。一种叫相对路径,另一种叫绝对路径,它们两有什么区别呢?

我们从当前路径说起,当前路径指的是现在终端所处的位置,若你想改变当前路径,则可以输入 cd /其他文件夹。比如我希望系统将当前路径改为所有应用程序文件夹,则输入 cd /Applications,在下图中可以看到,Legolas 前出现了一个 Applications,表示当前路径已经在应用程序文件夹中。

cd /

刚刚提到的路径的一般写法 「/文件夹名/文件夹名」,它指的其实就是绝对路径,你必须指定它从根目录一直到达具体的文件夹。

与其相对的是相对路径,**相对路径允许你告诉终端从现在开始,接下来应该怎么走。**相对路径的书写方法实在绝对路径前加一个 .

若你现在已经处在应用程序文件夹中,想前往其中的一个名叫 Utilities 的子文件夹应该怎么办?

下图中,当前位置的绝对路径是 /Applications/Utilities,但由于我已经处于 /Applications 文件夹中,因此可以使用相对路径的写法 cd ./Utilities,表示将当前路径转到 Utilities 文件夹。

cd ./

说了这么多关于路径的写法,你可能已经头大了,懒得去这么写,那么有没有快速导入路径的方法呢?有,直接将待编辑文件或文件夹拖入终端中即可,它会自动把绝对路径提取出来,实际情况下常用的也是这种自动提取或手动复制的方法。

拖入快速提取路径

当你想要查看当前路径下有什么文件时,可以使用 ls 命令,它会列举当前路径下的全部文件,若你希查看进阶设定,比如列举当前路径下的全部文件并展开所有子文件夹,可以在 ls 命令后加上 -R 的识别符,新指令就变成了 ls -R,运行结果如下,可以看到我放在资源文件夹中的所有子文件都被显示出来了。

ls -R

讲到这里,你也许会发现自己的终端已经满满当当的了,看着不舒服,这时可以使用 clear指令来清屏,运行结果如下。

clear

以上讲的所有指令,都是无害指令,这里的无害指的是不会对系统文件造成破坏,但是还有一些指令,可以瞬间删掉你的整个系统,若你知道这些指令的用法那也没问题,但若是不小心根据网上的教程用了从而误删了东西就不好了。内核为了确保你知道某些指令的用法,要求你必须在这些有风险的指令前加输 sudo,这就是所谓的超级管理员指令,它会在你密码确认后,赋予 sudo 之后的命令最高权限,可以进行任何操作。

比如我需要把电脑上的 Windows 分区彻底删除时,只需要输入下面这串代码,一瞬间整个磁盘分区就会被删除:

sudo diskutil eraseVolume free none diskx

关联阅读:如何彻底移除你的 Boot Camp 分区?[1]

到这里为止,终端的非常基础教学就已经讲完了,这只是略过了终端海量指令中最常见的一小部分,毕竟终端控制的是整个系统的内核,其指令库非常之大,没有办法全部讲完。那么,当你在网上见到一个新命令的时候,怎么知道它该如何用?你可以使用 man 指令查看其用法,比如,当你见到了一个磁盘管理命令 diskutil,可以使用 man diskutil来查看这个磁盘管理命令的具体用法说明,想要退出这个说明按下键盘 Q 即可。

man

若你使用的是带有触控条的 Mac,可以点按触控条按钮进行快速更改终端颜色,添加书签等操作。

触控栏更改颜色

若你想要完全自定义终端,可以在「终端 - 偏好设置 - 描述文件」中进行更改。

自定义

常见玩法

关闭崩溃报错

有时软件崩溃就已经很让人烦心了,重新打开后一遍遍弹出的问题报告更是烦不胜烦。这时你可以使用 defaults write com.apple.CrashReporter DialogType none 命令关闭这个问题报告。若你希望恢复其显示,可以输入 defaults write com.apple.CrashReporter DialogType crashreport

修改文件日期

有时你可能需要修改文件创建或修改日期,这时可以使用 touch -t 199505090000 拖入文件命令。这句命令中的数字表示 1995 年 5 月 9 日 00:00 分,你可以根据实际需要修改。

任意修改文件日期

不要进入休眠状态

当你临时不希望电脑进入休眠状态时,可以使用 caffeinate 命令让电脑时刻清醒。当你需要其恢复正常时,按下 ⌃Control - C 即可停止该命令。

caffeinate

程序假死需要强退

有时候程序假死了,强行退出也没用,这时可以使用 killall 命令。以微信为例,若想强退它,只需输入 killall WeChat 即可。

killall

截图保存为 JPEG

Mac 的默认截图格式为 PNG,若你想让默认的截图保存类型为 JPEG,可以输入如下指令 defaults write com.apple.screencapture type jpg,结果如下图所示,以后的截图都会变成 JPEG 格式。如果你希望撤销这条指令,输入 defaults write com.apple.screencapture type png 即可。

运行命令后所有截图均为 JPEG

关闭截图自动阴影

若你使用 Mac 自带的截图,会发现每次的窗口截图均会自动添加阴影,当你需要后期处理这些图片时,这些阴影可能会对你造成困扰。你可以使用下面这串命令来关闭截图阴影:

defaults write com.apple.screencapture disable-shadow -bool true; killall SystemUIServer

当你希望重新启动阴影时,可以输入:

defaults write com.apple.screencapture disable-shadow -bool false; killall SystemUIServer

查看下方的截图,你就会发现它和本文的其他截图不同,没有阴影。

关闭阴影后的截图

显示隐藏文件夹

在你跟着网络上的教程进行一些操作时,难免会遇到让你寻找隐藏文件夹的情况,这时你可以使用:

defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder

来显示所有隐藏文件夹,当你不需要再显示时,输入:

defaults write com.apple.finder AppleShowAllFiles -bool false; killall Finder

即可恢复隐藏。查看下图,你会发现所有隐藏文件夹全部显示出来了。

显示隐藏文件夹

整理程序栏

你也许会发现,底部的程序栏越用越乱,有时候内容多的半天找不到所需程序。这时你可以考虑为其加入几个隐藏的分界符将其归为几个区域,输入:

defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock

即可添加一个空白分界符,需要几个重复运行几遍命令即可。当你不需要这个白分界符了,将它从程序栏拖走即可删除。

为程序栏加分界符

重置程序栏

当你想要重新整理底部程序栏时,有时候从默认状态开始整理也许是个好办法。这是你可以使用 defaults delete com.apple.dock; killall Dock 命令将程序栏恢复为电脑刚刚激活时的状态。

恢复后的状态

打印机械感十足的文字

当你想要打出机械感十足的文字时,可以玩玩banner -w 80 legolas.me这句命令,只需要将代码结尾处的文字替换为你想打印的字即可。

打印文字

进阶教程

上面讲了不少指令,你也许会好奇,这些指令到底修改的是什么?可以修改什么?若我想改别的,应该去哪里找?

默认设置 defaults

上面这些 defaults 开始的指令,实际修改的是系统默认的 Plist 表单,这些表单管理着系统中全部程序的默认设置,上面所做的修改无非是改了某些程序的默认设置罢了。

若你想查看还有哪些可以修改,可以在访达中按下键盘 ⌥Option,点击「前往 - 资源库」,找到 Perference 文件夹,你会发现所有的 Plist 文件均在这里,你也可以根据便好手动修改。

Perference 文件夹

文件格式转换 textutil

textutil 是一个系统自带的,用于处理文稿的命令,其中我最常用的功能是其下属功能 convert,这句指令允许你将任何文件,在以下文件格式中互相转换 txt, html, rtf, rtfd, doc, docx, wordml, odt, webarchive。

若你手头有一篇 DOCX 文件需要被转换成 TXT,则可以输入 textutil -convert txt 文件路径,这句代码中的 txt 处,可以替换为任何你需要转换到的文件格式,文件路径则可以采用拖拽文件到终端的方法自动填充。

textutil -convert

磁盘处理 diskutil

磁盘处理也是常用的命令行操作之一,因为其命令需要根据具体情况具体对待,所以我只简单介绍其中无风险的两个,下方列举的其余操作均会直接处理磁盘内容,请务必清楚你在做什么,然后再输入命令。

若你的电脑采用的是 APFS 磁盘分区,则应使用 diskutil apfs 开头的命令;若你的电脑采用的是 HFS,HFS+ 磁盘分区,则应使用 diskutil 开头的命令;若你的电脑采用的是 coreStorage 磁盘分区,则应使用 diskutil cs开头的命令。

diskutil list 命令会将你的现有磁盘状况显示出来,如下图所示。

diskutil list

diskutil cs list 命令会将你的现有的 Core Storage 逻辑分区状况显示出来,如下图所示。

diskutil cs list

常用但有风险的命令 diskutil

  • 查看分区上限:sudo diskutil resizeVolume /dev/disk1s3 limits
  • 重置空间大小:sudo diskutil resizeVolume /dev/disk1s2 100GB
  • 断开驱动器:sudo diskutil unmountDisk force /dev/disk1
  • 彻底移除逻辑磁盘: diskutil unmount /Volumes/Macintosh\ HD
  • 显示 GUID 分区结构:gpt -r show /dev/disk1
  • 删除 EFI NO NAME:gpt remove -I 4 /dev/disk1
  • 新增存储区块:gpt add -I 3 -b 1362424032 -s 1269536 -t 426F6F74-0000-11AA- AA11-00306543ECAC
  • 新增分区:newfs_hfs -J -v “Recovery HD” /dev/disk0s3
  • 物理 Core Storage 扩容: diskutil cs resizeDisk 11111111-2222-3333-4444-555555555555 980g
  • 逻辑 Core Storage 扩容: diskutil cs resizeVolume 11111111-2222-3333-4444-555555555555 980g

自动安装 brew

Mac 有个很方便的包管理器,名叫 Homebrew[2],它允许你自动安装许多应用程序。Homebrew 不是 terminal 的自带内容,需要运行这串命令来进行安装:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

使用 brew 命令前需要安装 Homebrew

安装完成后你可以直接使用 brew cask install 软件英文名 等命令来快速安装需要的软件。Homebrew 在少数派已经有不少介绍了,因此这里不再详述。

关联阅读:9 条进阶命令,把 HomeBrew 打造成第三方应用的 App Store[3];Mac 上高质量的开源应用,你可以在这里一次找到[4]

文件删除 rm

这一指令本是 删除文件 用的,但正因为它可以不分敌我的删除任何文件,新手误用有极大风险,因此我不打算详细介绍这个。网上有一个臭名远扬的传言,欺骗别人用 sudo rm -rfv /Cool 来删除系统文件,从而使整个系统崩溃,这条命令绝对不要尝试。

我们来用前面学到的知识分析一下为什么这句命令会使得系统崩溃。首先 sudo 表示管理员命令并获取最高权限,rm 表示删除文件,用 man rm 命令查看手册,可以发现 -r 是用来修饰 rm 命令的,表示删除当前工作路径下的全部子文件,-f 也是修饰 rm 命令的,表示无视被保护的文件依旧执行删除。

前文在讲默认路径时提到,打开终端之后默认工作路径正是当前用户的根目录,因此执行 sudo rm -rfv /Cool 后,会从根目录开始,无视被保护的文件并且删除当前路径下的所有文件及子文件夹,包括系统文件,这样一来系统就废了。

既然谈到了这个代码的破坏力,我索性用与 Mac 同源的 fedora 系统在虚拟机上跑了一遍,下图是跑代码前:

虚拟机 fedora 中运行破坏代码

下图是跑代码后,遇到了一个小问题,下面这张截图已经是在 Mac 上了。你仔细观察可以发现截图里的复制窗口前面的图标损坏了,这是因为当我在虚拟机中运行此破坏代码时,Parallel Desktop 实际并没有将 fedora 系统独立于沙盒中。

半分钟后我发现了这个问题但为时已晚,这个小实验直接破坏了我正在使用的 Mac 系统并造成超过 100 GB 文件丢失,许多系统软件已无法正常运行,万幸访达等核心功能还可以正常工作。为了修复这个错误,我不得不评估损失,备份文件以及重装系统。

直接对 Mac 造成无法挽回的破坏

至于什么是沙盒,什么是虚拟机,这是另一个话题了,若你有兴趣可以在本文下方评论。简单来说,虚拟机可以在在工作电脑中模拟一个独立运行环境,使用它,可以允许你在一个系统的同时运行另一个系统。沙盒是一种保护机制,保证了当前在虚拟机中运行的任何内容不会影响工作机本身。

这个在虚拟机 Fedora 中运行的破坏代码的实验本来不应该破坏我正常使用的 Mac 系统,最终导致 Mac 被破坏时由于 Parallel Desktop 这个软件默认虚拟机不开启沙盒模式导致的惨剧。

其它命令

当然命令远不止上面所提到的这些,常见的还有 cp复制文件;mv 移动文件;mkdir 创建目录;cat 显示文件内容等等,这里就不再一一介绍了。若你有兴趣可以阅读下面这篇文章,里面有每个命令的详细介绍。

写在文后

如本文开头所说,终端是衔接内核和用户界面的桥梁,可易可难。你可以用它学习简单的轻度操作,来帮你节省时间,让电脑为你优化;也可以深入学习,定制整个系统的细枝末节

如果你曾经惧怕终端不敢点开,那么读完本文之后,你也许有了尝试新命令的冲动,这没问题,绝大部分命令完全无害,每个人都可以尝试。但切记,终端不是玩具,请怀有一颗敬畏之心,确定代码无害后再运行,因为终端中严重误操作的后果往往是无法挽回的。


Chrome 81 正式发布 !消灭混合内容最后一步~

Chrome 81 于前天正式发布了,这个版本其实最初是计划在 3 月 17 号 发布的,但由于冠状病毒(COVID-19)爆发而导致推迟到了现在。Chrome 81 的延迟也扰乱了 Google 正常的六周发布时间表。因此 Google 此前也宣布,下一个版本将直接跳过 Chrome 82 ,直接发布 Chrome 83。 下面我就来带大家看看 Chrome 81 有哪些重要的更新。

发布于:1月以前  |  111次阅读  |  详细内容 »

当浏览器全面禁用三方 Cookie

苹果公司前不久对 Safari 浏览器进行一次重大更新,这次更新完全禁用了第三方 Cookie,这意味着,默认情况下,各大广告商或网站将无法对你的个人隐私进行追踪。而微软和 Mozilla 等也纷纷采取了措施禁用第三方 Cookie,但是由于这些浏览器市场份额较小,并没有给市场带来巨大的冲击。

发布于:1月以前  |  98次阅读  |  详细内容 »

H5 直播的疯狂点赞动画是如何实现的?

直播有一个很重要的互动:点赞。 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: 点赞动作无限次,引导用户疯狂点赞 直播间的所有疯狂点赞,都需要在所有用户界面都动画展现出来(广播用户使用websocket消息)

发布于:1月以前  |  94次阅读  |  详细内容 »

探索 Serverless 中的前端开发模式

最近关于 Serverless 的讨论越来越多。看似与前端关系不大的 Serverless,其实早已和前端有了渊源,并且将对前端开发模式产生变革性的影响。本文主要就根据个人理解和总结,从前端开发模式的演进、基于 Serverless 的前端开发案例以及 Serverless 开发最佳实践等方面,与大家探讨 Serverless 中的前端开发模式。本人也有幸在 QCon2019 分享了这一主题。

发布于:1月以前  |  123次阅读  |  详细内容 »

前端需要了解的9种设计模式

设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。

发布于:1月以前  |  104次阅读  |  详细内容 »

为什么你的网页需要 CSP?

内容安全策略(CSP)是一个 HTTP Header,CSP 通过告诉浏览器一系列规则,严格规定页面中哪些资源允许有哪些来源, 不在指定范围内的统统拒绝。

发布于:1月以前  |  94次阅读  |  详细内容 »

10 种跨域解决方案(附终极方案)

嗯。又来了,又说到跨域了,这是一个老生常谈的话题,以前我觉得这种基础文章没有什么好写的,会想着你去了解底层啊,不是很简单吗。但是最近在开发一个 「vscode 插件」 发现,当你刚入门一样东西的时候,你不会想这么多,因为你对他不熟悉,当你遇到不会的东西,你就是想先找到解决方案,然后通过这个解决方案再去深入理解。

发布于:1月以前  |  151次阅读  |  详细内容 »

移动 Web 最佳实践(干货长文,建议收藏)

笔者在公司用 web 技术开发移动端应用已经有一年多的时间了,开始主要以 vue 技术栈配合 native 为主,目前演进成 vue + react native 技术架构,vue 主要负责开发 OA 业务,比如报销、出差、crm 等等,react native 主要负责即时通信部分,是在 mattermost-mobile的基础上修改的(mattermost 是一个开源的即时通讯方案)。

发布于:1月以前  |  110次阅读  |  详细内容 »

不可错过的实用前端工具

给大家整理了 25 个前端相关的学习网站和一些靠谱的小工具,包括一些小游戏、教程、社区网站和博客,以及一些资源网站,希望可以帮助到大家!

发布于:1月以前  |  101次阅读  |  详细内容 »

理解 WebView

我们通常使用 Chrome, Firefox, Safari, Internet Explorer 和 Edge 等浏览器来浏览网页。你也许正在使用其中一种浏览器阅读本文!虽然浏览器对于访问互联网内容的任务来说非常流行,它们还有一些我们从未过多关注过的竞争对手。这些竞争对手以 WebView 的形式被我们所熟知。这片文章将讲解 WebView 的神秘之处以及为什么它这么棒。

发布于:1月以前  |  104次阅读  |  详细内容 »

Facebook 前端技术栈重构分享

当我们考虑如何构建一个新的网络应用—一个为现代浏览器设计的、具有用户对Facebook(我们已知的)所有期望的功能,我们现有的技术栈无法支持我们所需要的类似于桌面应用的感觉和性能。

发布于:1月以前  |  102次阅读  |  详细内容 »

最多阅读

为Electron程序添加运行时日志 1年以前  |  4838次阅读
初探 React 组件 1年以前  |  2176次阅读
wordpress标签页的制作 1年以前  |  2063次阅读
Node.js下通过配置host访问URL 1年以前  |  2004次阅读
js动态创建类和实例化 1年以前  |  1990次阅读
500行PHP代码搞定富文本安全过滤 1年以前  |  1961次阅读
22个HTML5的初级技巧 1年以前  |  1914次阅读
使用 SRI 增强 localStorage 代码安全 1年以前  |  1905次阅读
浅谈浏览器的原生拖拽事件 1年以前  |  1873次阅读
第三版主题上线 1年以前  |  1870次阅读
CSS清除浮动 1年以前  |  1858次阅读
2014年度总结 1年以前  |  1812次阅读
【译】V8 团队眼中的 ES6、ES7及未来 1年以前  |  1803次阅读
利用服务器返回header来传输数据 1年以前  |  1792次阅读
获取元素的计算的样式 1年以前  |  1791次阅读