[机派X] Day 3 - Bash 是啥东东

引言

今天是机派X系列文章的第三天。
昨天在树莓派上成功安装了 Ubuntu Server,今天让我们开始探索 Ubuntu 吧!
本篇将介绍 Ubuntu 的基本概念与操作,前面的部份会比较生硬一点,後面会有较多的实机操作。

本篇大纲:

  • 引言
  • 命令列界面与图形化使用者界面
  • 从本地端登入 Ubuntu Server
  • Shell 是什麽?
  • Bash 的基础概念
  • 关於本文章系列

命令列界面与图形化使用者界面

通常作业系统依照与使用者的互动形式可以分成两种:命令列界面(Command Line Interface , CLI)与图形化使用者界面(Graphical User Interface , GUI)。命令列界面基本上就是使用者透过键盘直接下指令(Command , CMD)给电脑执行,并由电脑输出回应的文字讯息,是较早期开发出来的的互动模式;而图形化使用者界面则是以图像为基础,使用者可以透过滑鼠操作图像与电脑互动,并直接从图像化的结果得知程序执行的状况,较晚期才被开发出来,也较为一般使用者所接受。

看的一头雾水吗?以大家熟知的微软(Microsoft , MS)系列产品为例:
下图是微软的产品 MS-DOS 6.22 执行画面截图,透过键盘下指令(CMD)就能控制电脑。
要跟电脑互动,就要知道指令怎麽下!!
MS-DOS 6.22 执行画面截图

下图是微软的 Windows 7 执行画面截图,就是大家熟悉的图形化使用者界面,只要透过滑鼠点击、拖动就可以完成许多事。
Windows7 执行画面截图

通常,一般电脑使用者都是使用图形化使用者界面较多,因为界面美观、操作方便。
然而,命令列界面虽然看起来丑、使用上要记指令,但是其高效、方便、简洁等优点,成为特定应用的首选。

听起来怪怪的吗?又丑又要记东西,命令列界面竟然还有人用?甚至是首选?
别着急,让我们继续看下去!
让我们继续看下去
图源传送门

服务器(Server)就是呈现命令列界面优点的最佳舞台之一,通常在 Server 上最常使用到的是 CLI 而非 GUI。
原因是 Server 通常是服务的提供者,同时可能会有多个使用者连上 Server 进行操作,这些使用者通常身处各地,透过网路与 Server 连接。由於 CLI 仅须传输使用者输入的指令或电脑的回覆(文字),因此相对於以图行为基础的 GUI 来说,比较不容易受到网路品质的影响,也能减少 Server 系统资源的占用。另外,CLI 模式底下,可以将多条指令(CMD)排列在一起,并制作成一个档案後让电脑定期执行,这样有助於管理员管理 Server。

从本地端登入 Ubuntu Server

因为我们安装的是 Ubuntu Server,所以没有图形化使用者界面(GUI),只有命令列界面(CLI)可以使用。
图形化使用者界面的部份之後会教大家安装,现在先学习命令列界面的使用。
因为如果一开始就下载预装 GUI 的 Ubuntu Desktop,我想应该不会有人想学 CLI 了!

请将树莓派接上萤幕、键盘、并插入记忆卡,再提供电源让树莓派开机。
树莓派成功开机完成後,会看到以下画面。
Ubuntu Shell 登入画面

这就是 Ubuntu Server 的 CLI 的使用者登入画面:

Ubuntu 20.04.2 LTS ubuntu tty1
ubuntu login:

使用者可以输入使用者名称(Username)和密码(Password)登入 Ubuntu,登入後才能使用各种指令(Command , CMD)与功能。
就像你使用 Windows 时,进入桌面、可以自由操做电脑前,你会需要选择使用者(User)与输入密码(Password)一样。
Windows10 登入画面

Ubuntu 有预先创建一个使用者,使用者名称为 ubuntu,而密码为 ubuntu。
我们可以使用这个使用者登入系统,之後再创建我们自己的使用者!

透过键盘键入使用者名称 ubuntu 并按下 Enter。

Ubuntu 20.04.2 LTS ubuntu tty1
ubuntu login: ubuntu

此时,会询问使用者 ubuntu 的密码,请一样输入 ubuntu。
基於安全考量,密码在输入时不会被显示出来,输入完後一样按下 Enter 即可。

Ubuntu 20.04.2 LTS ubuntu tty1
ubuntu login: ubuntu
Password: 输入的密码不会显示

如果使用者名称与密码配对无误,就可以成功登入。

登入後你会看到最下面一行显示如下。
至於这是什麽意思呢?我们将在之後一探究竟!

ubuntu@ubuntu:~$

注意:
在 Windows 系统中是不区分大小写的(Case Insensitive , CI);然而,在 Linux 系统中(当然包含 Ubuntu)是区分大小写的(Case Sensitive , CS)。因此在 Windows 上输入档名、路径、变数名等东西时,你可能没有注意大小写就直接输入,然而这样的习惯在 Linux 中却会造成大问题。例如:要读取图片 Cat.jpg,在 Windows 中你可以输入 cat.jpg,程序依然会成功执行,然而这在 Linux 中却会被判别为 cat.jpg 不存在。

Shell 是什麽?

在 Linux 中,我们将它的命令列界面(CLI)称为 Shell,正如同前面提到的,CLI(也就是 Shell)是我们与 Ubuntu 互动的桥梁,只要在 Shell 中输入指令就可以操作电脑。

登入前的画面中,有一个词:tty1 不知道你有没有注意到?

Ubuntu 20.04.2 LTS ubuntu tty1
ubuntu login:

如果有 tty1 那是否有 tty2 呢?
Answer:有,总共有 tty1 ~ tty7

其实每一个 tty 都是一个 shell,你一共有 7 个 shell 可以使用。
为什麽要有 7 个呢?
简答:为了让你多工操作时比较方便。

通常,我们向 shell 每输入一条指令,都要等该指令执行完成後,shell 才能接受下一条指令。
为了能够方便使用者同时执行多条指令,因此有 tty1 ~ tty7 共计 7 个 shell 可以使用,这些 shell 彼此互相独立、各自接受使用者输入的指令工作,我们可以让 tty1 复制档案,在复制的过程中,我可以切换到 tty2 同时从网路上下载档案,甚至还可以再切换到 tty3 监控系统各个资源的使用。

透过键盘上的 Ctrl + Alt + Fx 你就可以在不同 shell 间来回切换。
例如:Ctrl + Alt + F1 可以切换到 tty1。
例如:Ctrl + Alt + F2 可以切换到 tty2。
以此类推。

虽然刚刚都只有说 Shell,但是其实 Shell 还分很多种。
最常用的,也是 Ubuntu 内建且预设使用的 Shell,就是 Bash。
其实天底下 Shell 一大堆,但是只要搞清楚一个,其他的就容易了,因为基础概念是一样的。

你可以想像,这就好比你可以使用网页浏览器(Web Browser)浏览网页(Website),然而浏览器又分很多种,例如:Firefox、Google Chrome、Microsoft Edge、Opera 等。Shell 也是一样的道理!虽然各有特色,但是只要你会用其中一个,想要跳槽改用另一个浏览器应该不会太困难。

觉得资讯量有点过多了吗?
Too much information to me
图源传送门

Bash 的基础概念

接下来,要介绍 Bash 的基本概念,了解 Bash 的概念之後才能活用指令。虽然以下看起来像是针对 Bash 的说明,但是大多数的概念可以被套用在其他 Shell 上。
当你选择 tty1 ~ tty7 中的一个 Shell 成功登入後,Bash 会被载入,就可以看到一些欢迎讯息以及最後一行(如下引文),让我们来解析这行的意思。

Note :
为了让颜色更清楚,我让字体加粗并加了空白。

ubuntu @ ubuntu : ~ $

下表的 Column 1 将上方的文字分离出来做说明,Column 2 说明这个文字所指向的用途,Column 3 针对用途的部份做详尽的解释。

例子 用途 说明
ubuntu 使用者名称 Username 登入这个 Shell 的使用者名称。
ubuntu 主机名称 Hostname 这台电脑主机的名称,预设是 ubuntu。
~ 工作目录 Working Directory 当前工作目录的路径。

| $ | 提示符 Prompt | 表示 Bash 已就绪,可以输入下一条指令了。 |

前两个应该很好理解,Shell Login 时你输入的使用者名称就会显示在 @ 前,而 @ 後则会显示当前使用的电脑名称,而在这边正好是 ubuntu。其实你可以将 ubuntu@ubuntu 解读为:ubuntu at ubuntu,在 ubuntu 这台电脑上,有个使用者叫 ubuntu。也许你听起来觉得饶舌,之後我们会修改使用者名称与主机名称,听起来就会舒服很多。

而工作目录(Working Directory)则是 CLI 中很重要的概念、在 GUI 中虽然也有,但是较没有那麽关键。在 Linux 中,我们常常会把资料夹(Folder)称为目录(Directory),而工作目录就是:「你下指令时,所在的目录位置」。

在详细谈工作目录前,我们要先复习 CLI 并介绍档案路径的概念。我们知道 CLI 透过使用者输入指令(CMD)与电脑互动,有些指令是要对档案做操作(例如:复制档案),此时我们会需要提供档案的所在位置(Location)以及档名(Filename),而档案所在位置加上档名就会形成档案的完整路径(File Path)。指定档案路径(File Path)有两种方法,一种是绝对路径(Absolute Path),另一种是相对路径(Relative Path)。如果对於这两种路径表示法不熟的话,可以搜寻一下相关资料,或参考 这篇文章 的描述。

Note :
Windows 与 Linux 的路径表示中,斜线的方向不一样。Windows 采用反斜线(Back Slash),而 Linux 采用正斜线(Slash)。
一个相对路径在 Windows 中可表示为: Documents \ salary \ 110_March.xls
一个相对路径在 Linux 中可表示为: Documents / salary / 110_March.xls

而工作目录的用途之一,就是作为相对路径的参考路径。

上面的案例中,工作目录是 ~,而在 Bash 中 ~ 代表家目录(Home Directory)。
家目录牵涉到 Linux 的档案系统架构,之後会再深入介绍。

最後谈到 $,基本上 $ 没什麽特殊用途,就只是告诉你 Bash is ready!Bash 准备好了,你可以输入下一道指令(CMD)了!
每条指令执行完成後,Bash 都会再次显示刚刚介绍的一连串文字:ubuntu@ubuntu:~$,最後的 $ 就是为了告诉你:可以输入下一条指令罗。

关於本文章系列

如果对於文章内容有建议、纠错或图源标示不正确的问题,欢迎参考 [机派X] Day 1 尝试与文章作者联络。
想看更多本系列的文章,请连结至 [机派X] Day 1 查看大纲。


<<:  突破封锁线的勇气与思维

>>:  Ruby on Rails Controller 是干嘛的

Day-14 Pytorch 的 Gradient 计算

之前我们看过用 Python 计算 Gradient 必须要手动计算偏微分之後,才有办法算出 那如...

[Day 02] 建立开发环境,做好行前准备

老套说:「工欲善其事,必先利其器」— 要写网页,就不能没有好用的开发环境。在开始认识各种前端技能之前...

[DAY 07]查询各国物品名称

昨天写完查询物品拍卖价格网址後发现...既然都有各国物品名称了 乾脆多做一个查询各国物品名称并附上W...

Day23 Portal

Portal为不产生parent节点的情形下,将children渲染到DOM节点上面的方法。起手的宣...

24. 解释 immutable / immutability

mutable vs. immutable 在开始说明前,先复习一道题目: var a = {}; ...