Linux-树莓派系统实践指南-全-

Linux 树莓派系统实践指南(全)

原文:Practical Linux with Raspberry Pi OS

协议:CC BY-NC-SA 4.0

一、树莓派简介

我希望你已经看完了目录和简介。如果没有,我强烈建议你浏览一下。这是这本书的第一章,我欢迎你们来到用 Raspberry Pi 操作系统学习 Linux 的激动人心的旅程。

在这一章中,我们将详细了解当今最流行的平台和单板计算机家族 Raspberry Pi。然后我们将学习一些关于 Linux 的知识,以及广泛用于 Raspberry Pi 家族的 Linux 发行版(以下,我将使用缩写 RPi),Raspberry Pi 操作系统。我们将学习如何在 RPi 板上安装它。以下是我们将在本章学习的主题列表:

  • 单板计算机

  • 树莓派

  • Linux 和发行版

  • Raspberry Pi 操作系统设置

  • 配置 RPi 板

  • 将各种 RPi 板模型连接到互联网

学完本章后,我们将会对 RPi 板和 RPi 操作系统的安装和基本用法很熟悉。

单板计算机

单板计算机(也称为 SBC)在一块印刷电路板上集成了一台全功能计算机的所有组件,如处理器、GPU、RAM 和 I/O。这与台式机或笔记本电脑不同,台式机或笔记本电脑的主板上有各种插槽,分别用于 RAM、处理器和显卡。台式机或笔记本电脑可以通过更换处理器和显卡来升级。我们还可以在内存插槽中添加更多的内存芯片。但是,SBC 不能这样升级。这是完全模块化的传统台式机/笔记本电脑与单板机的主要区别之一。单板机缺乏模块化的主要好处是整个计算机的尺寸非常小。大多数 SBC 比普通的信用卡/借记卡稍大一点,而且非常紧凑。

SBC 被用作技术演示器(原型)、教育计算机和嵌入式系统。由于制造工艺和制造技术的进步,最近 SBC 的流行程度激增。我们生活在一个几乎每月都有新的 SBC 或现有 SBC 的新版本发布的时代。市场上充斥着各种 SBC 和 SBC 系列。一些著名的 SBC 家族有 Raspberry Pi、Banana Pro、BeagleBoards 和 Orange Pi。Raspberry Pi 是市场上最受欢迎的单板计算机系列,也是世界上最畅销的计算机之一。在下一节中,我们将概述 Raspberry Pi 系列电脑。

树莓派

树莓 Pi 是树莓 Pi 基金会( www.raspberrypi.org/ )开发的 SBC 家族。它由多个板卡模型组成,在基金会的产品页面( www.raspberrypi.org/products/ )上列出了当前正在生产的所有模型。在整本书中,我将使用带有 4 GB RAM 的 Raspberry Pi 4 Model B(该系列中最新的主板型号)。

表 1-1 列出了树莓 Pi 4 Model B 的规格。

表 1-1

树莓派 4 B 的技术规格

|

成分

|

规格

|
| --- | --- |
| 处理器 | Broadcom BCM2711,四核 Cortex-A72 (ARM v8) 64 位 SoC,1.5 GHz |
| 随机存取存储 | LPDDR4-3200 SDRAM (2 GB 或 4 GB 或 8 GB) |
| 建立关系网 | 2.4 GHz 和 5.0 GHz IEEE 802.11ac 无线,蓝牙 5.0,BLE 千兆以太网 |
| 通用串行总线 | 2 个 USB 3.0 端口、2 个 USB 2.0 端口 |
| 通用输入/输出 | Raspberry Pi 标准 40 引脚 GPIO 接头 |
| 显示 | 2 个微型 HDMI 端口(最高支持 4kp60)双通道 MIPI 显示串口( www.mipi.org/specifications/dsi ) |
| 相机连接器 | 双通道 MIPI 相机串行接口端口 |
| 声音的 | 四极立体声音频和复合视频端口 |
| 辅助存储器 | 用于操作系统和数据存储的 MicroSD 卡插槽 |
| 力量 | 通过 USB-C 连接器的 5 V DC 或通过 GPIO 接头的 5 V DC(最小 3A) |

该系列中有许多型号的主板目前正在生产中,如果您去您家附近的 hobby 电子商店,您可能会发现一些已经停产的旧型号主板,价格很便宜。为了保持简短,我将只在需要时讨论其他模型的技术细节和规格。我们可以在授权零售商处(可以在产品页面找到列表)或亚马逊等热门电子商务网站上购买 Raspberry Pi 板。

图 1-1 显示了一个 RPi 4 B 板。

img/503786_1_En_1_Fig1_HTML.jpg

图 1-1

RPi 4 B 板的照片

图 1-2 显示了 RPi 4 B 的部件示意图。

img/503786_1_En_1_Fig2_HTML.jpg

图 1-2

RPi 4 B 板上的元件

在本书中,我将使用 4 GB RAM 型号的主板解释所有演示。

Linux 和发行版

Linux 是一系列开源的类似 Unix 的免费操作系统。它基于 Linux 内核,这是一个由 Linus Torvalds 开发的免费开源操作系统内核。Linux 操作系统打包在一个 Linux 发行版中。Linux 发行版包括为程序员开发的 Linux 内核和支持系统软件、库和 API。这些组件中的许多都是 GNU 项目的一部分( www.gnu.org/home.en.html ),这也是为什么许多人将 Linux 称为 GNU/Linux 的原因。由于 Linux 是免费和开源的,任何人都可以创建 Linux 的定制发行版。

下面的 URL 有更多关于 GNU 和 Linux 项目的信息:

www.linux.org/

www.gnu.org/

www.fsf.org/

Linux 的前 25 个发行版可以在这里找到:

www.linux.org/pages/download/

树莓派 OS

Raspberry Pi 操作系统是流行的 Linux 发行版 Debian 的衍生物。它由 Raspberry Pi 基金会官方提供,是 SBCs 的 RPi 家族最值得推荐的操作系统。它针对 RPi 主板型号进行了全面优化,并且支持所有主板型号。以前,它被称为 Raspbian 操作系统,是由彼得·格林和迈克·汤普森创建的。在本章中,我们将详细了解如何在 microSD 卡上安装 RPi 操作系统,以及如何使用 microSD 卡启动 Pi 板。关于 OS 的 DistroWatch 页面可以在这里找到: https://distrowatch.com/table.php?distribution=raspios

Raspberry Pi 操作系统设置

正如我们已经看到的,Raspberry Pi 操作系统是 Pi 板的首选操作系统。在本节中,我们将学习如何在 RPi 板上设置 RPi 操作系统。虽然我将在所有演示中使用 RPi 4 B 4 GB 型号,但为了方便读者,我们将讨论基金会生产的所有主板型号的设置过程,计算模块除外。让我们逐一查看设置所需的所有组件:

  1. 我们需要任何型号的 RPi 板。

  2. We need an appropriate power supply. For Raspberry Pi 4 B, we need a USB-C power supply. Figure 1-3 is an image of a USB-C male pin.

    img/503786_1_En_1_Fig3_HTML.jpg

    图 1-3

    USB-C 公接头

    树莓派基金会官方有 RPi 4 B 的 15.3 W 电源,我们可以在 www.raspberrypi.org/products/type-c-power-supply/ 了解更多信息。

    All other models of RPi boards need to be supplied by a micro-USB power supply. Figure 1-4 is an image of a micro-USB male pin.

    img/503786_1_En_1_Fig4_HTML.jpg

    图 1-4

    微型 USB 插头

    树莓派基金会有官方通用电源。我们可以在 www.raspberrypi.org/products/raspberry-pi-universal-power-supply/ 找到更多信息。

  3. We also need a pair of a USB mouse and a USB keyboard. A USB keyboard and mouse combo that uses a sing USB port is preferred. It is available in the form of a keyboard with a built-in mousepad as shown in Figure 1-5.

    img/503786_1_En_1_Fig5_HTML.jpg

    图 1-5

    带有内置鼠标垫的 USB 键盘

    The board models RPi Zero and RPi Zero W have only a single micro-USB port, so this is mandatory for such models if we want to use them with a keyboard and a mouse. Also, for RPi Zero and RPi Zero W, we need a USB to micro-USB OTG converter as shown in Figure 1-6.

    img/503786_1_En_1_Fig6_HTML.jpg

    图 1-6

    一个 USB OTG 转换器

  4. The RPi board models use a microSD card to store OS and data. RPi 1 Model A and RPi 1 Model B use a SD card, and the rest of the models use a microSD card. We can get more information about the SD cards and compatibility at www.raspberrypi.org/documentation/installation/sd-cards.md and https://elinux.org/RPi_SD_cards. I recommend to purchase a class 10 card of 16 GB size. Also purchase a microSD to SD card converter if you are using RPi 1 Model A and RPi 1 Model B. Figure 1-7 is an image of a microSD card with a microSD to SD card converter.

    img/503786_1_En_1_Fig7_HTML.jpg

    图 1-7

    一个 microSD 卡和一个 microSD 到 SD 卡转换器

  5. 我们需要一个 HDMI 或 VGA 显示器来显示。

  6. All the models of RPi boards except the models RPi 4 B, RPi Zero, and RPi Zero W have HDMI output and can be directly connected to a HDMI monitor with a HDMI male-to-male cable. A HDMI male pin is shown in Figure 1-8.

    img/503786_1_En_1_Fig8_HTML.jpg

    图 1-8

    HDMI 男性头

    RPi 4 B has micro-HDMI output. So we need a micro-HDMI to HDMI converter. RPi Zero and RPi Zero W have got mini-HDMI output. So, for them, we need a mini-HDMI to HDMI converter. Figure 1-9 shows us the HDMI, mini-HDMI, and micro-HDMI male pins, respectively.

    img/503786_1_En_1_Fig9_HTML.jpg

    图 1-9

    各种类型的 HDMI 插头

    Figure 1-10 is an image of a HDMI to VGA converter, a mini-HDMI to HDMI converter, and a micro-HDMI to HDMI converter.

    img/503786_1_En_1_Fig10_HTML.jpg

    图 1-10

    各种类型的 HDMI 转换器

    如果我们使用 VGA 显示器,那么我们需要使用上图所示的 HDMI 到 VGA 转换器。

  7. We need a SD card reader. Many laptops have a built-in SD card reader. If your laptop does not have one, you need a separate card reader. Figure 1-11 is a representational image of a SD card reader.

    img/503786_1_En_1_Fig11_HTML.jpg

    图 1-11

    SD 读卡器

  8. 最后,我们需要一台装有 Windows、Linux 或 macOS 操作系统的电脑。

手动准备 SD 卡

建议手动准备 SD 卡,因为它给了我们完全的控制权,我们可以在主板第一次启动之前更改设置。为此,树莓基金会为我们提供了一个名为树莓 Pi 成像仪的工具。可以从 www.raspberrypi.org/downloads/ 下载。它适用于 Windows、Linux 和 macOS。下载并安装在您的操作系统上。一旦你打开它,它显示图 1-12 中的窗口。

img/503786_1_En_1_Fig12_HTML.jpg

图 1-12

Raspberry Pi 成像仪窗口

如图 1-12 所示,我们有一个选择 SD 卡的选项。将 microSD 卡插入读卡器设备或笔记本电脑的读卡器插槽。成像仪会检测到它。然后点击选择 OS 按钮。将打开图 1-13 中的窗口。

img/503786_1_En_1_Fig13_HTML.jpg

图 1-13

选择操作系统的选项

我们可以看到各种操作系统的选项。我们需要选择第二个选项,树莓 Pi OS(其他)。然后显示如图 1-14 所示的选项。

img/503786_1_En_1_Fig14_HTML.jpg

图 1-14

树莓 Pi 操作系统下的更多选择(其他)

选择树莓 Pi OS Full (32 位)。然后点击标有的按钮写。它将开始向 microSD 卡写入操作系统,如图 1-15 所示。

img/503786_1_En_1_Fig15_HTML.jpg

图 1-15

将操作系统写入 microSD 卡

将操作系统写入 microSD 卡后,从 SD 读卡器中安全地取出卡,然后重新插入。在 Windows 操作系统中,它将显示为带有标签 boot 的驱动器。在这个驱动器中,有一个标签为 config.txt 的文件。该文件存储了所有与引导相关的选项,其作用与 BIOS(基本输入/输出系统)初始化引导的方式相同。如果我们使用 HDMI 显示器,我们不必修改设置。但是如果我们使用的是 VGA 显示器,我们需要对几行进行如下修改:

  • #disable_overscan=1改为disable_overscan=1

  • #hdmi_force_hotplug=1改为hdmi_force_hotplug=1

  • #hdmi_group=1改为hdmi_group=2

  • #hdmi_mode=1改为hdmi_mode=16

  • #hdmi_drive=2改为hdmi_drive=2

  • #config_hdmi_boost=4改为config_hdmi_boost=4

  • 保存文件。

默认情况下,注释选项(开头有符号#的选项)是禁用的。我们必须通过移除这些注释行开头的符号#来取消注释它们各自的行,从而启用这些选项。

第一次启动 Pi 板

让我们用准备好的 microSD 卡第一次启动我们的 RPi 板。以下是步骤:

  • 将 microSD 卡插入 RPi 板的 microSD 卡插槽。RPi 1 型号 A 和 RPi 1 型号 B 有 SD 卡插槽。因此,对于这些主板型号,我们必须使用 microSD 至 SD 卡转换器。将 microSD 卡插入 microSD 至 SD 卡转换器,然后将转换器插入 RPi 1 A 型和 RPi 1 B 型 SD 卡插槽。

  • 将 Pi 连接到 HDMI 监控器。如前所述,如果你有一个 VGA 显示器,连接它使用 HDMI 到 VGA 转换器。

  • 连接 USB 鼠标和 USB 键盘。建议带鼠标垫的单键盘。对于 RPi Zero 或 RPi Zero W,您需要首先将其连接到 USB OTG 电缆,然后将 USB OTG 电缆连接到 RPi Zero 或 RPi Zero W 板。

  • 将 RPi 板连接到适当的电源(我们之前已经讨论过)。将显示器也连接到电源。确保此时 RPi 板和监控器的电源已关闭。

  • 检查所有连接一次,然后打开 RPi 和监控器的电源。

在这个阶段,我们的 RPi 板将开始启动。我们会在 Pi 板上看到一个绿灯在闪烁。这意味着它正在启动。祝贺我们第一次成功!

Note

如果 HDMI 监控器显示消息无信号并且没有显示任何视觉输出,则关闭 RPi 板,并将 microSD 卡上文件/boot/config.txt中的行#hdmi_force_hotplug=1更改为hdmi_force_hotplug=1。使用更改后的设置再次启动 RPi,HDMI 监控器肯定会显示输出。

配置 RPi 板

一旦 RPi 第一次启动,它将显示如图 1-16 所示的配置向导窗口。

img/503786_1_En_1_Fig16_HTML.jpg

图 1-16

欢迎窗口

点击 Next 按钮,将出现图 1-17 中的窗口。

img/503786_1_En_1_Fig17_HTML.jpg

图 1-17

国家和语言

在上图中,设置国家语言;它会根据选择的国家自动选择时区。如果我们愿意,我们也可以改变。点击下一步按钮,将出现图 1-18 中的窗口。

img/503786_1_En_1_Fig18_HTML.jpg

图 1-18

更改密码

在这里,我们可以根据需要更改用户 pi 的默认密码。如果我们将其留空,它将保留默认密码。点击下一个按钮,将显示图 1-19 窗口。

img/503786_1_En_1_Fig19_HTML.jpg

图 1-19

设置屏幕窗口

如果黑色边框在桌面视图的边缘可见,请选中该复选框。Raspberry Pi 操作系统会在下次启动时纠正它。只有 RPi 板卡模型有 WiFi,我们点击下一步按钮后,才会出现图 1-20 中的窗口。

img/503786_1_En_1_Fig20_HTML.jpg

图 1-20

WiFi 网络选择窗口

选择你知道凭证的 WiFi 网络,点击下一步按钮,出现图 1-21 窗口。

img/503786_1_En_1_Fig21_HTML.jpg

图 1-21

WiFi 网络密码

输入所选 WiFi 网络的密码,点击下一步按钮。将显示如图 1-22 所示的更新软件窗口。

img/503786_1_En_1_Fig22_HTML.jpg

图 1-22

更新软件窗口

如果我们单击下一个按钮的,那么它将更新 RPi OS。我们将在下一章学习如何手动操作。现在,我们将通过点击跳过按钮跳过这一步。然后将显示图 1-23 中的窗口。

img/503786_1_En_1_Fig23_HTML.jpg

图 1-23

安装完成

这意味着配置是成功的。我们需要在重启前手动配置一些设置,所以稍后点击按钮。

在桌面的左上角,我们看到一个树莓图标。这是 Raspberry Pi 操作系统的菜单,其功能与 Microsoft Windows 操作系统中的 Windows 徽标相同。点击树莓图标,导航到偏好树莓 Pi 配置,如图 1-24 所示。

img/503786_1_En_1_Fig24_HTML.jpg

图 1-24

RPi OS 菜单中的 Raspberry Pi 配置

点击上图所示的选项将打开如图 1-25 所示的配置窗口。

img/503786_1_En_1_Fig25_HTML.jpg

图 1-25

Raspberry Pi 配置窗口

点击“接口”选项卡,将显示如图 1-26 所示的接口选项。

img/503786_1_En_1_Fig26_HTML.jpg

图 1-26

Raspberry Pi 界面窗口

在该窗口中,点击选项摄像头SSHVNC启用单选按钮。然后点击性能选项卡,将显示如图 1-27 所示的性能选项。

img/503786_1_En_1_Fig27_HTML.jpg

图 1-27

树莓 Pi 性能

许多主板型号都禁用了通过该实用程序超频的选项。在这里,我们可以设置 GPU 的内存。我建议设置为 128 MB。GPU 使用这么多的 RAM 作为视频内存(RPi 没有专用的 GPU 内存)。最后点击定位选项卡,将显示定位选项,如图 1-28 所示。

img/503786_1_En_1_Fig28_HTML.jpg

图 1-28

Raspberry Pi 位置

在这里,我们可以根据我们的本地化需求设置选项。

一旦所有这些设置都按照我们的选择进行了更改,我们就可以通过单击 RPi 操作系统中标有 Shutdown 的最后一个按钮来重新启动 RPi 板。打开图 1-29 中的窗口。

img/503786_1_En_1_Fig29_HTML.jpg

图 1-29

Raspberry Pi 关闭选项

只需点击重启按钮,RPi 就会重启。我们所有的更改将在重启完成后生效。如果我们没有更改用户 pi 的默认密码,那么在启动时,会显示图 1-30 中的信息。

img/503786_1_En_1_Fig30_HTML.jpg

图 1-30

引导至桌面后出现 Raspberry Pi 警告消息

将各种 RPi 板模型连接到互联网

我们可以直接将以太网电缆插入 RPi 板上的 RJ45 以太网端口。它会自动检测连接并连接到互联网。只需确保在 WiFi 路由器、受控交换机或互联网网关上启用了 DHCP(动态主机配置协议)。RPi 1 A、RPi 1 A+、RPi Zero、RPi Zero W 和 RPi 3 A+型号没有以太网端口。不过 RPi Zero W 和 RPi 3 A+都内置了连接广域网的 WiFi。我们可以为其余型号使用简单的 USB WiFi 加密狗。图 1-31 是一个 USB WiFi 加密狗的图像。

img/503786_1_En_1_Fig31_HTML.jpg

图 1-31

USB WiFi 转换器

将此 USB WiFi 适配器插入其中一个 USB 端口。如果 USB 端口不够,那么使用一个有电源的 USB 集线器。对于 Raspberry Pi Zero,我们需要将这个加密狗插入 USB OTG 电缆,然后将其插入 RPi Zero 的微型 USB 端口。

插上 USB WiFi 适配器后,我们需要打开 lxterminal 实用程序。它是 RPi OS 的终端命令行实用程序。我们可以在 RPi OS 的任务栏中找到它的黑色小图标,也可以在 RPi OS 菜单的附件中找到它。调用它的另一种方法是按 Ctrl+F2。将出现图 1-32 中的运行窗口。在这里,您可以键入 lxterminal ,然后按键盘上的 Enter 键或单击 OK 按钮。

img/503786_1_En_1_Fig32_HTML.jpg

图 1-32

运行窗口

lxterminal 是 Raspberry Pi 操作系统的终端仿真器,图 1-33 是它的一个实例的屏幕截图。

img/503786_1_En_1_Fig33_HTML.jpg

图 1-33

lxterminal 的屏幕截图

在这里,我们可以输入 Linux 命令;在输入之后,我们必须按回车键来执行当前命令。让我们使用它来手动配置网络。这也将为您提供使用 lxterminal 的良好实践,我们将在本书中主要使用 LX terminal。

所有与网络相关的信息在/etc/network/interfaces存储在一个文件中。在这个阶段不要太麻烦自己。从下一章开始,我们将详细了解所有这些事情。要在插入 USB WiFi 加密狗后连接到 WiFi,我们需要向我提到的这个文件添加几个条目。首先,通过在 lxterminal 中执行以下命令来备份原始文件:

mv /etc/network/interfaces /etc/network/interfaces.bkp

然后,我们可以通过运行以下命令从头开始创建网络接口文件:

sudo nano /etc/network/interfaces

前面的命令将使用名为 nano 编辑器的纯文本编辑器打开网络接口文件。它是一个简单的所见即所得 ( 所见即所得)明文编辑器。在那里输入以下几行:

source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "AshwinIon"
wpa-psk "internet1"

输入线条后,按下 Ctrl+X ,然后输入 Y 。在前面的设置中,将 AshwinIon 替换为您自己的 SSID,将 internet1 替换为同一 WiFi 网络的密码。然后在命令提示符下运行以下命令:

sudo service networking restart

它将重新启动网络服务并连接到 WiFi。在任何情况下(以太网或 WiFi),RPi 都分配有唯一的 IP 地址。我们可以通过在 lxterminal 运行 Linux 网络命令ifconfig找到它。该命令的输出将包含 RPi 板的 IPV4 和 MAC 地址。

了解 RPi is 地址的另一种方法是检查与 RPi 板连接的 WiFi 路由器或受控交换机中的活动客户端列表。图 1-34 是我的 WiFi 路由器的活动客户端列表的屏幕截图,在这里我们可以看到与之连接的 RPi 的条目。

img/503786_1_En_1_Fig34_HTML.jpg

图 1-34

活动客户端列表的屏幕截图

最后一个条目对应于与之相连的 RPi 板。

摘要

在这一章中,我们从 Linux 和 Raspberry Pi 操作系统的基础开始。然后我们在 microSD 卡上安装了 Raspberry Pi OS,并学习了如何启动各种型号的 Raspberry Pi。我们还对终端模拟器 lxterminal,进行了一些实际操作,我们将在下一章详细探讨这一点。

在下一章,我们将学习 Linux 文件系统和 GUI(图形用户界面)的基础知识。我们将学习什么是操作系统 Shell,以及如何使用终端模拟器与它通信。我们还将学习如何使用命令更新 RPi OS,以及如何远程连接到它。

二、做好准备

上一章我们熟悉了单板机和树莓派。我们还学习了 Linux 和 Raspberry Pi 操作系统的基础知识。我们学习了如何使用 RPi 操作系统准备 SD 卡,以及如何使用 RPi 操作系统启动 RPi 板。我们还学习了使用终端模拟器的一些基础知识。

作为上一章的延续,我们将在本章中探讨以下概念:

  • 操作系统 Shell

  • Raspberry Pi 操作系统 GUI

  • 命令提示符

  • Linux 文件系统

  • 远程访问 RPi

学完这一章,我们会对 Linux 的终端模拟器和 shell 非常得心应手。我们也会对 Linux 文件系统感到满意。

我想再提一件事。在整本书的演示中,我使用了一个带有 4 GB 内存的 RPi 4 B。然而,本书中的所有演示将适用于任何 RPi 板模型。不特定于 RPi OS 的命令可以在任何 Debian Linux 发行版或衍生版上运行。如果任何命令是特定于 RPi OS 的,并且与 Debian 不兼容,那么我会在描述中提到它。

操作系统 Shell

在任何操作系统中,Shell 都是用于访问系统服务的用户界面。

它接受用户的输入,并根据输入执行程序。当程序完成执行时,shell 显示程序的输出。

所有的操作系统都有 Shell。一个操作系统可以有多个 Shell。shell 可以使用命令行界面(CLI)(像 Unix 终端模拟器程序)或图形用户界面。在本章中,我们将详细探讨这两个概念。

基于命令行界面(CLI)的 shells 需要用户记住命令。我们将在本书的这一章和其余章节中探讨各种命令。Shell 命令可以放入脚本中,用于在类似 Unix 的计算机上执行各种任务。

基于图形用户界面(GUI)的 shells 更易于使用。基本上,它们使用了一种用于类 Unix 操作系统的桌面环境。我们可以在 https://itsfoss.com/best-linux-desktop-environments/ 的文章中了解更多关于桌面环境的信息。

Raspberry Pi 操作系统 GUI

让我们对 RPi OS GUI 有一个概述。在这本书的结尾,我们有一个专门的章节来探索 Raspberry Pi 操作系统的一些 GUI 工具。在本节中,我们将对 RPi 操作系统的 GUI 进行一个非常简短的概述。树莓 Pi OS 使用的是 PIXEL 桌面,这是一个定制的 LXDE ( L 轻量级X11DesktopEn 环境)。其他流行的类似 Unix 操作系统的桌面环境有 KDE、GNOME 和 XFCE。在 RPi 操作系统中使用这些是可能的,但是为了简单起见,我们将在整本书的演示中坚持使用默认的 LXDE。

让我们对 RPi 操作系统的 GUI 有一个大致的了解。当我们启动它时,我们可以看到一个像任何其他类 Unix 环境一样的桌面。桌面有一个任务栏,在那里我们可以看到各种选项(图 2-1 )。

img/503786_1_En_2_Fig1_HTML.jpg

图 2-1

树莓 Pi 操作系统桌面

最左边角落的树莓果符号是 RPi OS 菜单,在这里我们可以找到所有的 GUI 包,让我们的生活更加轻松。旁边的地球符号是网页浏览器的快捷方式。旁边的文件夹符号是文件浏览器实用程序的快捷方式。旁边的黑色图标是 lxterminal 的快捷方式,这是 RPi OS 的默认命令行终端仿真器。我们已经简单地使用它来更改网络设置。

在右侧,我们可以看到 VNC 服务器的标志。这是因为我使用 Windows 电脑远程访问桌面。我们将在本章的后半部分详细了解它。之后,我们会看到一个蓝牙符号。我们可以使用这个连接到我们选择的蓝牙设备。接下来是 WiFi 符号。我们可以连接到我们选择的无线网络。之后,我们可以看到用于调节声音的音频表和一个时钟。在桌面上,唯一的图标是回收站,在那里您可以找到最近删除的项目,它们可以从这里恢复或永久删除。如果你曾经使用过任何基于 GUI 的操作系统,你会发现这一切都很熟悉。

命令提示符

我们可以使用终端模拟器 lxterminal 来访问命令提示符。打开 lxterminal 窗口并执行以下命令:

echo $SHELL

它将返回以下输出:

/bin/bash

这是 RPi 操作系统的默认 Shell。它被称为 Bash shell。输出是 Bash shell 程序的可执行文件的位置。RPi OS 有其他 Shell。我们可以使用以下命令来查看它们:

ls -la /bin/*sh*

它将返回以下输出:

pi@raspberrypi:~ $ ls -la /bin/*sh*
-rwxr-xr-x 1 root root 925124 Apr 18  2019 /bin/bash
-rwxr-xr-x 1 root root  91896 Jan 18  2019 /bin/dash
lrwxrwxrwx 1 root root      4 Apr 18  2019 /bin/rbash -> bash
lrwxrwxrwx 1 root root      4 May 27 12:35 /bin/sh -> dash

输出中有四行。正如我们所看到的,有四个 shells,即 bash、dash、rbash 和 sh。rbash 和 sh 只是到 bash 和 dash shells 的符号链接(在前面的输出中用符号->表示)。所以 RPi OS 有两个 shell,Bash 是默认的 shell。

现在不要太担心这些命令。我们将在接下来的章节中详细了解它们。

更新 RPi 操作系统

在上一章中,我们学习了如何在 RPi 操作系统上启动和运行 RPi 板。我们跳过了在首次配置 RPi 时更新 RPi OS 的过程。现在让我们从命令提示符更新它。所有最新的软件包都在 RPi OS 存储库中进行了更新,我们可以通过使用互联网参考该存储库来更新 RPi OS。以下命令用于从所有已配置的源下载软件包信息:

sudo apt-get update -y

这将更新有关软件包或其依赖项的更新版本的信息。在此之后,我们必须运行以下命令:

sudo apt-get dist-upgrade -y

该命令升级所有软件包及其依赖项,并删除所有过时的软件包。两个命令中的参数-y意味着每当执行提示 Yes/No 时,我们就输入y

最后,使用以下命令更新固件:

sudo rpi-update

这就是我们如何更新 RPi 操作系统和 RPi 板上的固件。

Linux 文件系统

在这一节中,我们将简要讨论 Linux 文件系统。Linux 文件系统是模仿 Unix 文件系统的。我们可以使用文件浏览器来浏览文件系统。当我们打开文件资源管理器时,它会打开文件夹/home/pi的可视视图。文件夹也称为目录。图 2-2 是显示/home/pi的文件浏览器截图。

img/503786_1_En_2_Fig2_HTML.jpg

图 2-2

文件浏览器

我们可以在/home/pi文件夹中看到很多文件夹和文件。这个文件夹是用户 pi 的主目录。在最上面的部分,在菜单栏下面,我们可以看到一个地址栏。在那里,键入字符/并按回车键。这个/是文件系统的根目录。大多数流行的类 Unix 操作系统的文件系统都是树状结构,目录/是这棵树的根。图 2-3 是该目录的文件浏览器视图。

img/503786_1_En_2_Fig3_HTML.jpg

图 2-3

/(根)目录的文件浏览器视图

在这里,我们可以看到根目录下的许多目录。以下是重要目录的简要描述:

  • /bin:/bin目录中有许多用户可执行文件。

  • 这个目录有一个引导程序,一个内核可执行文件,以及在计算机上引导一个类似 Unix 的操作系统所需的配置文件。在 RPi OS 中,config.txt文件包含所有与引导相关的选项。

  • /dev:该目录包含所有连接到电脑的硬件设备的设备文件。

  • /etc:该目录包含主机的本地系统配置文件。

  • /home:这是用户文件的主目录存储。每个用户在这个目录中都有一个子目录。

  • /lib:该目录有引导系统所需的共享库文件。

  • 在这里,所有新的存储设备都已安装。例如,当我们将便携式 USB 驱动器连接到 RPi 时,它会显示在这里。

  • /mnt:这是常规文件系统的临时挂载点。

  • 可选文件位于此处。可选文件的一个例子是供应商提供的程序。

  • /root:这不是(/)文件系统的根目录。这是根用户的主目录。

  • 这些是系统二进制文件。这些是用于系统管理的可执行程序。

  • /tmp:这是临时目录。它被操作系统和许多程序用来存储临时文件。用户也可以将文件临时存储在这个位置。请注意,操作系统可能会在没有任何警告的情况下清除存储在此处的文件。

  • 这些是可共享的只读文件,包括可执行的二进制文件和库、man 文件以及其他类型的文档。

  • /var:可变数据文件存储在这里。例如日志文件、MySQL 和其他数据库文件、web 服务器数据文件、电子邮件收件箱和其他特定于程序的文件。

远程访问 RPi

我们可以远程访问 RPi 的桌面和命令提示符。为了访问命令提示符,我们已经在操作系统设置后配置 RPi 时启用了远程 SSH。我们可以使用任何 SSH 客户端。然而,我发现逐位 SSH 客户端是最方便的。我们可以从 www.bitvise.com/ssh-client-download 下载安装到 Windows 操作系统上。这是免费的。一旦我们安装好,我们就打开它。我们在微软 Windows 的搜索栏输入 SSH 就可以找到。逐位 SSH 连接窗口如图 2-4 所示。

img/503786_1_En_2_Fig4_HTML.jpg

图 2-4

逐位 SSH 连接窗口

填写主机、用户名和密码的详细信息(pi 和 raspberry 是默认组合,以防您忘记)。然后点击登录按钮。当我们第一次登录任何新主机时,它显示图 2-5 中的信息。

img/503786_1_En_2_Fig5_HTML.jpg

图 2-5

主机密钥验证窗口

点击接受并保存按钮。这将把 RPi 的主机密钥保存到 Windows 计算机上,并且当我们下次建立新的连接时,对于同一个 RPi,不会再显示此消息。一旦我们连接上,就会显示 RPi OS 命令提示符,如图 2-6 所示。

img/503786_1_En_2_Fig6_HTML.jpg

图 2-6

使用 SSH 远程访问 RPi OS 命令窗口

它还打开一个文件传输窗口,如图 2-7 所示。

img/503786_1_En_2_Fig7_HTML.jpg

图 2-7

文件传输窗口

我们可以简单地将文件从 Windows 拖放到 RPi,反之亦然。左边是当前用户的 Windows 桌面,右边是 RPi OS 上用户 pi 的主目录。

这就是我们如何访问 RPi OS 的命令提示符并可视化地传输文件。现在,我们将了解如何远程访问桌面。RPi 操作系统与 VNC 服务器一起提供。我们已经在安装后的配置时启用了 VNC 服务器。我们只需要在 Windows 电脑上安装一个 VNC 浏览器。从 www.realvnc.com/en/connect/download/viewer/ 下载即可。我们可以在 Windows 搜索中输入 VNC 来搜索它。该应用的窗口如图 2-8 所示。

img/503786_1_En_2_Fig8_HTML.jpg

图 2-8

VNC 浏览器窗口

在菜单中,点击文件新建连接。打开一个新的连接窗口,如图 2-9 所示。

img/503786_1_En_2_Fig9_HTML.jpg

图 2-9

连接详细信息

填写您想要为您的连接设置的 IP 地址和名称,并点击 OK 按钮。它将在 VNC 浏览器应用程序窗口中创建一个对应于该连接的图标。双击连接,出现图 2-10 窗口。

img/503786_1_En_2_Fig10_HTML.jpg

图 2-10

证书

只需输入用户名和密码。点击复选框记住密码,这样我们就不会再次被要求输入凭证。最后,点击确定按钮。将会打开一个远程桌面窗口,如图 2-11 所示。

img/503786_1_En_2_Fig11_HTML.jpg

图 2-11

使用 VNC 浏览器的远程桌面

除非您使用非常过时的网络设备,否则响应是实时和流畅的。我们可以这样执行所有与 GUI 相关的任务,而不需要额外的显示器。

这就是我们如何远程访问 RPi 的命令提示符和桌面。

摘要

在本章中,我们学习了 Linux shell、GUI 和命令提示符的基础知识。我们还学习了如何使用命令更新 RPi 操作系统和固件。我们终于学会了如何远程访问命令提示符和桌面。所有这些主题都是开始学习 Linux 操作系统命令所需要的。

在下一章,我们将继续探索 Linux 操作系统的旅程。我们将学习一些简单的文件和目录相关的命令。我们还将学习一些文本编辑器的基础知识。

三、目录命令和文本编辑器

在上一章中,我们学习了如何使用命令提示符。我们还更新了 Pi 的操作系统和固件。我们学会了如何远程访问 Pi。所有这些技能对我们在本章和其余章节中看到的所有演示都很有帮助。

从本章开始,我们将开始学习 Linux 命令。我们将学习与文件和目录相关的命令。

我们将在本章中探讨以下概念:

  • 绝对和相对路径

  • 命令:pwd、tree 和 cd

  • 命令:ls

  • 命令:触摸

  • 各种文本编辑器

  • 创建和删除目录

  • 目录和文件的区分大小写的名称

学完这一章后,我们将会非常轻松地使用文件资源管理器和命令提示符来探索文件系统。

绝对和相对路径

当我们作为用户 pi 登录时,如果我们打开文件浏览器lxterminal 实用程序,默认情况下,它们会向我们显示用户 pihome 目录。这个目录的路径是/home/pi。这是绝对路径。我们知道/是文件系统的根。当我们在类 Unix 操作系统中引用任何文件或目录时,都可以使用绝对路径。这意味着它包括从根目录/开始的所有子目录。/home/pi是指在根目录/下,有一个目录home下有一个子目录pi。为了避免混淆,我们通常在代码或文档中写下绝对路径。比如config.txt通常简称为/boot/config.txt

文件或目录的相对路径是相对于目录的路径。例如,/home/pi是绝对路径。我们也可以说,只是/pi是同一个目录相对于/home目录的路径。

我们可以在文件浏览器实用程序的地址栏中粘贴一个目录的绝对路径,然后按回车键转到该目录。我们也可以在命令提示符下使用绝对路径来遍历该目录。我们将在下一节看到这一点。

命令:pwd、tree 和 cd

我们可以用命令pwd检查当前目录的名称。它的意思是 p 怨恨 w 工作 d 的工厂。打开 lxterminal ,输入命令

pwd

注意,所有类似 Unix 的操作系统,包括所有 Linux 发行版,都将命令和文件名区分大小写。键入本书和任何其他文档中提到的所有命令和文件名。错误的大小写或混合大小写将返回错误。

我们执行的命令的输出如下:

pi@raspberrypi:~ $ pwd
/home/pi

在前面的输出中,我们可以看到pi@raspberrypi。这意味着用户 piraspberrypi 的身份登录计算机。$是提示符号,pwd是命令。我们可以在下一行看到输出(当前的工作目录)。这是绝对路径。这就是我们如何看到当前目录的路径。

我们已经知道,Unix 文件系统就像一个树形结构,根目录/位于文件系统的根。我们可以通过命令tree看到这种树形结构。如果您使用的 RPi OS 版本没有此命令,则可以通过运行以下命令来安装它:

sudo apt-get install tree

APT 代表AadvancedPpackageTool。它是管理 Debian 及其衍生软件安装、删除和升级的工具。为了从存储库中安装一个新软件,我们必须在sudo apt-get install之后提到它的名字。类似地,我们可以删除任何带有sudo apt-get remove后跟该软件名称的软件。例如,看看下面的命令:

sudo apt-get remove tree

在这种情况下,您已经删除了实用程序。用我们之前学过的命令再次安装它。

pi 用户的 home 目录下的 lxterminal 中执行以下命令:

tree

结果如图 3-1 所示。

img/503786_1_En_3_Fig1_HTML.jpg

图 3-1

树命令的输出

输出以树的形式显示当前目录中的所有目录、子目录和文件,如图 3-1 所示。

我们可以通过运行命令cd遍历任何目录,如下所示:

cd /

执行前面的命令会将我们带到文件系统的根目录(/)。如果我们要切换到的目录在当前目录中,可以使用相对路径;否则,我们必须使用绝对路径。我们可以通过运行以下命令直接转到当前用户的主目录:

cd ~

我们将经常使用这个命令来切换工作目录。我们可以使用以下命令转到当前目录的父目录:

cd ..

在 Unix 及其衍生版本中,..是指当前目录的父目录。

命令:ls

我们已经知道,我们可以使用命令tree以树形结构显示当前目录下的所有文件、目录和子目录。还有另一个命令ls,显示类似的信息。它的意思是列表,它以列表的形式显示文件和目录(但不是子目录,除非指定)。按如下方式运行命令:

ls

它显示了以下输出:

Bookshelf  Documents  Music     Public     Videos
Desktop    Downloads  Pictures  Templates

许多 Unix 命令可以带选项运行。我们可以传递一个或多个选项,方法是输入命令,后跟一个空格,然后是一个连字符,紧接着是选项。例如,如果我们想要查看长列表格式的文件和目录列表,那么我们可以运行如下命令:

ls -l

输出如下所示:

pi@raspberrypi:~ $ ls -l
total 36
drwxr-xr-x 2 pi pi 4096 May 27 12:48 Bookshelf
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Desktop
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Documents
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Downloads
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Music
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Pictures
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Public
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Templates
drwxr-xr-x 2 pi pi 4096 May 27 13:16 Videos

让我们看看以下更多选项:

  • -l:长列表格式。这将输出文件类型、权限、硬链接的数量、所有者、组、大小、最后修改日期和文件名。

  • -F:通过在文件名后附加一个字符来显示文件的性质。例如,*代表可执行文件,/代表目录。常规文件没有后缀。

  • -a:列出给定目录下的所有文件,包括隐藏的文件和目录(在 Unix 中以.字符开头)。

  • -R:递归列出所有子目录。

  • -t:按照修改时间对文件列表进行排序。

  • -h:以人类可读的格式打印文件大小。

    • 1:这将强制输出为每行一个条目。

让我们尝试组合几个选项:

ls -la

输出如下所示:

pi@raspberrypi:~ $ ls -la
total 104
drwxr-xr-x 19 pi   pi   4096 Aug 17 15:18 .
drwxr-xr-x  3 root root 4096 May 27 12:40 ..
-rw-------  1 pi   pi    979 Aug 17 15:56 .bash_history
-rw-r--r--  1 pi   pi    220 May 27 12:40 .bash_logout
-rw-r--r--  1 pi   pi   3523 May 27 12:40 .bashrc
drwxr-xr-x  2 pi   pi   4096 May 27 12:48 Bookshelf
drwxr-xr-x  8 pi   pi   4096 Jul 22 15:35 .cache
drwx------  6 pi   pi   4096 Aug 17 12:23 .config
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Desktop
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Documents
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Downloads
drwx------  3 pi   pi   4096 May 27 13:16 .gnupg
drwxr-xr-x  2 pi   pi   4096 Jul 26 11:58 .ipynb_checkpoints
drwxr-xr-x  5 pi   pi   4096 Jul 26 11:58 .ipython
drwxr-xr-x  6 pi   pi   4096 Jul 22 15:25 .local
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Music
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Pictures
drwx------  3 pi   pi   4096 Jul 22 15:35 .pki
-rw-r--r--  1 pi   pi    807 May 27 12:40 .profile
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Public
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Templates
drwxr-xr-x  2 pi   pi   4096 May 27 13:16 Videos
drwx------  3 pi   pi   4096 Jul 15 01:58 .vnc
-rw-------  1 pi   pi     56 Aug 15 08:32 .Xauthority
-rw-------  1 pi   pi   2624 Aug 15 08:32 .xsession-errors
-rw-------  1 pi   pi   2445 Aug 13 10:17 .xsession-errors.old

在前面的输出中。引用当前目录,并且..引用父目录。所有的文件和目录。因为他们名字的第一个字符是隐藏的。我们也不能在文件浏览器中看到它们,除非隐藏项被启用。您可能希望将不同的选项结合起来作为本部分的练习。

命令:触摸

命令touch更新作为参数传递给它的现有文件的修改日期。如果该文件不存在,它将创建一个新的空文件。例如,运行以下命令:

touch test.txt

它在当前目录下创建一个文件test.txt。我们可以这样来看:

ls -l touch.txt

输出如下所示:

pi@raspberrypi:~ $ ls -l test.txt
0 -rw-r--r-- 1 pi pi 0 Aug 17 16:48 test.txt

一分钟后,让我们再次运行该命令:

ls -l touch.txt

让我们再次看看它的输出:

pi@raspberrypi:~ $ ls -l test.txt
-rw-r--r-- 1 pi pi 0 Aug 17 16:49 test.txt

我们可以观察到最后更新的日期已经改变。我们可以使用命令参数中的现有文件名来运行它,以更新最后访问日期,而不修改实际文件。

各种文本编辑器

我们已经使用了 nano 文本编辑器来修改网络配置。这是一个所见即所得类型的命令行明文编辑器。其他流行的基于命令行的 Unix 文本编辑器有 vivimvi 默认包含在 RPi 操作系统中。我们需要用下面的命令安装 vim :

sudo apt-get install vim -y

这将安装 vim 编辑器。我们可以通过以下网址了解有关 vi 和 vim 的更多信息:

https://vim.rtorr.com/

https://devhints.io/vim

两者对初学者来说都有点重。我更喜欢 nano 。如果你想要一个基于图形用户界面的编辑器来编辑文本文件,你可以选择 Leafpad 。使用以下命令安装它:

sudo apt-get install leafpad -y

安装完成后,我们可以在 RPi OS 菜单的附件选项中找到。图 3-2 显示了这一点:

img/503786_1_En_3_Fig2_HTML.jpg

图 3-2

行动中的叶垫

创建和删除目录

我们可以使用文件资源管理器创建和删除目录和文件。在文件资源管理器窗口或桌面上,如果我们右击,我们可以看到如图 3-3 所示的菜单。

img/503786_1_En_3_Fig3_HTML.jpg

图 3-3

右键单击后的选项

我们可以从该菜单创建新目录(文件夹)和新文件。或者我们可以使用命令来创建它们。我们已经看到了如何使用命令 touch 创建一个空文件。让我们看看如何创建和删除目录。我们可以使用命令 mkdir 创建一个目录,如下所示:

mkdir testdir

它在当前目录中创建一个名为 testdir 的目录。这是一个空目录。您可以使用命令 cd 切换到它,并使用命令 ls 在父目录中查看它。这是一个空目录,可以通过运行以下任一命令来删除空目录:

rm -d testdir
rmdir testdir

如果您在这个目录中创建了一些文件,那么您可以使用如下命令 rm 来删除这些文件:

rm testfile1.txt

我们还可以删除一个非空目录及其所有内容,如下所示:

rm -r testdir

当然,我们可以随时使用File Explorer GUI 来执行这些操作。

目录和文件的区分大小写的名称

之前,我提到过在 Linux 中,命令、目录和文件的名称是区分大小写的。现在让我们证明这一点。在 lxterminal 中逐一运行以下命令:

mkdir test
mkdir Test
mkdir TEST

我们可以运行 ls 命令来查看这些目录:

ls -lF

输出如下所示:

drwxr-xr-x 2 pi pi 4096 Aug 17 19:34 test/
drwxr-xr-x 2 pi pi 4096 Aug 17 19:34 Test/
drwxr-xr-x 2 pi pi 4096 Aug 17 19:34 TEST/

正如我们所看到的,它创建了同名的所有目录。每个名称中字符的大小写不同,因此它们被视为不同的目录。在 Microsoft Windows 操作系统中,文件和目录的名称不区分大小写。

我们还可以尝试使用命令 touch 来创建同名文件(名称中的字符大小写不同),以查看文件的运行情况。试着把它作为本节的一个练习。

摘要

在本章中,我们从一些与文件和目录相关的基本但重要的命令开始。这些是非常有用的命令,我们将在整本书中频繁使用它们。

在下一章,我们将继续我们的旅程,学习更多的 Unix 命令。

四、更多命令

在上一章中,我们学习了有用的文件和目录相关命令。我们还结识了一些测试编辑。在这个过程中,我们还学会了使用 APT 工具来管理 Debian 上的包。

在本章中,我们将看到更多的 Linux 命令。以下是我们将在本章学习的主题列表:

  • 配置 RPi 板

  • 获取命令帮助

  • 网络相关命令

  • 命令:文件操作

  • 打印字符串

  • 控制运算符

  • 文件名全球绑定

  • 命令:历史

  • 管道

完成这一章后,我们将会非常熟悉 Linux 中各种有用的命令。本章将向用户灌输更多关于命令提示符的信心。

配置 RPi 板

在安装 RPi OS 时,我们已经看到了用于配置 RPi 板的 GUI 工具。同一工具的命令行版本被称为raspi-config实用程序。我们可以用下面的命令调用它:

sudo raspi-config

该实用程序的主菜单如图 4-1 所示。

img/503786_1_En_4_Fig1_HTML.jpg

图 4-1

命令提示符下的 Raspberry Pi 配置实用程序

它拥有我们在图形工具中学到的所有选项。作为本节的一个练习,您可能想进一步探索它。

Note

这个命令在 Linux 的其他发行版中不起作用。它特定于 RPi 板上的 RPi 操作系统。

sudo 是什么?

到这个时候,你一定已经注意到我们在几个命令前使用了命令sudo。您也可能试图在没有 sudo 的情况下运行它们,并且肯定得到了以下错误:

pi@raspberrypi:~ $ raspi-config
Script must be run as root. Try 'sudo raspi-config'

这是因为一些命令和实用程序需要另一个用户(在本书中通常是超级用户或 root 用户)的安全权限。sudo是类 Unix 操作系统中的程序。它允许用户以另一个用户的安全特权运行程序。默认情况下,另一个用户是超级用户(在我们的例子中,用户 root)。该命令扩展为“替代用户 do”或“超级用户 do”

如果任何命令需要sudo,而我们在没有sudo的情况下运行它,它会返回我们在前面的例子中了解到的错误。

获取命令帮助

我们可以通过命令maninfo获得各种命令的帮助。我们可以将命令 man 与任何其他命令一起使用,如下所示:

man ls

我们将看到一个屏幕,显示命令ls的信息。这就是所谓的手册页,它是类 Unix 系统中的一种文档形式。我们可以通过按键盘上的 Q 键退出这个文档界面。

我们可以使用命令info找到类似的信息,如下所示:

info ls

它将显示关于命令用法的信息。我们也可以通过按键盘上的键 Q 来退出这个信息屏幕。

网络相关命令

让我们来看看几个与网络相关的命令。第一个命令是ifconfig。它是一个系统管理实用程序,在引导时运行。此命令用于设置 IP 地址和网络掩码。如果我们在没有任何参数的情况下运行它,它将显示如下网络详细信息:

pi@raspberrypi:~ $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether dc:a6:32:12:0c:e8  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 17  bytes 1004 (1004.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1004 (1004.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.2  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7d45:b9a:284a:26bf  prefixlen 64  scopeid 0x20<link>
        ether dc:a6:32:12:0c:e9  txqueuelen 1000  (Ethernet)
        RX packets 4650  bytes 422988 (413.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4297  bytes 2465513 (2.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

目前,RPi 连接到我家的 WLAN 网络。这就是启用输出的 wlan0 部分(最后一部分)中的条目的原因。对于有线局域网,我们可以查看输出中的 eth0 段(第一段)。

在这里,我们可以看到 IPV4 和 IPV6 地址、网络掩码、广播地址和 MAC 设置等重要信息。我们还可以看到接收和发送的数据包数量等详细信息。

Note

命令ifconfig与 Windows 和 Mac 中的命令ipconfig有很多相似之处。

另一个显示类似信息的命令是iwconfig。它显示当前连接的 WiFi 信息,如下所示:

pi@raspberrypi:~ $ iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     IEEE 802.11  ESSID:"Ashwin_Ion"
          Mode:Managed  Frequency:2.432 GHz  Access Point: 6C:72:20:43:89:31
          Bit Rate=81 Mb/s   Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=50/70  Signal level=-60 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:13  Invalid misc:0   Missed beacon:0

我们可以使用命令ping测试内部或外部网络中主机的可达性,如下所示:

pi@raspberrypi:~ $ ping -c4 www.google.com
PING www.google.com (172.217.27.196) 56(84) bytes of data.
64 bytes from bom07s15-in-f4.1e100.net (172.217.27.196): icmp_seq=1 ttl=119 time=8.80 ms
64 bytes from bom07s15-in-f4.1e100.net (172.217.27.196): icmp_seq=2 ttl=119 time=8.15 ms
64 bytes from bom07s15-in-f4.1e100.net (172.217.27.196): icmp_seq=3 ttl=119 time=7.86 ms
64 bytes from bom07s15-in-f4.1e100.net (172.217.27.196): icmp_seq=4 ttl=119 time=8.03 ms

--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms

在本例中,-c4 表示我们正在向目标主机发送四个数据包。它是可选的,如果没有它,该命令将无限期运行。

我们可以用 wget 命令从互联网上下载一个文件,如下所示:

wget ftp://ftp.gnu.org/pub/gnu/wget/wget-latest.tar.gz

这将把提到的文件下载到当前目录。我们可以使用 ls 命令看到下载的文件,如下所示:

pi@raspberrypi:~ $ ls *.gz
wget-latest.tar.gz

这些是 Linux 中非常常用的网络相关命令的几个例子。

命令:文件操作

我们可以对文件执行各种操作。使用以下命令在当前目录中创建一个空文件和一个空目录:

touch abc
mkdir practice

让我们学习几个与文件相关的有用命令。让我们看看如何复制文件。我们可以用不同的名称将它复制到相同的位置,如下所示:

cp abc abc1

我们可以通过命令ls看到原件和复印件,如下所示:

pi@raspberrypi:~ $ ls abc* -la
-rw-r--r-- 1 pi pi 0 Aug 22 15:33 abc
-rw-r--r-- 1 pi pi 0 Aug 22 15:33 abc1

在输出中,我们也可以看到文件属性。我们将在本书的后面了解它们。

我们可以将它复制到一个文件夹中,如下所示:

cp abc ./practice/

文件夹(或目录)练习在同一个文件夹中。所以我们可以提供相对路径。如果它不在同一个文件夹中,那么我们必须提供绝对路径。此外,我们可以通过提供绝对路径将文件从任何源复制到任何目标。

我们可以使用命令 mv 重命名原始文件,如下所示:

mv abc1 abc2

原始文件将被重命名为另一个名称。我们也可以像命令cp一样在目录之间进行这种操作。

让我们再看几个命令。在文本编辑器中打开创建的文件,添加 15-20 行并保存。然后运行以下命令:

cat abc

它将显示文件的内容:

head abc

它显示了前十行。head 命令显示输入给它的任何源中的顶行。在这里,我们正在处理文件。我们可以自定义想要查看的行数,如下所示:

head -5 abc

我们可以看到另一个命令tail的底线,如下所示:

tail abc
tail -5 abc

让我们详细研究另一个与文件相关的命令cut。它用于提取输出中每一行的部分。一个很好的例子是从逗号分隔值(CSV)文件中提取数据。在 CSV 文件中,数据以列的形式排列,并用逗号(或其他分隔符,如:)分隔。数据可以通过由分隔符分隔的字节、字符或字段来提取。以下命令从文件中提取前两个字符:

cut -c 1-2 abc

我们可以使用-f来选择由-d指定的分隔符分隔的字段。我们也可以用-b来表示字节。

打印字符串

我们可以用命令 echo 打印一个字符串。以下是一些例子:

pi@raspberrypi:~ $ echo test
test
pi@raspberrypi:~ $ echo 'test'
test
pi@raspberrypi:~ $ echo "test"
test

控制运算符

让我们看看几个控制操作符。Unix 及其衍生物有许多控制操作符。让我们一个一个地学习它们。

按顺序运行以下命令:

ls
echo $?

最后一个命令返回0。这是因为$?存储执行最后一个命令的退出代码。如果成功,它存储0和其他代码。

我们可以用分号(;)分隔两个命令,如下所示:

echo test1 ; echo test2

让我们看看运算符&的用法。当一行以它结束时,shell 不会等待命令执行完毕。我们得到了 shell 提示符。

在 GUI 中或使用 VNC 打开 lxterminal 程序。然后运行命令 leafpad 打开文本编辑器。您会注意到,只要编辑器在运行,命令提示符就会被锁定,并且不会运行键入的命令。一旦我们关闭编辑器,它将一个接一个地运行这些命令(它们实际上存储在一个缓冲区中)。如果我们运行以下命令

leafpad &

它在提示中打印程序的 PID(进程 ID),提示可供我们使用。它不会等待编辑器关闭。

让我们看看运算符& & #的用法。它是一个逻辑运算符。让我们看一个如下的例子:

echo abc && echo xyz

在两个命令之间使用时,如果第一个命令成功,则执行第二个命令。如果第一个命令失败,则不会执行第二个命令。在前面的示例中,两个命令都运行良好。让我们看另一个例子:

fecho abc && echo xyz

在这种情况下,两个命令都不会执行。

另一个逻辑运算符是||。这是逻辑或。当放置在两个命令之间时,如果第一个命令成功,则第二个命令不会执行。只有当第一个命令失败时,第二个命令才会执行。通过运行以下示例进行自我检查:

echo abc || echo xyz
fecho abc || echo xyz

我们可以将这两个操作符结合起来,如果命令成功,它将打印一条成功消息;否则,它会打印一条失败消息。下面是一个例子:

rm file1 && echo SUCCESS || echo FAIL

最后,我们可以使用反冲运算符\作为转义字符。我们需要在命令提示符下打印;,但是 shell 将其解释为命令结束。我们可以使用反斜杠来避免这种情况,如下所示:

pi@raspberrypi:~ $ echo We want to print \;
We want to print ;

文件名全球绑定

文件名全球绑定是 UNIX shell 的一个特性。这意味着通过使用称为通配符的特殊字符和单个文件名来表示多个文件名。通配符是用来替代一个或多个字符的符号。我们可以使用通配符来创建表示多个文件名的字符串:

  • *表示零个或多个字符。

  • ?仅代表一个字符。

让我们看几个例子。运行以下命令:

ls a?c

它列出了文件 abc。截至目前,在 home 位置,只有一个文件符合这个标准。文件名的第一个和最后一个字符是 a 和 c。

让我们看另一个例子。让我们列出文件名中以字符 a 开头的所有文件:

ls a*

我们还可以列出扩展名为 txt 的文件,如下所示:

ls *.txt

这就是我们如何在 ls 命令中使用 filename globbing。

命令:历史

操作系统维护所执行命令的历史。我们可以通过命令历史来找出在 shell 中执行命令的顺序。以下是该命令的输出示例:

  125  tail -5 abc
  126  cut cut -c 1-2 abc
  127  echo test
  128  echo 'test'
  129  echo "test"
  130  echo abc && echo xyz
  131  fecho abc && echo xyz
  132  echo abc || echo xyz
  133  fecho abc || echo xyz
  134  rm file1 && echo SUCCESS && echo FAIL
  135  rm file1 && echo SUCCESS || echo FAIL
  136  history

我只显示了整个输出的结尾部分,因为它将占据几页来显示整个输出。正如我们所看到的,它显示了最近在命令提示符下执行的命令。

管道

管道是重定向的一种形式。使用这个,我们可以将一个命令的输出重定向到另一个命令。假设我希望只查看最近执行的十个命令的历史记录。那么我必须使用如下管道:

history | tail -10

在前面的命令中,|是管道运算符。我们将命令历史的输出提供给命令尾。输出如下所示:

  131  fecho abc && echo xyz
  132  echo abc || echo xyz
  133  fecho abc || echo xyz
  134  rm file1 && echo SUCCESS && echo FAIL
  135  rm file1 && echo SUCCESS || echo FAIL
  136  history
  137  hist
  138  history
  139  ls -l
  140  history | tail -10

在编写 shell 脚本时,通常会创造性地使用管道来过滤所执行命令的输出。

摘要

在这一章中,我们从几个中等难度的命令开始。这些命令在编写 shell 脚本时非常有用,我们将在本书的后面学习。现在,我们都非常熟悉命令提示符的基本和中级用法。

在下一章,我们将学习一些更有用的命令和更复杂的概念。

五、有用的 Unix 命令和工具

在上一章中,我们学习了一些中等难度的命令。我们现在对命令提示符非常熟悉,可以浏览 Linux 和其他类似 Unix 的操作系统的文件系统。我们可以使用简单的文件和目录命令。我们对各种操作员和管道也很熟悉。

在本章中,我们将学习 Unix 中的高级命令和工具。以下是我们将在本章学习的主题列表:

  • Shell 和环境变量

  • 有用的 Linux 命令

  • 有用的 Unix 工具

学完这一章,我们将会非常熟悉 Unix 中的高级工具。在下一章中,我们会发现这些命令和概念对于学习 shell 脚本非常有用。

Shell 和环境变量

让我们看看如何在 shell 中定义变量。我们可以如下定义数值和字符串类型的变量:

a=2
str1='ASHWIN'

我们不必像在 C 或 Java 等编程语言中那样声明它们。这些变量被称为 Shell 变量。我们可以通过在变量名前加上一个$符号来访问它们,如下所示:

echo $a
echo $str1

前面的语句将打印存储在变量中的值。我们可以将属于任何数据类型的值赋给一个变量。因此,shell 中的变量并不局限于存储任何单一数据类型的值。

环境变量是一个变量,其值由操作系统或 shell 中内置的功能来设置。环境变量由名称和值对组成。所有与系统相关的信息都存储在环境变量中。我们可以通过运行以下命令来查看环境变量列表:

env

它会打印一个很长的变量列表,并且会占用好几页。我们已经看到,变量SHELL存储了当前 shell 的可执行文件的名称。因此,我们将看看重要的环境变量。运行以下命令以了解 Bash shell 版本:

echo $BASH_VERSION

运行以下命令以了解 RPi 的主机名:

echo $HOSTNAME

运行以下命令以了解历史文件的位置:

echo $HISTFILE

下面的命令返回当前登录用户(在我们的例子中,用户是 pi )的 home 目录的位置:

echo $HOME

要了解运行任何命令时 shell 搜索可执行文件的目录位置,请使用以下命令:

echo $PATH

有用的 Linux 命令

让我们看看 Linux 中几个有用的命令。命令 w 显示了谁登录了以及他们正在做什么。运行命令并查看输出。

uptime 命令显示系统运行了多长时间:

pi@raspberrypi:~ $ uptime
 17:05:24 up 19:10,  3 users,  load average: 0.24, 0.22, 0.18

命令 who 显示谁已登录:

pi@raspberrypi:~ $ who
pi       tty1         2020-08-24 21:54
pi       pts/0        2020-08-25 16:42 (192.168.0.100)
pi       pts/1        2020-08-25 16:59 (192.168.0.100)

命令 whoami 打印当前用户的 ID,如下所示:

pi@raspberrypi:~ $ whoami
pi

我们可以使用以下命令获取系统信息:

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux

我们可以使用 htop 和 top 命令获得关于当前进程和资源利用率的信息。运行它们以查看输出。

我们可以使用命令 ps 查看当前进程的快照:

pi@raspberrypi:~ $ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug24 ?        00:00:04 /sbin/ini
root         2     0  0 Aug24 ?        00:00:00 [kthreadd
root         3     2  0 Aug24 ?        00:00:00 [rcu_gp]

这是命令执行的部分输出。

命令 df 报告文件系统的详细信息:

pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  6.5G  7.3G  47% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  8.7M  1.9G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   54M  199M  22% /boot
tmpfs           378M  4.0K  378M   1% /run/user/1000

使用命令 lsusb,我们可以看到连接的 USB 设备列表,如下所示:

pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 004: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

我们可以用命令lscpucat /proc/cpuinfo查看处理器信息。运行这两个命令查看输出。

我们可以使用以下命令来查看与内存相关的信息:

pi@raspberrypi:~ $ free -m
      total    used        free  shared  buff/cache   available
Mem:   3776     121        3320      36         334        3491
Swap:    99       0          99
pi@raspberrypi:~ $ cat /proc/meminfo
MemTotal:        3867184 kB
MemFree:         3399896 kB
MemAvailable:    3575016 kB

Unix 命令是二进制可执行文件。我们可以用命令whichwhereis来定位它们。告诉我们二进制可执行文件位置的命令:

pi@raspberrypi:~ $ which python3
/usr/bin/python3

我们可以使用命令whereis检索关于手册页的信息和关于该命令的文档,如下所示:

pi@raspberrypi:~ $ whereis python3
python3: /usr/bin/python3.7m /usr/bin/python3
/usr/bin/python3.7-config /usr/bin/python3.7
/usr/bin/python3.7m-config /usr/lib/python3 /usr/lib/python3.7
/etc/python3 /etc/python3.7 /usr/local/lib/python3.7
/usr/include/python3.7m /usr/include/python3.7
/usr/share/python3 /usr/share/man/man1/python3.1.gz

还有另一个特定于 Raspberry Pi 操作系统的实用程序,可以检索大量系统信息。是vcgencmd。我们可以在 www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md 了解更多。

以下是执行的示例:

pi@raspberrypi:~ $ vcgencmd measure_temp
temp=35.0'C
pi@raspberrypi:~ $ vcgencmd get_mem arm && vcgencmd get_mem gpu
arm=896M
gpu=128M

第一个示例显示了 CPU 温度,第二个示例显示了 CPU 和 GPU 之间的内存分配(以兆字节为单位)。

有用的 Unix 工具

让我们研究几个有用的 UNIX 工具。这些有用的 Unix 命令可以在 Linux 和其他类似 UNIX 的操作系统的所有发行版中找到。让我们为演示创建一个简单的 CSV 文件。我为演示创建了一个小的 CSV 文件,其内容如下:

pi@raspberrypi:~ $ cat abc.csv
ASHWIN, 20k, INDIA
THOR, 10k, Asgard
JANE, 15k, UK
IRON MAN, 100k, USA

我们可以使用命令wc检查文件的统计数据(字数、行数和字符数,包括空格),如下所示:

pi@raspberrypi:~ $ wc abc.csv
 4 13 71 abc.csv
pi@raspberrypi:~ $ wc -c abc.csv
71 abc.csv
pi@raspberrypi:~ $ wc -w abc.csv
13 abc.csv
pi@raspberrypi:~ $ wc -l abc.csv
4 abc.csv

第一个示例显示了一个文件的所有统计信息。接下来的三个例子分别显示了字符数、字数和行数。我们还可以对这个文件使用命令 cut 进行更多的练习。看看下面的例子:

pi@raspberrypi:~ $ cut -c 2-5 abc.csv
SHWI
HOR,
ANE,
RON
pi@raspberrypi:~ $ cut -d "," -f 2- abc.csv
 20k, INDIA
 10k, Asgard
 15k, UK
 100k, USA

我们可以使用命令grep来寻找文本的模式。例如,如果我想在文本文件中找到我的名字,我可以使用命令 grep,如下所示:

pi@raspberrypi:~ $ grep ASHWIN abc.csv
ASHWIN, 20k, INDIA

如果我希望搜索不区分大小写,那么我可以按以下方式使用它:

pi@raspberrypi:~ $ grep -i asgard abc.csv
THOR, 10k, Asgard

我们可以使用命令sort对数据进行如下排序:

pi@raspberrypi:~ $ sort abc.csv
ASHWIN, 20k, INDIA
IRON MAN, 100k, USA
JANE, 15k, UK
THOR, 10k, Asgard

我们可以找出如下独特的数据项:

pi@raspberrypi:~ $ sort abc.csv | uniq
ASHWIN, 20k, INDIA
IRON MAN, 100k, USA
JANE, 15k, UK
THOR, 10k, Asgard

要查看命令的运行情况,在运行它之前,在文件abc.csv中插入一个重复的行:

以下是实际使用的日期和日历命令:

pi@raspberrypi:~ $ date
Tue 25 Aug 2020 09:03:01 PM IST
pi@raspberrypi:~ $ cal
    August 2020
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

最后,如果我们想找到一个文件,那么我们可以如下使用命令find:

pi@raspberrypi:~ $ find . -name "*.conf"
./.config/lxterminal/lxterminal.conf
./.config/lxsession/LXDE/desktop.conf
./.config/pcmanfm/LXDE/desktop-items-0.conf

该命令后跟路径(在我们的例子中,它是当前目录,因此。)和搜索标准。这里,我们在当前目录中搜索配置文件。

摘要

在本章中,我们学习了许多高级 Linux 命令。在下一章中,我们将使用在本章和前几章中学到的所有命令来准备 shell 脚本。

下一章将详细说明如何在 Linux 上准备和执行 shell 脚本。

六、Shell 脚本

在上一章中,我们学习了 Unix 和 RPi OS 中一些更有用的命令。我们学习的这些命令和工具在编写 shell 脚本时非常有用。

继续上一章的 Unix 和 RPi OS 命令的主题,我们将从本章的 shell 脚本开始,并继续到下一章。以下是我们将在本章学习的主题列表:

  • Unix 文件权限

  • 命令:nohup

  • 开始 Shell 脚本

  • 用户输入

  • Shell 中的表达式

  • 如果语句

  • 开关盒

  • 壳变量的长度

  • 命令行参数

  • 功能

  • Shell 中的循环

  • 比较字符串

  • 文件操作

在这一章之后,我们将能够在所有类似 Unix 的操作系统上轻松地编写 shell 脚本。

Unix 文件权限

让我们通过例子来理解这个概念。在 lxterminal 中运行以下命令:

ls -l

输出如下所示:

pi@raspberrypi:~ $ ls -l
total 76
drwxr-xr-x 2 pi pi 4096 Aug 20 16:10 Bookshelf
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Desktop
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Documents
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Downloads
drwxr-xr-x 3 pi pi 4096 Aug 28 08:40 gnomeforpi
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Music
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Pictures
-rwxr-xr-x 1 pi pi 7980 Aug 29 17:36 prog00
-rw-r--r-- 1 pi pi   76 Aug 29 17:36 prog00.c
-rw-r--r-- 1 pi pi   22 Aug 29 18:38 prog00.py
-rwxr-xr-x 1 pi pi 8740 Aug 29 17:49 prog01
-rw-r--r-- 1 pi pi   93 Aug 29 17:48 prog01.cpp
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Public
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Templates
-rw-r--r-- 1 pi pi    3 Sep  3 16:06 test1.sh
drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Videos

这是 Unix 长列表格式。我们已经看到了这一点。让我们理解输出中所有术语的含义。让我们看下面两行:

drwxr-xr-x 2 pi pi 4096 Aug 20 16:40 Pictures
-rwxr-xr-x 1 pi pi 7980 Aug 29 17:36 prog00

如我们所见,输出中有九列。第一列(drwxr-xr-x-rwxr-xr-x)告诉我们文件类型和权限。如果是目录,第一个字符是d,如果是文件,第一个字符是。剩下的九个字符告诉我们权限。我们很快就会看到它们的细节。

第二列有一个数字。它显示了链接的数量。第三和第四列是所有者和组名(在本例中是pipi)。第五列显示以字节为单位的大小。对于目录,永远是 4 k,有兴趣可以在 https://askubuntu.com/questions/186813/why-does-every-directory-have-a-size-4096-bytes-4-k 了解更多。

接下来的三列是最后修改时间。最后一列显示了目录或文件的名称。

让我们详细讨论一下权限。您一定注意到了第一列有一个类似于drwxr-xr-x的字符串。正如我们所讨论的,第一个字符表示文件类型。接下来的九个字符可以分成三组,每组三个字符。它们分别是创建文件/目录的用户、用户组和其他用户的权限。

  • r表示读取权限。

  • w表示写权限。

  • x表示执行许可。

如果我们在任何地方遇到了符号,就意味着没有授予许可。所以字符串-rwxr-xr-x意味着它是一个文件。文件的创建者/所有者拥有所有(读、写和执行)权限。所有者自己的组具有读取和执行权限。其他人拥有读取和执行权限。我们可以手动更改权限。我们通常用字符串的数字表示权限:

  • r意为 4。

  • w意为 2。

  • x意为 1。

因此,当我们需要设置文件/目录的权限时,我们分别计算所有者、组和其他人的总和。比如我想为 all 启用所有权限,那么就会是rwxrwxrwx。数字表示将是(4+2+1 4+2+1 4+2+1)可以写成 777。出于安全考虑,我们很少使用这个。最常见的权限是rwxr--r--。可以表示为(4+2+1 4+0+0 4+0+0),写成 744。另一种常见的权限格式是rwxr-xr-x。可以表示为(4+2+1 4+0+1 4+0+1)写成 755。我们将很快看到如何在文件和目录上授予这些权限。我们需要理解这个概念,因为了解它对于在类 Unix 操作系统上执行程序非常重要。

命令:nohup

nohup表示没有挂断。如果我们不想在关闭命令提示符时终止调用的程序,我们可以在命令提示符下使用该命令。我们通常将它与&操作符一起使用。为了演示这一点,我们需要使用 RPi 操作系统的桌面(直接或通过 VNC 远程操作)。打开LX 终端。然后运行以下命令:

nohup idle &

它会打开 IDLE(集成开发学习环境)编辑器(它是 Python 3 的 IDE 我们将在本书的后面部分看到)。现在,如果我们关闭 lxterminal 窗口,它不会关闭空闲的编辑器。然而,如果我们只使用命令idle调用 IDLE,如果我们关闭用于调用它的 lxterminal 窗口,IDLE 将被关闭。

开始 Shell 脚本

在 lxterminal 中运行以下命令:

pi@raspberrypi:~ $ echo "Hello World!"
Hello World!

正如我们看到的,它立即打印输出。我们可以创建一个包含这些语句的脚本。脚本中的语句被提供给 shell 解释器并被逐个执行。这样的脚本被称为 shell 脚本。让我们创造一个。打开任何文本编辑器,粘贴我们在那里执行的命令,并以名称 prog00.sh 保存文件。一般我们用。sh 作为 shell 脚本文件的扩展名。没有必要进行扩展。它只是帮助我们识别这些是 shell 脚本。我们可以使用以下命令轻松列出一个目录中的所有 shell 脚本:

ls *.sh

一旦您为 shell 脚本创建了文件,我们就可以如下运行它:

bash prog00.sh

或者

sh prog00.sh

在第一行后添加命令date,并再次运行它:

pi@raspberrypi:~ $ sh prog00.sh
Hello World!
Fri Sep  4 10:37:50 IST 2020

这就是我们如何编写和执行简单的 shell 脚本。

还有另一种方法可以运行 shell 脚本。我们需要使用以下命令来更改 shell 脚本的权限:

chmod 755 prog00.sh

我们已经讨论了 755 所代表的权限的含义。现在我们可以使用./直接运行脚本,如下所示:

./prog00.sh

它将执行程序并打印输出。我们可以用所谓的社邦沙邦来明确指定解释者。只需添加#!/bin/bash作为清单 6-1 所示脚本的第一行。

#!/bin/bash
echo "Hello World!"
date

Listing 6-1prog00.sh

这样,脚本在被直接调用时使用 Bash shell 来运行。

用户输入

我们可以在 shell 脚本中接受用户的输入。在清单 6-2 中,我们使用语句read来读取用户输入。我们将输入读入一个变量并显示它的值。这就是我们读取用户输入的方式。

#!/bin/bash
echo 'Who am I talking to?'
read name
echo 'Nice to meet you' $name

Listing 6-2prog01.sh

Shell 中的表达式

就像任何编程语言一样,我们可以在 shell 中编写表达式。下面的 shell 脚本(清单 6-3 )展示了在 shell 中编写数学表达式的各种方法。

#!/bin/bash

let a=5+4
echo $a

let "a=5+4"
echo $a

let a++
echo $a

let "a=4*5"
echo $a

Listing 6-3prog02.sh

在这个脚本中,第一、第二和第四个表达式向我们展示了一个赋值操作,第三个表达式向我们展示了一个增量操作。我们将经常使用表达式给 shell 中的变量赋值。我们还可以使用expr语句来计算算术运算,如清单 6-4 所示。

#!/bin/bash

expr 3 + 4

expr "3 + 4"

expr 11 % 2

a=$( expr 10 - 3 )

echo $a

Listing 6-4prog03.sh

第一个和第三个expr语句是算术语句,第二个是字符串,因为操作数用双引号括起来。第四个语句是赋值语句。运行脚本并查看输出。

最后,清单 6-5 展示了一种不用letexpr编写表达式的方法。

#!/bin/bash

a=$(( 4 + 5 ))
echo $a

a=$((3+5))
echo $a

b=$(( a + 3 ))
echo $b

b=$(( $a + 4 ))
echo $b

(( b++ ))
echo $b

(( b += 3 ))
echo $b

a=$(( 4 * 5 ))
echo $a

Listing 6-5prog04.sh

运行脚本查看输出。

如果语句

我们可以使用if进行条件语句。他们使用比较运算符。以下是 Bash 中的比较运算符:

  • -情商等于。

  • -ne 不等于。

  • -还不到。

  • -le 小于或等于。

  • -gt 大于。

  • -ge 大于或等于。

清单 6-6 显示了带有if语句的-eq操作符的用法。

#!/bin/bash

echo 'Please enter an integer: '
read a

if [ $a -gt 100 ]
then
echo "The number is greater than 100."
fi

Listing 6-6prog05.sh

运行脚本并查看输出。

我们甚至可以有一个嵌套的 if(清单 6-7 )。

#!/bin/bash

echo 'Please enter an integer:'

read a

if [ $a -gt 100 ]
then
echo 'It is greater than 100.'
if (( $a % 2 == 0 ))
then
echo 'It is an even number.'
fi
fi

Listing 6-7prog06.sh

运行脚本并查看输出。

我们可以写一个 if-else 块(清单 6-8 )。

#!/bin.bash

echo 'Please enter an integer:'

read a

if [ $a -gt 50 ]
then
echo 'The number is greater than 50.'
else
echo 'The number is less than or equal to 50.'
fi

Listing 6-8prog07.sh

运行它以查看输出。我们甚至可以编写 if-elif-else 语句(清单 6-9 )。

#!/bin/bash

echo 'Please enter an integer:'
read a

if [ $a -gt 100 ]
then
echo 'The number is greater than 100.'
elif [ $a -eq 100 ]
then
echo 'The number is equal to 100.'
else
echo 'The number is less than 100.'
fi

Listing 6-9prog08.sh

开关盒

我们可以在 shell 中有一个 switch case 结构(比如 C、C++和 Java)。清单 6-10 是这种结构的一个例子。

#!/bin/bash

echo 'Please input an integer:'

read a

case $a in
10)
echo Ten
;;
20)
echo Twenty
;;
100)
echo Hundred
;;
*)
echo 'Default Case'
esac

Listing 6-10prog09.sh

运行 shell 脚本来查看输出。

壳变量的长度

我们可以使用#符号来计算变量的长度(清单 6-11 )。

#!/bin/bash

a='Hello World!'
echo ${#a}

b=12345
echo ${#b}

Listing 6-11prog10.sh

执行脚本以了解变量的长度。

命令行参数

命令行参数是在从命令行或任何其他脚本调用脚本时传递给任何程序(在此上下文中是 shell 脚本)的参数。大多数现代编程语言(C、C++和 Java)和脚本语言(shell、Perl、Python)都提供了处理命令行参数的功能。

在一个 shell 脚本中,我们可以使用$#$@来处理命令行参数,如清单 6-12 所示。

#!/bin/bash

echo 'Total number of arguments:' $#
echo 'All argument values:' $@

echo 'Name of the script:' $0
echo 'First Argument ->' $1
echo 'Second Argument ->' $2

Listing 6-12prog11.sh

按如下方式运行它:

pi@raspberrypi:~ $ bash prog11.sh 1 "Hello World" 3.14 ASH

Total number of arguments: 4
All argument values: 1 Hello World 3.14 ASH
Name of the script: prog11.sh
First Argument -> 1
Second Argument -> Hello World

功能

我们甚至可以在 shell 脚本中编写函数。函数是程序中经常调用的可重用代码块。如果您有一个需要经常使用的代码块,围绕它编写一个函数是有意义的。清单 6-13 展示了一个简单函数的演示。

#!/bin/bash
print_message ()
{
        echo 'Hello from function'
}

print_message

Listing 6-13prog12.sh

在脚本中,print_message()是一个函数,我们只调用它一次,如图所示。我们首先定义它的主体,然后调用它(当我们调用时,不使用括号)。我们甚至可以在函数中使用参数,它们的工作方式和命令行参数完全一样。您可以在 https://bash.cyberciti.biz/guide/Pass_arguments_into_a_function 了解更多信息。

Shell 中的循环

我们可以使用清单 6-14 中所示的until语句和比较运算符来编写一个循环。

#!/bin/bash

counter=0

until [ $counter -gt 5 ]
do
      echo 'Counter:' $counter
      ((counter++))
done

Listing 6-14prog13.sh

运行该脚本,它会显示以下输出:

pi@raspberrypi:~ $ bash prog13.sh
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5

我们甚至可以有清单 6-15 所示的for循环。

#!/bin/bash

for i in 1 2 3 4 5
do
      echo 'Looping ... number' $i
done

Listing 6-15prog14.sh

输出如下所示:

pi@raspberrypi:~ $ bash prog14.sh
Looping ... number 1
Looping ... number 2
Looping ... number 3
Looping ... number 4
Looping ... number 5

我们可以用清单 6-16 所示的for循环计算阶乘。

#!/bin/bash

echo 'Enter a number'
read num

fact=1

for((i=2;i<=num;i++))
{
      fact=$((fact * i))
}

echo $fact

Listing 6-16prog15.sh

我们可以用 while 循环编写相同的程序,如清单 6-17 所示。

#!/bin/bash
echo 'Enter a number:'
read num

fact=1

while [ $num -gt 1 ]
do
      fact=$((fact * num))
      num=$((num - 1))
done

echo $fact

Listing 6-17prog16.sh

运行所有这些程序来查看运行中的循环。

比较字符串

我们可以用字符串比较操作符在 shell 中比较字符串。清单 6-18 展示了实际的字符串比较。

#!/bin/bash

a='GNU'
b='Linux'

if [ $a = $b ]
then
        echo "$a = $b : a is equal to b"
else
        echo "$a = $b : a is not equal to b"
fi

if [ $a != $b ]
then
        echo "$a = $b : a is not equal to b"
else
        echo "$a = $b : a is equal to b"
fi

if [ -z $a ]
then
        echo "-z $a : length of a is zero"
else
        echo "-z $a : length of a is not zero"
fi

if [ -n $a ]
then
        echo "-n $a : length of a is not zero"
else
        echo "-n $a : length of a is zero"
fi

if [ $a ]
then
        echo "$a : string is not empty"
else
        echo "$a : string is empty"
fi

Listing 6-18prog17.sh

我们可以改变存储在变量 a 和 b 中的字符串的值来试验不同的结果。

文件操作

我们可以使用以下操作符检查文件的各种条件:

  • -r 检查文件是否可读。

  • -w 检查文件是否可写。

  • -x 检查文件是否可执行。

  • -f 检查文件是否是普通文件。

  • -d 检查文件是否是目录。

  • -s 检查文件大小是否为零。

  • -e 检查文件是否存在。

清单 6-19 显示了所有这些操作符的用法。

#!/bin/bash

file='prog12.sh'

if [ -r $file ]
then
        echo 'File has read access.'
else
        echo 'File does read access.'
fi
if [ -w $file ]
then

        echo 'File has write permission.'
else
        echo 'File does not have write permission.'
fi

if [ -x $file ]
then
        echo 'File has execute permission.'
else
        echo 'File does not have execute permission.'
fi

if [ -f $file ]
then
        echo 'File is an ordinary file.'
else
        echo 'File is not an ordinary file.'
fi

if [ -d $file ]
then
        echo 'File is a directory.'
else
        echo 'File is not a directory.'
fi

if [ -s $file ]
then
        echo 'File size is not zero.'
else
        echo 'File size is zero.'
fi

if [ -e $file ]
then
        echo 'File exists.'
else
        echo 'File does not exist.'
fi

Listing 6-19prog18.sh

运行脚本查看输出。

摘要

在这一章中,我们已经开始使用 shell 中的 shell 脚本。如前所述,对于负责完成各种活动的程序员来说,shell 脚本是非常有用的工具。我们已经非常详细地研究了 shell 脚本。然而,shell 脚本还有我们没有介绍的内容。如果您被委托执行与类 Unix 系统相关的任务,那么您可以在工作中使用 shell 脚本来获得想要的结果。精通脚本需要在现实生活中进行大量的实践。

在下一章中,我们将探索 I/O 重定向技术,并了解一个名为 crontab 的实用程序。我们将用一个真实的项目来证明这一点。

七、I/O 重定向和 Cron

在最后一章中,我们开始学习 Unix 类操作系统的 shell 脚本。我们现在对 shell 脚本已经很熟悉了。

继续这一势头,我们将在类 Unix 操作系统的 shell 中学习一些有用的特性。以下是我们将在本章学习的主题列表:

  • 输入输出重定向

  • 例行性工作排程

在这一章之后,我们将会很容易地在 shell 中使用上述高级特性。这是很短的一章。

输入输出重定向

在类 Unix 操作系统中,标准流是互连的输入和输出通道。三个标准互连通道是标准输入(stdin)、标准输出(stdout)和标准误差(stderr)。它们分别附加到文件句柄(或文件描述符)0、1 和 2。几乎所有的编程和脚本环境都有处理这些流的条款。让我们一个一个来看。

标准输入设备

这是标准输入。在大多数情况下,它是来自键盘的输入。让我们看一个例子。在当前位置创建一个名为 New.txt 的文件,并向该文件添加一些字符。我们知道可以用命令cat显示文件的内容,如下所示:

cat New.txt

我们可以使用 stdin 向cat命令提供数据,如下所示:

cat < New.txt

它将向我们显示命令中提到的文件内容。我们知道 Unix 将 0 与 stdin 相关联。因此,前面的命令也可以写成:

cat 0< New.txt

标准输出

标准输出通常是可视显示控制台(也可以是远程终端)。它由文件句柄 1 表示。假设我想把它重定向到一个文件。那么我可以写一个如下的命令:

ls -l 1> output.log

当我们执行前面的命令时,它不会在终端中显示输出。它会将输出重定向到命令中提到的文件。我们可以使用 cat 命令查看该文件的内容,如下所示:

cat output.log

我们也可以省略 1,将命令ls -l 1> output.log写成如下形式:

ls -l > output.log

如果文件已经存在,重定向操作符>会覆盖命令中提到的文件中以前的数据。我们可以使用>>重定向操作符添加到现有数据中,如下所示:

ls -l 1>> output.log
ls -l >> output.log

这两个命令执行相同的功能。

标准错误

我们可以重定向标准误差。它由文件句柄2表示。我们可以如下使用它:

ls -l 2>error.txt

它会将命令中的错误(如果有)重定向到命令中提到的文件。我们还可以重定向它并覆盖错误日志,如下所示:

ls -l 2>>error.txt

我们可以将输出和错误重定向到同一个文件,如下所示:

ls -l 1>output.txt 2>&1

我们也可以这样写:

ls -l >output.txt 2>&1

拒绝重定向到它的所有信息的设备文件是空设备。在类 Unix 操作系统中,是/dev/null。它也被称为 Unix 黑洞(非正式地)。我们通常将错误重定向到这个文件。它的用法如下:

ls -l 2>/dev/null

例行性工作排程

Cron 是类 Unix 操作系统中基于时间的调度程序。我们可以在固定的时间间隔运行程序或脚本。我们必须使用名为 crontab 的文件来设置 cron 作业。我们需要为要运行的预定作业创建条目。格式如下:

(分钟)(小时)(月中某日)(月中某日)<要运行的程序或脚本>

  • 分钟可以有从 0 到 59 的值。

  • 小时可以有从 0 到 23 的值。

  • 一个月中的某一天可以有 1 到 31 之间的值。

  • 可以有从 1 到 12 的值。

  • 星期几可以有从 0 到 6 的值。

让我们看几个例子。以下条目在每天午夜运行指定的脚本:

0 0 * * *  /home/pi/backup.sh

我们可以在每次重启时运行脚本或程序,如下所示:

@reboot /home/pi/test2.sh

我们可以每五分钟运行一个程序,如下所示:

*/1 * * * * /home/pi/test3.sh

我们可以使用以下命令来查看 crontab 中的当前条目:

crontab -l

我们可以使用以下命令来编辑 crontab 中的条目:

crontab -e

当你第一次运行它时,它会要求你选择编辑器。选择纳米编辑器。

让我们看一个简单的 shell 脚本和 crontab 用法的例子。让我们创建一个小 shell 脚本,如清单 7-1 所示。

#!/bin/bash
logfile=reboot_hist.log
echo "System rebooted at : " >> $logfile
date >> $logfile

Listing 7-1reboot_hist.sh

使用以下命令更改其权限:

chmod 755 reboot_hist.sh

最后,将以下条目添加到 crontab 中:

@reboot /home/pi/reboot_hist.sh

然后,当我们重新启动时,它会将重新启动时间写入指定的日志文件。我重启了几次,然后检查了日志文件。内容如下:

pi@raspberrypi:~ $ cat reboot_hist.log
System rebooted at :
Thu Sep 10 20:04:42 IST 2020
System rebooted at :
Thu Sep 10 20:07:01 IST 2020

摘要

在这个简短的章节中,我们学习了 shell 的两个高级特性:I/O 重定向和 crontab 的使用。我们还看到了 crontab 条目的一个小例子。这两个特性在编写 shell 脚本时都非常有用。

通过这一章,我们结束了我们的 shell 脚本之旅。在下一章,我们将学习如何在 Linux 上用 C、C++和 Python 3 这样的高级编程语言编程。

八、高级编程语言介绍

在上一章中,我们总结了 Linux shell 脚本。在这一章中,我们将学习如何用高级编程语言编写程序,比如 C、C++和 Python 3,以及 RPi OS。以下是我们将在本章中详细学习的主题列表:

  • C 和 C++编程

  • Python 编程语言

  • Debian 衍生工具上的 Python 3

学完这一章后,我们将能熟练地在 Linux 平台上使用现代编程语言编写程序。

C 和 C++编程

C 和 C++是非常通用的编程语言。截至目前,几乎所有的操作系统(具体来说就是 OS 内核和设备驱动)都是用 C 编程语言编写的。我从 2003 年开始在 Linux 平台上写 C 和 C++程序。我主要使用 GCC (GNU 编译器集合)来编译使用任何 Linux 发行版的 C 程序。另外,我在 Linux 上使用 C++的 g++编译器。因此,在这一节中,我将简要介绍使用 GCC 和 g++编译器进行编译的过程。我们还将看到如何执行编译后的字节码。

这两个编译器都预装在 RPi 操作系统上。如果您想确认,只需运行以下命令:

sudo apt-get install build-essential

它将返回包含以下字符串的消息:

build-essential is already the newest version (12.6).

意味着已经安装了 GCC 和 g++。

我们可以使用以下命令来验证版本:

gcc -v
g++ -v

我们可以使用任何文本编辑器创建并保存一个名为prog00.c的 C 程序,如下所示:

#include<stdio.h>
int main( void )
{
            printf("Hello, World\n");
            return 0;
}

使用以下命令编译它:

gcc prog00.c -o prog00

这里,-o后面的字符串是我们程序的可执行文件的名称。如果我们不使用-o后跟文件名,默认情况下它会创建a.out可执行文件。使用以下命令运行可执行文件:

./prog00

它将输出如下:

Hello, World

我们也可以写一个 C++程序,prog01.cpp,如下所示:

#include<iostream>
using namespace std;
int main(void)
{
cout<<"Hello, World\n";
return 0;
}

我们可以这样编译它:

g++ prog01.cpp -o prog01

我们可以如下运行它:

./prog01

输出如下所示:

Hello, World

这就是我们如何在 Linux 平台上编译和运行 C 和 C++程序。本节绝不是 GCC 和 g++的全面指南。您可能有兴趣了解更多关于 GCC 的信息。可以在这里访问 GCC 项目主页: gcc. gnu. org/

Python 编程语言

Python 3 是一种高级的解释性编程语言。它是一种通用编程语言。在这一节中,我们将深入讨论 Python 编程语言及其哲学。

Python 编程语言的历史

Python 是 ABC 编程语言的继承者,而 ABC 编程语言本身受到了 ALGOL 68 和 SETL 编程语言的启发。它是由吉多·范·罗苏姆在 20 世纪 80 年代末度假期间作为个人业余项目创建的,当时他正在荷兰的 Centrum wisk unde(CWI)信息中心(英文:“国家数学和计算机科学研究所”)工作。从 Python 编程语言的最初发布到 2018 年 7 月 12 日,Guido 一直是这个项目的首席开发人员和仁慈的生命独裁者(BDFL) 。7 月 12 日之后,他开始了永久休假,现在在 Python 指导委员会工作。以下是 Python 发布时间表中的重要里程碑:

  • 1991 年 2 月:van Rossum 向 alt.sources 发布了代码(标记为版本 0.9.0)

  • 1994 年 1 月:1.0 版本发布。

  • 2000 年 10 月:Python 2.0 发布。

  • 2006 年 12 月:Python 3.0 发布。

  • 2019 年 12 月:Python 2.x 正式退役,不再受 Python 软件基金会支持。

正如我们在时间线中看到的,Python 2.x 版本不再受支持,Python 3 是最新的。Python 3 不向后兼容 Python 2。Python 3 是 Python 编程语言的最新版本,也是受支持的版本。因此,我们将在整本书中使用 Python 3 来演示数据可视化的程序。除非明确提到,否则在本书中,Python 指的是 Python 3。

Python 增强建议

为了指导 Python 的开发、维护和支持,Python 领导层提出了 Python 增强提案(PEPs)的概念。它们是 Python 项目中建议新特性和修复问题的主要机制。我们可以通过以下网址了解更多关于 pep 的信息:

www. python. org/ dev/ peps/

www . python . org/dev/peps/pep-0001/

Python 编程语言的哲学

Python 的哲学在 PEP20 中有详细介绍。它被称为Python 的禅宗可以在www . Python . org/dev/peps/pep-0020/找到。以下是人教版的要点。有几个很有趣:

  1. 漂亮总比难看好。

  2. 显性比隐性好。

  3. 简单比复杂好。

  4. 复杂总比复杂好。

  5. 扁平的比嵌套的好。

  6. 疏比密好。

  7. 可读性很重要。

  8. 特例不足以特殊到打破规则。

  9. 然而,实用性战胜了纯粹性。

  10. 错误永远不应该无声无息地过去。

  11. 第 10 点是如此,除非明确沉默。

  12. 面对暧昧,拒绝猜测的诱惑。

  13. 应该有一种——最好只有一种——显而易见的方法来做这件事。

  14. 然而,这种方式一开始可能并不明显,除非你是荷兰人。

  15. 现在总比没有好。

  16. 然而,从来没有比现在“正确”更好。

  17. 如果实现很难解释,这是一个坏主意。

  18. 如果实现很容易解释,这可能是一个好主意。

  19. 名称空间是一个非常棒的想法——让我们多做一些吧!

这些是影响了 Python 编程语言的发展并继续影响的一般哲学指导方针。

Python 的应用

正如我们所见,Python 是一种通用编程语言,它在以下领域有大量应用:

  1. Web 开发

  2. GUI 开发

  3. 科学和数值计算

  4. 软件开发

  5. 系统管理员

我们可以在 www . Python . org/success-stories/上阅读各种项目的 Python 案例研究。

Debian 衍生工具上的 Python 3

Python 3 预装在 Debian 和所有衍生产品上,如 Ubuntu 或 Raspberry Pi OS。所以我们不必单独安装它。两个主要的 Python 版本,Python 2 和 Python 3,都预装在 Debian 衍生产品中。Python 2 和 Python 3 的可执行文件分别被命名为 pythonpython3 。我们必须使用可执行文件 python3 进行演示。要了解所需二进制可执行文件的版本和位置,请逐一运行以下命令:

python3 -V
which python3

Python 模式

Python 有各种模式。让我们逐一讨论。在开始讨论之前,我们先来看看什么是空闲。IDLE 代表 Integrated Development and Learning Environment,是 Python 软件基金会为 Python 编程开发的 IDE(集成开发环境)。

并非所有的 Linux 发行版都预装了 IDLE。我们可以通过依次运行以下命令将它安装在 Debian 及其衍生产品(包括 Raspberry Pi OS)上:

sudo apt-get update --fix-missing
sudo apt-get install idle3 -y

一旦安装完成,我们可以在菜单中找到空闲(在这种情况下,树莓 Pi OS 菜单)如图 8-1 所示。

img/503786_1_En_8_Fig1_HTML.jpg

图 8-1

在 Raspberry Pi 操作系统菜单中空闲

我们还可以通过运行以下命令在 Linux 上启动 IDLE:

idle

它将启动一个窗口,如图 8-2 所示。

img/503786_1_En_8_Fig2_HTML.jpg

图 8-2

空闲窗口

在我们继续之前,我们需要为我们的眼睛的舒适配置它。我们可以通过点击选项➤配置空闲来改变字体,如图 8-3 所示。

img/503786_1_En_8_Fig3_HTML.jpg

图 8-3

配置空闲

以下窗口打开(如图 8-4 所示),您可以在此更改空闲字符的字体和大小。

img/503786_1_En_8_Fig4_HTML.jpg

图 8-4

空闲配置窗口

现在,让我们讨论 Python 的各种模式。

对话方式

Python 的交互模式是命令行类型的 shell,它执行当前语句并在控制台上给出即时反馈。它在活动内存中运行以前输入的语句。当新的语句被输入解释器并由解释器执行时,输入的代码被求值。当我们打开 IDLE 时,我们会看到一个命令行提示符。无非就是 Python 的交互模式。让我们看一个简单的例子。让我们在交互提示中输入习惯的 Hello World 程序,如下所示:

print('Hello World!')

按 Enter 键将该行输入解释器并执行它。图 8-5 是输出的截图。

img/503786_1_En_8_Fig5_HTML.jpg

图 8-5

空闲时的 Python 交互模式

我们也可以从命令提示符启动 Python 的交互模式。在 Linux 命令提示符下(例如 lxterminal),我们必须运行命令 python3 来启动它。图 8-6 是 RPi OS 命令提示符下交互模式的截图(远程访问)。

img/503786_1_En_8_Fig6_HTML.jpg

图 8-6

Linux 命令提示符下的 Python 交互模式

脚本模式

我们可以写一个 Python 程序,保存在磁盘上。然后我们可以通过多种方式来启动它。这就是所谓的脚本模式。让我们在空闲时演示一下。我们可以使用任何文本编辑器来编写 Python 程序。但是,由于 IDLE 是一个 IDE,所以用 IDLE 编写和运行 Python 程序很方便。让我们先看看那个。在空闲时,点击文件➤新建文件。它将创建一个空白的新文件。向其中添加以下代码:

print('Hello World!')

然后在磁盘上以 prog00.py 的名称保存,如图 8-7 所示。

img/503786_1_En_8_Fig7_HTML.jpg

图 8-7

空闲代码编辑器中的 Python 程序

在菜单中,点击运行➤运行模块。在 IDLE 的提示下执行程序,如图 8-8 所示。

img/503786_1_En_8_Fig8_HTML.jpg

图 8-8

在空闲提示符下执行的 Python 程序

我们甚至可以在操作系统的命令提示符下用 Python 的解释器启动程序。打开操作系统的命令提示符,导航到存储程序的目录。

在 Linux 终端中,我们必须在命令提示符下运行以下命令:

python3 prog00.py

然后解释器将在命令提示符下运行程序,输出(如果有的话)将出现在那里。

在 Linux 中,有另一种方法可以运行程序,而不用显式地使用解释器。我们必须将 shebang 行添加到代码文件的开头。例如,我们的代码文件如下所示:

#!/usr/bin/python3
print('Hello World!')

第一条线被称为 shebang 线。它告诉 shell 使用什么解释器及其位置。然后运行以下命令更改文件权限,使其对所有者可执行,如下所示:

chmod 755 prog00.py

然后我们可以像其他可执行文件一样用直接启动我们的 Python 程序文件。/ 如下:

./prog00.py

shell 将执行程序并在终端中打印输出。请注意,这仅适用于类 Unix 系统,因为它们支持使用 shebang 执行程序。

摘要

在这一章中,我们开始学习 Linux 上的 C 和 C++编程。然后我们探索了 Python 编程语言的基础。我们学习了如何编写基本的 Python 程序,以及如何以各种方式执行它们。我们还学习了 Python 编程语言的各种模式,以及如何从命令提示符启动它。

现在,我们对 RPi OS 上的高级编程语言(以及 Debian 衍生工具)已经非常熟悉了。我们可以用 C、C++和 Python 3 编写和执行程序。您可能想在 Raspberry Pi 操作系统上探索 Java 编程。RPi OS 预装了 Java 和相关的 ide。

在下一章中,我们将继续我们用 Python 3 编程的美妙旅程,并为 GPIO(通用输入/输出)编程编写程序。为此,我们将使用发光二极管、电阻、试验板和其他电子元件。我们还将简要介绍数字电子中的各种总线。

九、使用 RPi GPIO 编程

在上一章中,我们介绍了类 Unix 平台上的高级编程语言。我们学习了用 C 和 C++用 GCC 编译器编写程序。我们还学习了如何用 Python 3 编程语言编写和执行程序。

继续我们在上一章停止的地方,在这一章,我们将探索用 RPi 和 Python 3 进行 GPIO 编程。以下是我们将在本章探讨的主题列表:

  • GPIO 引脚

  • 使用 GPIO 编程

在这一章之后,我们将会对 GPIO 编程和使用 Raspberry Pi 的基本电子元件感到很舒服。

通用输入/输出引脚

RPi 板有通用输入/输出接头引脚。所有版本的 RPi 板都有此功能。这个特性使单板计算机有别于其他小型计算机。GPIO 引脚使 SBC 能够直接与低级电子元件和各种数据传输总线接口。

我在本章中使用了一个 8 GB 内存的 RPi 4 B 板。这是 RPi 系列中最新的主板。通过运行以下特定于 RPi 操作系统的命令,我们可以看到任何 RPi 板上引脚的含义:

pinout

它将向我们展示电路板的布局,如图 9-1 所示。

img/503786_1_En_9_Fig1_HTML.jpg

图 9-1

RPi 4 B 的电路板布局

在图的左上部分,我们可以看到 40 个 GPIO 引脚。一些早期型号的 RPi 有 26 个引脚。但是早就停产了,这里就不讨论了。我们将在本章演示的程序与所有的 Pi 模型都是兼容的。图 9-1 是命令行上显示的输出的第一部分。如果我们向下滚动,我们可以看到更多。输出的最后部分向我们展示了如图 9-2 所示的引脚的含义。

img/503786_1_En_9_Fig2_HTML.jpg

图 9-2

RPi 4 B 引脚排列

该输出向我们显示了电源引脚(5V、3V3 和 GND)和数字 IO 引脚。GND 代表地,3V3 代表 3.3 伏。我们可以看到输出中显示了两种编号方案。物理引脚号(也称为板引脚号)在括号内,BCM 名称在外面。为了方便起见,我们将在编写的程序中使用电路板(物理)引脚编号。

我们可以通过比较两个图 9-1 和 9-2 来了解销的方向。这两个图中的销都用颜色标记。

现在,拿一个 LED、一个电阻器和几根跨接电缆,准备如图 9-3 所示的电路。

img/503786_1_En_9_Fig3_HTML.jpg

图 9-3

简单的 LED 电路

只要 RPi 板打开,LED 就会一直亮着。这是因为我们将 LED 的阳极(较长的引脚)连接到 3V3 引脚,阴极通过 470 欧姆的电阻连接到 GND 引脚。这是我们能用它制作的最简单的 LED 电路。你可以试着把 LED 的阳极接到 5V 的管脚上,它会发出更多的光。我们选择了阻值合适的电阻,这样就不会烧坏 LED。在下一节中,我们将看到如何用 GPIO 编写程序。

使用 GPIO 编程

在本节中,我们将看到带有发光二极管和按钮的简单电路。为此,我们将使用 Python 3 GPIO 库。它预装在 RPi 操作系统中。如果没有预先安装,请使用以下命令进行安装:

sudo apt-get install python3-rpi.gpio -y

准备如图 9-4 所示的电路。

img/503786_1_En_9_Fig4_HTML.jpg

图 9-4

可编程 LED 电路

我们将 LED 的阳极连接到图 9-2 中物理编号为 8 的引脚。这是我们对早期赛道的唯一改变。查看列表 9-1 。

from time import sleep
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)

while True:
    GPIO.output(8, GPIO.HIGH)
    sleep(1)
    GPIO.output(8, GPIO.LOW)
    sleep(1)

Listing 9-1LED_Blink.py

让我们详细讨论一下。前两行导入所需的库。然后,我们用语句GPIO.setmode()指示 RPi 板使用板(如前所述,也称为物理)引脚编号。然后我们禁用警告。我们使用函数GPIO.setup()将电路板引脚 8 设置为输出模式。我们也将其初始状态设置为LOW。然后,在一个无限循环中,我们交替发送HIGHLOW信号到引脚 8。对函数sleep()的调用在语句之间增加了 1 秒的间隔。当 8 脚为HIGH时,LED 亮;当第 8 脚为LOW时,LED 熄灭。使用以下命令运行脚本:

python3 LED_Blink.py

LED 将开始闪烁。要终止程序,请按键盘上的 Ctrl+C。

这是基本的 GPIO 编程。如果我们使用试验板将多个 led 连接到数字 GPIO 引脚,我们可以创造性地利用这一点来创建各种模式的闪烁 led。

摘要

在本章中,我们继续了 Python 3 编程的旅程,并研究了一个使 LED 闪烁的程序。我们还学习了如何用一个 LED 和一个电阻构建一个基本电路。Raspberry Pi 通过它的 GPIO 编程提供了更多的东西。您可以在方便的时候进一步探索这个庞大的主题。

在下一章中,我们将详细研究 RPi 操作系统的 GUI。我们还将详细了解如何为 RPi OS 安装各种桌面环境。

十、探索 RPi 操作系统 GUI

在上一章中,我们详细探讨了 Raspberry Pi GPIO。我们用 Python 编写了程序来演示 RPi 的 GPIO 功能。我们还简要介绍了 RPi 中其他类型的公共汽车。

这一章将把我们的焦点转移回 RPi OS 的软件部分。在本章中,我们将探索 RPi OS 上的各种桌面环境和 GUI 实用程序。以下是本章涵盖的主题列表:

  • RPi 操作系统上的 GUI 实用程序

  • 其他桌面环境

在本章之后,我们将会非常熟悉 RPi OS 上的各种 GUI 环境和实用程序。

RPi 操作系统上的 GUI 实用程序

RPi OS 上有许多 GUI 实用程序。它们是按照用途分组的。图 10-1 显示了 RPi OS 菜单。

img/503786_1_En_10_Fig1_HTML.jpg

图 10-1

RPi 菜单

让我们对菜单项有一个概述。在编程部分,可以找到所有用于编程的实用程序。RPi OS 附带了用于 Java (BlueJ 和 Greenfoot)、Python (Thonny、Geany、Mu)、Scratch、Wolfram 和 Mathematica 的 ide。我们前面也看到了如何为 Python 3 安装 IDLE。你可以在这里找到。有一些有趣的工具,如 Node-RED、Sense HAT Emulator 和 Sonic Pi。值得去探索它们。

教育部分有 SmartSim,这是一个学习数字电子的软件。

对于想要使用文字处理器和电子表格等办公应用程序的人来说, Office 部分非常方便。

互联网部分有一个网络浏览器、VNC 和一个电子邮件客户端。

声音&视频部分有 VLC 媒体播放器。图形部分有一个图像浏览器。您可能还想在游戏区玩几个游戏。

接下来的四个部分有各种管理 RPi 的工具和一些有用的程序。我建议你自己去探索它们。点击运行部分,会弹出一个窗口,通过输入程序名称来启动程序。我们已经在第一章中看到了演示。如果你知道这些程序的名字,你可以在这里输入它们的名字。我们也已经看到了最后一个选项注销

这都是关于修改后的 LXDE 桌面环境。在下一节中,我们将探索 RPi OS 的其他桌面环境。

其他桌面环境

让我们逐一安装其他桌面环境。

XFCE 你好

安装这个很容易。只需按顺序一个接一个地运行以下命令:

sudo apt-get update --fix-missing
sudo apt-get install xfce4 -y
sudo apt-get install slim -y

现在,当我们重新启动时,我们会看到如图 10-2 所示的屏幕。

img/503786_1_En_10_Fig2_HTML.jpg

图 10-2

登录屏幕

我们需要按键盘上的 F1 键来选择桌面环境。按一次 F1,显示会话:默认 x 会话,如图 10-2 所示。这是 RPi 操作系统附带的默认修改 LXDE。我们已经看到了这一点。

