42

玩转 Terminal 终端:入门指南及进阶技巧

 5 years ago
source link: http://sspai.com/post/45534?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

jm6vAjy.png!web 电影中常常出现的情景

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

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

什么是终端?

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

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

JjyIj2n.jpg!web

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

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

如何打开终端?

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

miQvyii.gif 快速打开终端

基础知识

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

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

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

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

ZbUVf2R.png!web 命令的组成

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

VJnMVv7.png!web echo

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

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

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

byaI3me.png!web pwd

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

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

QJFbIva.png!web cd /

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

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

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

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

AZvuuiN.png!web cd ./

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

36NJFvi.gif 拖入快速提取路径

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

UBRbmuf.png!web ls -R

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

IBz2IrM.png!web clear

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

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

sudo diskutil eraseVolume free none diskx

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

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

iaURbyr.png!web man

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

FzyQbyE.png!web 触控栏更改颜色

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

uUzaay3.jpg!web 自定义

常见玩法

  • 关闭崩溃报错: 有时软件崩溃就已经很让人烦心了,重新打开后一遍遍弹出的问题报告更是烦不胜烦。这时你可以使用 defaults write com.apple.CrashReporter DialogType none 命令关闭这个问题报告。若你希望恢复其显示,可以输入 defaults write com.apple.CrashReporter DialogType crashreport
7FjMbyI.png!web 烦人的崩溃提醒
  • 修改文件日期: 有时你可能需要修改文件创建或修改日期,这时可以使用 touch -t 199505090000 拖入文件 命令。这句命令中的数字表示 1995 年 5 月 9 日 00:00 分,你可以根据实际需要修改。
FNRNbma.png!web 任意修改文件日期
  • 不要进入休眠状态: 当你临时不希望电脑进入休眠状态时,可以使用 caffeinate 命令让电脑时刻清醒。当你需要其恢复正常时,按下 ⌃Control - C 即可停止该命令。
Uf6RVz3.png!web caffeinate
  • 程序假死需要强退: 有时候程序假死了,强行退出也没用,这时可以使用 killall 命令。以微信为例,若想强退它,只需输入 killall WeChat 即可。
fiqEFne.png!web killall
  • 截图保存为 JPEG: Mac 的默认截图格式为 PNG,若你想让默认的截图保存类型为 JPEG,可以输入如下指令 defaults write com.apple.screencapture type jpg ,结果如下图所示,以后的截图都会变成 JPEG 格式。如果你希望撤销这条指令,输入 defaults write com.apple.screencapture type png 即可。
7fyQJnb.jpg!web 运行命令后所有截图均为 JPEG
  • 关闭截图自动阴影: 若你使用 Mac 自带的截图,会发现每次的窗口截图均会自动添加阴影,当你需要后期处理这些图片时,这些阴影可能会对你造成困扰。你可以使用下面这串命令来关闭截图阴影:
    defaults write com.apple.screencapture disable-shadow -bool true; killall SystemUIServer
    当你希望重新启动阴影时,可以输入:
    defaults write com.apple.screencapture disable-shadow -bool false; killall SystemUIServer
    查看下方的截图,你就会发现它和本文的其他截图不同,没有阴影。
iamqAfn.jpg!web 关闭阴影后的截图
  • 显示隐藏文件夹: 在你跟着网络上的教程进行一些操作时,难免会遇到让你寻找隐藏文件夹的情况,这时你可以使用:
    defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder
    来显示所有隐藏文件夹,当你不需要再显示时,输入:
    defaults write com.apple.finder AppleShowAllFiles -bool false; killall Finder
    即可恢复隐藏。查看下图,你会发现所有隐藏文件夹全部显示出来了。
bqeI3uF.jpg!web 显示隐藏文件夹
  • 整理程序栏: 你也许会发现,底部的程序栏越用越乱,有时候内容多的半天找不到所需程序。这时你可以考虑为其加入几个隐藏的分界符将其归为几个区域,输入:
    defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
    即可添加一个空白分界符,需要几个重复运行几遍命令即可。当你不需要这个白分界符了,将它从程序栏拖走即可删除。
aA3i6re.jpg!web 为程序栏加分界符
  • 重置程序栏: 当你想要重新整理底部程序栏时,有时候从默认状态开始整理也许是个好办法。这是你可以使用 defaults delete com.apple.dock; killall Dock 命令将程序栏恢复为电脑刚刚激活时的状态。
ZJB73aQ.png!web 恢复后的状态
  • 打印机械感十足的文字:当你想要打出机械感十足的文字时,可以玩玩 banner -w 80 legolas.me 这句命令,只需要将代码结尾处的文字替换为你想打印的字即可。

    77nqQf6.png!web 打印文字

进阶教程

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

默认设置 defaults

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

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

673INjj.jpg!web Perference 文件夹

文件格式转换 textutil

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

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

Y7ZnyqA.gif textutil -convert

磁盘处理 diskutil

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

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

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

RZFvqez.jpg!web diskutil list

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

aUvi6fi.png!web 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 ,它允许你自动安装许多应用程序。Homebrew 不是 terminal 的自带内容,需要运行这串命令来进行安装:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
AbQBneJ.png!web 使用 brew 命令前需要安装 Homebrew

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

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

文件删除 rm

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

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

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

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

3MJJVb2.jpg!web 虚拟机 fedora 中运行破坏代码

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

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

QV3uyym.jpg!web 直接对 Mac 造成无法挽回的破坏

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

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

其它命令

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

关联阅读: 每天一个linux命令

写在文后

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

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

> 开启 macOS 隐藏功能,就在专题轻松玩转 Mac 命令 :computer:

> 下载少数派 iOS 客户端、关注少数派公众号,让智能设备更好用 :zap:️


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK