2021年1月

这个不起眼的终端功能在紧要关头提供一个文本编辑器。

在 Linux 和 Unix 的 shell 中有一个不为人知的功能,它能让你用 cat 命令打开一个 do-while 循环。它被称为 heredoc,无论你使用什么 shell,它都能让你或多或少地拥有一个文本编辑器。它的语法是:

$ cat << EOF >> example.txt

中间的字符串(EOF),本质上是一个停止循环的条件。也就是说,如果你在一行中单独输入它,循环就会结束。在循环过程中,无论你在终端中输入什么,都会被管道传送到目标文件中(在本例中)。

安装

只要你有一个终端,你就能够启动 heredoc。我在 Bashtsh 和 Korn shell 中使用过这个语法技巧。

使用 heredoc

要打开一个 heredoc “会话”,你可以使用带重定向的 cat 命令。首先用终止字符串(常见约定是 EOF,代表 “End Of File”,但它实际上可以是任何字符串)指向 cat 命令。在终止字符串之后,将输出重定向到一个目标文件。然后,你就可以直接在终端中输入了,可以使用最常见的 shell 键盘快捷键来处理你的工作。当你在一行上输入你指定的终止字符串时,你的会话就结束了。你可以通过唯一的提示符(通常是 >)知道你是在一个 heredoc 循环中。

$ cat << EOF >> example.txt
> Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...
>
> whatever...
>
> you want to type.
>
> EOF
$  

在终端等待 EOF 时,你输入的所有内容都会被放入目标文件中,提示符被忽略,EOF 本身也不是文件的一部分。

Everything you type here will be placed into example.txt when I type EOF on a line by itself. Until then, you can type...

whatever...

you want to type.

在现实中,你可能不会用 heredoc 语法来代替一个正常的文本编辑器。它是一个很好的快速处理方式,可以输入多行,但超过 10 行左右就开始限制它的作用了。例如,如果不触发你 shell 的 history 功能,你就不能编辑以前的行。根据你的 shell 和配置,你可能需要先按向上键,然后按向下键来找回你的文本,然后用 Ctrl+B 来后退。

你的 shell 的大部分功能都能正常工作,但可能没有撤销功能,也没有什么错误恢复功能。

此外,即使是最简安装的系统,可能也至少安装了 Vied

然而 heredoc 还是很有用的!它比 echo 更灵活,当你在编写 shell 脚本时,它是不可缺少的。例如,想象一下你正在编写一个安装脚本,以便你可以自动安装一组自定义应用。其中一个应用没有生成 .dekstop 文件,所以它不会出现在你的应用菜单中。为了解决这个问题,你决定在安装时生成一个 .desktop 文件。

与其编写一个 .desktop 文件,然后作为安装脚本的外部依赖,不如在安装脚本中使用 heredoc:

#!/bin/sh

VERSION=${VERSION:-x.y.z}
PKGNAM=${VERSION:-example}
PKG="${PKGNAM}"-"${VERSION}"-`arch`.tgz

# download package
wget "${PKG}"
tar txvf "${PKG}"

# use here doc to create missing .desktop file
cat << EOF >> $HOME/.local/share/applications/example.desktop
[Desktop Entry]
Version=1.0
Type=Application
Name="${PKGNAM}"
Comment="${PKGNAM}"
Exec="${PKGNAM}" %F
EOF

# insert the rest of an install script...

你自动地将文本输入到了一个文件中,而不需要文本编辑器(当然,除了你用来写脚本的那个)。下面是生成的 .desktop 文件的样子:

[Desktop Entry]
Version=1.0
Type=Application
Name=example
Comment=example
Exec=example %F

正如你所看到的,你可以在 heredoc 中使用变量,而且它们得到了正确的解析。EOF 字符串并没有出现在文件中,它只是标志着 heredoc 的结束。

比 echo 更好

heredoc 技术通常被认为比 echoprintf 更容易,因为一旦你“进入”了文档,你就可以自由地做任何你想做的事情。从这个意义上说,它是自由的,但与合适的文本编辑器相比,它是有限的。

使用 heredoc 来做快速笔记和 shell 脚本,再也不用为如何动态生成配置文件而烦恼了。


via: https://opensource.com/article/20/12/heredoc

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

花上一小时,用 Fedora 让一台过时的 Mac 重新有用。

最近,我偶然找到了一台 2011 年底的老款 13 英寸 MacBook Pro,有 125GB SSD 和 8GB 内存。我曾带着这台机器去世界各地旅行,当年,我开了很多场会议、研讨会或演示,分享 JBoss 技术带来的各种 AppDev 优势。

在验证了它的电池能用,充了电,重新安装了一个新的 OS X 之后,我发现 Safari 浏览器的版本受限于旧的安全规范,这意味着它现在无法连接到很多 HTTPS 网站。这就使得这个解决方案失效了。

这个老伙计该怎么处理呢?

自从我作为开发人员专门在 Linux 工作站上工作以来已经有几年了。我只使用 Fedora,所以我决定尝试在这台 MacBook Pro 上安装它的最新版本。

我只花了一个多小时就用下面的步骤让 Fedora 33 在这台笔记本上工作了。

下载 Fedora 33 并创建一个临场 USB

第一步是找到正确的安装 Fedora 的方法。这台机器有一个 CD 插槽,所以可以刻录一个 ISO 并从它启动,但我选择直接使用可启动的 USB 方式。

我登上了另一台 MacBook,访问了 Fedora Workstation 网站,它有 Fedora Media Writer 的链接。点击你的机器类型的图标(在我的例子中是苹果标志),你会得到一个安装包。

 title=

开始安装,可以看到一个引导你完成安装过程的图形用户界面(GUI)。选择 Fedora Workstation 33 选项。

 title=

接下来,选择右上角的“Create Live USB”选项。

 title=

镜像将开始下载,你将看到一个下拉菜单来选择安装位置。

 title=

插入一个有足够空间的 U 盘,下载完成后,就可以选择它并在上面安装镜像。完成后,关闭 GUI,取出 U 盘。

安装 Linux

将你创建的 U 盘插入 MacBook Pro 左侧的端口,并按住 Cmd 键左侧的 Option(或 Alt)键的同时重新启动。这将打开一个启动机器的选项菜单:使用 EFI 选项,因为那是 USB 镜像。

笔记本电脑将从 USB 设备启动,你可以按照正常的 Fedora 安装过程进行。如果你能将 MacBook Pro 插入网线连接,会有帮助,因为它的 Broadcom WiFi 设备无法开箱即用。

 title=

你现在也可以将 Fedora 安装到你的硬盘上,并将它永久地放在你的机器上。

 title=

一旦安装程序完成,重新启动机器,Fedora 33 现在应该是启动选项。

 title=

唯一缺少的就是 WiFi 驱动,所以要保持网线连接,安装你正在运行的内核的开发包,并为该内核构建 broadcom-wl 驱动。

验证你需要用于 WiFi 的卡。

$ lspci -vnn -d 14e4:

在输出中会有几项,包括如下内容:

Network controller [0280]: Broadcom Inc. and subsidiaries....

Subsystem: Apple Inc. AirPort Extreme...

安装一个仓库来拉取 Broadcom 相关的部分:

$ su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'

接下来的部分很有趣:如果你查看正在运行的内核时,你会看到 v5.9.8-200.fc33,但是你要使用开发内核包来构建你的 Broadcom 无线驱动。所以,你需要安装 v5.8.15-301.fc33(在写这篇文章的时候可用)。使用 uname -r 检查它们,并使用 sudo dnf list kernel 列出已安装的内核包:

$ sudo dnf list kernel
kernel.x86_64                     5.8.15-301.fc33
kernel.x86_64                     5.9.8-200.fc33

安装开发包:

$ sudo dnf install -y akmods kernel-devel-5.8.15-301.fc33

 title=

安装 Broadcom 无线软件包:

$ sudo dnf install -y broadcom-wl

构建内核模块:

$ sudo akmods

 title=

重新启动你的机器,你应该可以看到无线驱动(wl)。

$ lsmod | grep wl

在 Fedora 中设置你的无线连接:

 title=

这篇文章对我来说有些出乎意料,但我希望它能帮助别人在周末享受一些老硬件的乐趣!

现在要走不寻常路了……在 2011 年的 Macbook Pro 上安装 #Fedora。祝我好运! pic.twitter.com/zlsESnq2Px

此文原载于 Schabell.org,经许可转载。


via: https://opensource.com/article/20/12/linux-macbook

作者:Eric D. Schabell 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过编写一个“猜数字”游戏来探索 Python(和其他编程语言)。

在这个系列中,我们要用不同的编程语言编写相同的应用,以比较各种语言是如何工作的,并说明使用标准测试程序是学习新编程好方法。

当你学习一门新的编程语言时,关注它们的共同点是件好事。变量、表达式和语句是大多数编程语言的基础。一旦你理解了这些概念,你就可以开始弄清楚其余的东西。

因为编程语言有许多相似之处,一旦你知道一种语言,你通常可以通过观察它与你所知道的语言的不同之处来学习另一种语言的基础知识。使用你用其他语言编写的标准测试程序,可以让你专注于语言,而不是程序的逻辑。

为了证明这点,我们正在测试如何用多种语言编写一个“猜数字”程序。计算机选择一个 1 到 100 之间的数字,然后让你猜。程序循环,直到你猜出正确答案。

“猜数字”程序练习了编程语言的几个概念:

  • 变量
  • 输入
  • 输出
  • 条件判断
  • 循环

这是一个很好的学习新编程语言的实践实验。

用 Python 猜数字

Python 软件基金会的话来说。“Python 是一种解释性的、交互式的、面向对象的程序设计语言,它包含了模块、异常、动态类型、非常高层的动态数据类型和类。”它是一种很好的通用编程语言,从简单的脚本到复杂的 GUI 应用都很适用。

你可以通过编写一个版本的“猜数字”游戏来探索 Python。这是我的实现:

import random as randomlib
random = randomlib.randint(1, 100)
print("Guess a number between 1 and 100")
while True:
    guess = int(input())
    if guess < random:
        print("Too low")
    elif guess > random:
        print("Too high")
    else:
        print("That's right!")
        break

要给一个变量赋值,请列出变量的名称,然后是 = 号。例如,语句 random = 0random 变量分配了一个零值。

脚本的第一行就导入了 random 模块。由于本系列中的所有程序都使用 random 作为变量的名称,你可以使用 import random as randomlib 以别名导入它,以避免命名冲突。

很少有函数被内置到 Python 中,大多数函数必须从标准库中显式导入。random 标准库模块有生成各种随机值的功能。

脚本的第二行读取函数 randint() 的结果,并将其赋值给名为 random 的变量。函数需要两个参数:一个最小值和一个最大值。在本例中,范围是 1100,以使游戏具有足够的挑战性。

你可以使用 input() 函数提示用户输入一个值。如果你写 guess = int(input()),Python 会等待用户输入一些文本,将其转换为一个整数,然后将值存储在 guess 变量中。

Python 支持条件表达式和循环等流程控制。在“猜数字”游戏中,只要 guess 中的值不等于 random,Python 就会继续循环。

如果猜测值小于随机数,Python 会打印 Too low,如果猜测值大于这个数字,Python 会打印 Too high

示例输出

现在你已经写好了 Python 程序,运行它来玩“猜数字”游戏。每次运行程序,Python 都会随机选取一个不同的数字。为了完成这个游戏,你需要猜测,直到找到正确的数字:

$ python guess.py
Guess a number between 1 and 100
 50
Too high
 25
Too high
 12
Too high
 7
Too high
 3
Too low
 5
Too low
 6
That's right!

在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以一种相当直接的方式练习了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示不同编程语言的一些核心概念,并比较每种语言的细节。

你有喜欢的编程语言吗?你会如何编写“猜数字”游戏?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子吧!


via: https://opensource.com/article/20/12/learn-python

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出