当我们再次按 F1 时,下一个选项出现在这里。它显示 Xfce 会话。如果我们再按 F1,我们看到Session:open box;再按一次 F1 后,显示 LXDE 。现在,如果我们再次按 F1,它会让我们回到第一个选项。所以选择 Xfce 会话,键入用户名和密码(我没有更改默认的用户名/密码组合 pi / raspberry )。

登录后,它显示一个漂亮的 XFCE 桌面,如图 10-3 所示。

img/503786_1_En_10_Fig3_HTML.jpg

图 10-3

XFCE 桌上型电脑

可以去探索一下。它非常方便用户。

让我们重新启动,这次选择选项 Session: Openbox 。登录进去,你会发现一个空白的桌面环境。这是因为 Openbox 是 X Window 系统的免费堆栈窗口管理器。我们可以右键单击并查看菜单选项。您可以进一步探索这种风格的桌面。右键单击后,您可以在显示的菜单中看到退出选项。选择该选项以返回登录屏幕。现在选择会话:LXDE 。它也将展示一个非常好的、令人愉快的、视觉上吸引人的桌面环境,如图 10-4 所示。

img/503786_1_En_10_Fig4_HTML.jpg

图 10-4

lxd 台式机

这是未经修改的 LXDE 桌面环境。菜单没有标签,一开始可能很难找到。在左下角,如图 10-4 所示。

KDE 等离子体

KDE 是一个为类 Unix 操作系统开发自由软件的国际社区。KDE 开发的软件之一是 KDE 等离子桌面环境。让我们把它安装在我们的码头上。打开当前桌面环境的终端程序,并运行以下命令:

sudo apt-get update --fix-missing
sudo apt-get dist-upgrade -y
sudo apt-get install kde-full -y

我们可以在 https://wiki.debian.org/KDE 看到其他安装选项。在安装过程中,系统会提示您选择桌面环境。选择苗条的。安装完成后,重新启动系统。我们会发现 KDE 等离子作为登录屏幕中的一个选项(图 10-5 )。

img/503786_1_En_10_Fig5_HTML.jpg

图 10-5

KDE 等离子桌面

KDE 等离子、XFCE 和 LXDE 环境将自带一套实用程序。如果您选择任何桌面环境,您会发现所有实用程序都列在菜单下。请随意探索自己的实用工具。

摘要

在本章中,我们学习了各种重要的实用程序。我们还学习了在 RPi OS 上为 RPi 安装其他桌面环境。实际上,正如前面所建议的,使用所有的桌面环境并自己探索实用程序。

接下来,我们将看到这本书的附录,其中包含了与 Raspberry Pi 操作系统相关的提示和技巧。

posted @ 2024-08-02 19:34  绝不原创的飞龙  阅读(26)  评论(0编辑  收藏  举报