2018年8月

许多 Linux 命令现在都有使其输出更易于理解的选项。让我们了解一些可以让我们心爱的操作系统更友好的东西。

不是每个人都以二进制方式思考,他们不想在大脑中给大数字插入逗号来了解文件的大小。因此,Linux 命令在过去的几十年里不断发展,以更人性化的方式向用户显示信息,这一点也不奇怪。在今天的文章中,我们将看一看各种命令所提供的一些选项,它们使得数据变得更容易理解。

为什么默认显示不更友好一些?

如果你想知道为什么默认不显示得更人性化,毕竟,我们人类才是计算机的默认用户啊。你可能会问自己:“为什么我们不竭尽全力输出对每个人都有意义的命令的响应?”主要的答案是:改变命令的默认输出可能会干扰许多其它进程,这些进程是在期望默认响应之上构建的。其它的工具,以及过去几十年开发的脚本,如果突然以一种完全不同的格式输出,而不是它们过去所期望的那样,可能会被一种非常丑陋的方式破坏。

说真的,也许我们中的一些人可能更愿意看文件大小中的所有数字,即 1338277310 而不是 1.3G。在任何情况下,切换默认习惯都可能造成破坏,但是为更加人性化的响应提供一些简单的选项只需要让我们学习一些命令选项而已。

可以显示人性化数据的命令

有哪些简单的选项可以使 Unix 命令的输出更容易解析呢?让我们来看一些命令。

top

你可能没有注意到这个命令,但是在 top 命令中,你可以通过输入 E(大写字母 E)来更改显示全部内存使用的方式。连续按下将数字显示从 KiB 到 MiB,再到 GiB,接着是 TiB、PiB、EiB,最后回到 KiB。

认识这些单位吧?这里有一组定义:

2`10 = 1,024 = 1 KiB (kibibyte)
2`20 = 1,048,576 = 1 MiB (mebibyte)
2`30 = 1,073,741,824 = 1 GiB (gibibyte)
2`40 = 1,099,511,627,776 = 1 TiB (tebibyte)
2`50 = 1,125,899,906,842,624 = PiB (pebibyte)
2`60 = 1,152,921,504,606,846,976 = EiB (exbibyte)
2`70 = 1,180,591,620,717,411,303,424 = 1 ZiB (zebibyte)
2`80 = 1,208,925,819,614,629,174,706,176 = 1 YiB (yobibyte)

这些单位与千字节(KB)、兆字节(MB)和千兆字节(GB)密切相关。虽然它们很接近,但是它们之间仍有很大的区别:一组是基于 10 的幂,另一组是基于 2 的幂。例如,比较千字节和千兆字节,我们可以看看它们不同点:

KB = 1000 = 10`3
KiB = 1024 = 2`10

以下是 top 命令输出示例,使用 KiB 为单位默认显示:

top - 10:49:06 up 5 days, 35 min,  1 user,  load average: 0.05, 0.04, 0.01
Tasks: 158 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  6102680 total,  4634980 free,   392244 used,  1075456 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  5407432 avail Mem

在按下 E 之后,单位变成了 MiB:

top - 10:49:31 up 5 days, 36 min,  1 user,  load average: 0.03, 0.04, 0.01
Tasks: 158 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.6 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 5959.648 total, 4526.348 free,  383.055 used, 1050.246 buff/cache
MiB Swap: 2047.996 total, 2047.996 free,    0.000 used. 5280.684 avail Mem

再次按下 E,单位变为 GiB:

top - 10:49:49 up 5 days, 36 min,  1 user,  load average: 0.02, 0.03, 0.01
Tasks: 158 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
GiB Mem :    5.820 total,    4.420 free,    0.374 used,    1.026 buff/cache
GiB Swap:    2.000 total,    2.000 free,    0.000 used.    5.157 avail Mem

你还可以通过按字母 e 来更改为显示每个进程使用内存的数字单位。它将从默认的 KiB 到 MiB,再到 GiB、TiB,接着到 PiB(估计你能看到小数点后的很多 0),然后返回 KiB。下面是按了一下 e 之后的 top 输出:

top - 08:45:28 up 4 days, 22:32,  1 user,  load average: 0.02, 0.03, 0.00
Tasks: 167 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  6102680 total,  4641836 free,   393348 used,  1067496 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  5406396 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  784 root      20   0  543.2m  26.8m  16.1m S   0.9  0.5   0:22.20 snapd
  733 root      20   0  107.8m   2.0m   1.8m S   0.4  0.0   0:18.49 irqbalance
22574 shs       20   0  107.5m   5.5m   4.6m S   0.4  0.1   0:00.09 sshd
    1 root      20   0  156.4m   9.3m   6.7m S   0.0  0.2   0:05.59 systemd

du

du 命令显示磁盘空间文件或目录使用了多少,如果使用 -h 选项,则将输出大小调整为最合适的单位。默认情况下,它以千字节(KB)为单位。

$ du camper*
360     camper_10.jpg
5684    camper.jpg
240     camper_small.jpg
$ du -h camper*
360K    camper_10.jpg
5.6M    camper.jpg
240K    camper_small.jpg

df

df 命令也提供了一个 -h 选项。请注意在下面的示例中是如何以千兆字节(GB)和兆字节(MB)输出的:

$ df -h | grep -v loop
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           596M  1.7M  595M   1% /run
/dev/sda1       110G  9.0G   95G   9% /
tmpfs           3.0G     0  3.0G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.0G     0  3.0G   0% /sys/fs/cgroup
tmpfs           596M   16K  596M   1% /run/user/121
/dev/sdb2       457G   73M  434G   1% /apps
tmpfs           596M     0  596M   0% /run/user/1000

下面的命令使用了 -h 选项,同时使用 -T 选项来显示我们正在查看的文件系统的类型。

$ df -hT /mnt2
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb2      ext4  457G   73M  434G   1% /apps

ls

即使是 ls,它也为我们提供了调整大小显示的选项,保证是最合理的单位。

$ ls -l camper*
-rw-rw-r-- 1 shs shs  365091 Jul 14 19:42 camper_10.jpg
-rw-rw-r-- 1 shs shs 5818597 Jul 14 19:41 camper.jpg
-rw-rw-r-- 1 shs shs  241844 Jul 14 19:45 camper_small.jpg
$ ls -lh camper*
-rw-rw-r-- 1 shs shs 357K Jul 14 19:42 camper_10.jpg
-rw-rw-r-- 1 shs shs 5.6M Jul 14 19:41 camper.jpg
-rw-rw-r-- 1 shs shs 237K Jul 14 19:45 camper_small.jpg

free

free 命令允许你以字节(B),千字节(KB),兆字节(MB)和千兆字节(GB)为单位查看内存使用情况。

$ free -b
              total        used        free      shared  buff/cache   available
Mem:     6249144320   393076736  4851625984     1654784  1004441600  5561253888
Swap:    2147479552           0  2147479552
$ free -k
              total        used        free      shared  buff/cache   available
Mem:        6102680      383836     4737924        1616      980920     5430932
Swap:       2097148           0     2097148
$ free -m
              total        used        free      shared  buff/cache   available
Mem:           5959         374        4627           1         957        5303
Swap:          2047           0        2047
$ free -g
              total        used        free      shared  buff/cache   available
Mem:              5           0           4           0           0           5
Swap:             1           0           1

tree

虽然 tree 命令与文件或内存计算无关,但它也提供了非常人性化的文件视图,它分层显示文件以说明文件是如何组织的。当你试图了解如何安排目录内容时,这种显示方式非常有用。(LCTT 译注:也可以看看 pstree,它以树状结构显示进程树。)

$ tree
.g to 
├── 123
├── appended.png 
├── appts
├── arrow.jpg
├── arrow.png
├── bin
│   ├── append
│   ├── cpuhog1
│   ├── cpuhog2
│   ├── loop
│   ├── mkhome
│   ├── runme

stat

stat 命令是另一个以非常人性化的格式显示信息的命令。它提供了更多关于文件的元数据,包括文件大小(以字节和块为单位)、文件类型、设备和 inode(索引节点)、文件所有者和组(名称和数字 ID)、以数字和 rwx 格式显示的文件权限以及文件的最后访问和修改日期。在某些情况下,它也可能显示最初创建文件的时间。

$ stat camper*
  File: camper_10.jpg
  Size: 365091          Blocks: 720        IO Block: 4096   regular file
Device: 801h/2049d      Inode: 796059      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     shs)   Gid: ( 1000/     shs)
Access: 2018-07-19 18:56:31.841013385 -0400
Modify: 2018-07-14 19:42:25.230519509 -0400
Change: 2018-07-14 19:42:25.230519509 -0400
 Birth: -
  File: camper.jpg
  Size: 5818597         Blocks: 11368      IO Block: 4096   regular file
Device: 801h/2049d      Inode: 796058      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     shs)   Gid: ( 1000/     shs)
Access: 2018-07-19 18:56:31.845013872 -0400
Modify: 2018-07-14 19:41:46.882024039 -0400
Change: 2018-07-14 19:41:46.882024039 -0400
 Birth: -

总结

Linux 命令提供了许多选项,可以让用户更容易理解或比较它们的输出。对于许多命令,-h 选项会显示更友好的输出格式。对于其它的,你可能必须通过使用某些特定选项或者按下某个键来查看你希望的输出。我希望这其中一些选项会让你的 Linux 系统看起来更友好一点。


via: https://www.networkworld.com/article/3296631/linux/displaying-data-in-a-human-friendly-way-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:MjSeven 校对:wxy

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

这个稍后阅读应用增加了功能,使其成为诸如 Pocket、Paper 和 Instapaper 之类应用的可靠替代品。

早在 2014 年,我写了篇关于 wallabag 的文章,它是诸如 Instapaper 和 Pocket 这样的稍后阅读应用的开源替代品。如果你愿意,去看看那篇文章吧。别担心,我会等你的。

好了么?很好。

自从我写这篇文章的四年来,wallabag 的很多东西都发生了变化。现在是时候悄悄看一下 wallabag 是如何成熟的。

有什么新的

最大的变化发生在幕后。Wallabag 的开发人员 Nicolas Lœuillet 和该项目的贡献者对代码进行了大量修改,从而改进了程序。每次使用时,你都会看到并感受到 wallabag 新代码库所带来的变化。

那么这些变化有哪些呢?有很多。以下是我发现最有趣和最有用的内容。

除了使 wallabag 更加快速和稳定之外,该应用的导入和导出内容的能力也得到了提高。你可以从 Pocket 和 Instapaper 导入文章,也可导入书签服务 Pinboard 中标记为 “To read” 的文章。你还可以导入 Firefox 和 Chrome 书签。

你还可以以多种格式导出文章,包括 EPUB、MOBI、PDF 和纯文本。你可以为单篇文章、所有未读文章或所有已读和未读执行此操作。我四年前使用的 wallabag 版本可以导出到 EPUB 和 PDF,但有时导出很糟糕。现在,这些导出快速而顺利。

Web 界面中的注释和高亮显示现在可以更好、更一致地工作。不可否认,我并不经常使用它们 —— 但它们不会像 wallabag v1 那样随机消失。

wallabag 的外观和感觉也有所改善。这要归功于受 Material Design 启发的新主题。这似乎不是什么大不了的事,但这个主题使得 wallabag 在视觉上更具吸引力,使文章更容易扫描和阅读。是的,孩子们,良好的用户体验可以有所不同。

其中一个最大的变化是引入了 wallabag 的托管版本。不是只有少数人(包括你在内)没有服务器来运行网络程序,并且也不太愿意维护台服务器。当遇到任何技术问题时,我很窘迫。我不介意每年花 9 欧元(我写这篇文章的时候只要 10 美元),以获得一个我不需要关注的程序的完整工作版本。

没有改变什么

总的来说,wallabag 的核心功能是相同的。如上所述,更新的代码库使这些函数运行得更顺畅,更快速。

Wallabag 的浏览器扩展以同样的方式完成同样的工作。我发现这些扩展比我第一次尝试时和程序的 v1 版本时要好一些。

有什么令人失望的

移动应用良好,但不算很棒。它在渲染文章方面做得很好,并且有一些配置选项。但是你不能高亮或注释文章。也就是说,你可以使用该程序浏览你的存档文章。

虽然 wallabag 在收藏文章方面做得很好,但有些网站的内容却无法保存。我没有碰到很多这样的网站,但已经遇到让人烦恼的情况。我不确定与 wallabag 有多大关系。相反,我怀疑它与网站的编码方式有关 —— 我在使用几个专有的稍后阅读工具时遇到了同样的问题。

Wallabag 可能不是 Pocket 或 Instapaper 的等功能的替代品,但它做得很好。自从我第一次写这篇文章以来的四年里,它已经有了明显的改善。它仍然有改进的余地,但要做好它宣传的。

最后的想法

自 2014 年以来,wallabag 在一直在演化。它一点一滴,一步一步地变得更好。虽然它可能不是 Instapaper 和 Pocket 等功能的替代品,但 wallabag 有价值的专有稍后阅读工具的开源替代品。


via: https://opensource.com/article/18/7/wallabag

作者:Scott Nesbitt 选题:lujun9972 译者:geekpi 校对:wxy

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

今天,我偶然发现了一组适用于命令行重度用户的实用 BASH 脚本,这些脚本被称为 Bash-Snippets,它们对于那些整天都与终端打交道的人来说可能会很有帮助。想要查看你居住地的天气情况?它为你做了。想知道股票价格?你可以运行显示股票当前详细信息的脚本。觉得无聊?你可以看一些 YouTube 视频。这些全部在命令行中完成,你无需安装任何严重消耗内存的 GUI 应用程序。

在撰写本文时,Bash-Snippets 提供以下 19 个实用工具:

  1. Cheat – Linux 命令备忘单。
  2. Cloudup – 一个将 GitHub 仓库备份到 bitbucket 的工具。
  3. Crypt – 加解密文件。
  4. Cryptocurrency – 前 10 大加密货币的实时汇率转换。
  5. Currency – 货币转换器。
  6. Geo – 提供 wan、lan、router、dns、mac 和 ip 的详细信息。
  7. Lyrics – 从命令行快速获取给定歌曲的歌词。
  8. Meme – 创造命令行表情包。
  9. Movies – 搜索并显示电影详情。
  10. Newton – 执行数值计算一直到符号数学解析。(to 校正:这里不理解)
  11. Qrify – 将给定的字符串转换为二维码。
  12. Short – 缩短 URL
  13. Siteciphers – 检查给定 https 站点启用或禁用的密码。
  14. Stocks – 提供某些股票的详细信息。
  15. Taste – 推荐引擎提供三个类似的项目,如提供物品(如书籍、音乐、艺术家、电影和游戏等。)
  16. Todo – 命令行待办事项管理。
  17. Transfer – 从命令行快速传输文件。
  18. Weather – 显示你所在地的天气详情。
  19. Youtube-Viewer – 从终端观看 YouTube 视频。

作者可能会在将来添加更多实用程序和/或功能,因此我建议你密切关注该项目的网站或 GitHub 页面以供将来更新。

安装

你可以在任何支持 BASH 的操作系统上安装这些脚本。

首先,克隆 git 仓库,使用以下命令:

$ git clone https://github.com/alexanderepstein/Bash-Snippets

进入目录:

$ cd Bash-Snippets/

切换到最新的稳定版本:

$ git checkout v1.22.0

最后,使用以下命令安装 Bash-Snippets:

$ sudo ./install.sh

这将询问你要安装哪些脚本。只需输入 Y 并按回车键即可安装相应的脚本。如果你不想安装某些特定脚本,输入 N 并按回车键。

Do you wish to install currency [Y/n]: y

要安装所有脚本,运行:

$ sudo ./install.sh all

要安装特定的脚本,比如 currency,运行:

$ sudo ./install.sh currency

你也可以使用 Linuxbrew 包管理器来安装它。

安装所有的工具,运行:

$ brew install bash-snippets

安装特定的工具:

$ brew install bash-snippets --without-all-tools --with-newton --with-weather

另外,对于那些基于 Debian 系统的,例如 Ubuntu、Linux Mint,可以添加 PPA 源:

$ sudo add-apt-repository ppa:navanchauhan/bash-snippets
$ sudo apt update
$ sudo apt install bash-snippets

用法

需要网络连接才能使用这些工具。用法很简单。让我们来看看如何使用其中的一些脚本,我假设你已经安装了所有脚本。

1、 Currency – 货币转换器

这个脚本根据实时汇率转换货币。输入当前货币代码和要交换的货币,以及交换的金额,如下所示:

$ currency
What is the base currency: INR
What currency to exchange to: USD
What is the amount being exchanged: 10

=========================
| INR to USD
| Rate: 0.015495
| INR: 10
| USD: .154950
=========================

你也可以在单条命令中传递所有参数,如下所示:

$ currency INR USD 10

参考以下屏幕截图:

Bash-Snippets

2、 Stocks – 显示股票价格详细信息

如果你想查看一只股票价格的详细信息,输入股票即可,如下所示:

$ stocks Intel

INTC stock info
=============================================
| Exchange Name: NASDAQ
| Latest Price: 34.2500
| Close (Previous Trading Day): 34.2500
| Price Change: 0.0000
| Price Change Percentage: 0.00%
| Last Updated: Jul 12, 4:00PM EDT
=============================================

上面输出了 Intel 股票 的详情。

3、 Weather – 显示天气详细信息

让我们查看以下天气详细信息,运行以下命令:

$ weather

示例输出:

正如你在上面屏幕截图中看到的那样,它提供了 3 天的天气预报。不使用任何参数的话,它将根据你的 IP 地址显示天气详细信息。你还可以显示特定城市或国家/地区的天气详情,如下所示:

$ weather Chennai

同样,你可以查看输入以下命令来查看月相(月亮的形态):

$ weather moon

示例输出:

4、 Crypt – 加解密文件

此脚本对 openssl 做了一层包装,允许你快速轻松地加密和解密文件。

要加密文件,使用以下命令:

$ crypt -e [original file] [encrypted file]

例如,以下命令将加密 ostechnix.txt,并将其保存在当前工作目录下,名为 encrypt_ostechnix.txt

$ crypt -e ostechnix.txt encrypt_ostechnix.txt

输入两次文件密码:

Encrypting ostechnix.txt...
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
Successfully encrypted

上面命令将使用 AES 256 位密钥加密给定文件。密码不要保存在纯文本文件中。你可以加密 .pdf、.txt、 .docx、 .doc、 .png、 .jpeg 类型的文件。

要解密文件,使用以下命令:

$ crypt -d [encrypted file] [output file]

例如:

$ crypt -d encrypt_ostechnix.txt ostechnix.txt

输入密码解密:

Decrypting encrypt_ostechnix.txt...
enter aes-256-cbc decryption password:
Successfully decrypted

5、 Movies – 查看电影详情

使用这个脚本,你可以查看电影详情。

以下命令显示了一部名为 “mother” 的电影的详情:

$ movies mother

==================================================
| Title: Mother
| Year: 2009
| Tomato: 95%
| Rated: R
| Genre: Crime, Drama, Mystery
| Director: Bong Joon Ho
| Actors: Hye-ja Kim, Bin Won, Goo Jin, Je-mun Yun
| Plot: A mother desperately searches for the killer who framed her son for a girl's horrific murder.
==================================================

6、 显示类似条目

要使用这个脚本,你需要从这里 获取 API 密钥。不过不用担心,它完全是免费的。一旦你获得 API 密钥后,将以下行添加到 ~/.bash_profileexport TASTE_API_KEY=”你的 API 密钥放在这里”。(LCTT 译注: TasteDive 是一个推荐引擎,它会根据你的品味推荐相关项目。)

现在你可以根据你提供的项目查看类似项目,如下所示:

$ taste -i Red Hot Chilli Peppers

7、 Short – 缩短 URL

这个脚本会缩短给定的 URL。

$ short <URL>

8、 Geo – 显示网络的详情

这个脚本会帮助你查找网络的详细信息,例如广域网、局域网、路由器、 dns、mac 地址和 ip 地址。

例如,要查找你的局域网 ip,运行:

$ geo -l

我系统上的输出:

192.168.43.192

查看广域网 ip:

$ geo -w

在终端中输入 geo 来查看更多详细信息。

$ geo
Geo
Description: Provides quick access for wan, lan, router, dns, mac, and ip geolocation data
Usage: geo [flag]
 -w Returns WAN IP
 -l Returns LAN IP(s)
 -r Returns Router IP
 -d Returns DNS Nameserver
 -m Returns MAC address for interface. Ex. eth0
 -g Returns Current IP Geodata
Examples:
 geo -g
 geo -wlrdgm eth0
Custom Geo Output =>
[all] [query] [city] [region] [country] [zip] [isp]
Example: geo -a 8.8.8.8 -o city,zip,isp
 -o [options] Returns Specific Geodata
 -a [address] For specific ip in -s
 -v Returns Version
 -h Returns Help Screen
 -u Updates Bash-Snippets

9、 Cheat – 显示 Linux 命令的备忘单

想参考 Linux 命令的备忘单吗?这是可能的。以下命令将显示 curl 命令的备忘单:

$ cheat curl

只需用你选择的命令替换 curl 即可显示其备忘单。这对于快速参考你要使用的任何命令非常有用。

10、 Youtube-Viewer – 观看 YouTube 视频

使用此脚本,你可以直接在终端上搜索或打开 YouTube 视频。(LCTT 译注:在媒体播放器中,而不是文本的终端中打开)

让我们来看一些有关 Ed Sheeran 的视频。

$ ytview Ed Sheeran

从列表中选择要播放的视频。所选内容将在你的默认媒体播放器中播放。

要查看艺术家的近期视频,你可以使用:

$ ytview -c [channel name]

要寻找视频,只需输入:

$ ytview -s [videoToSearch]

或者:

$ ytview [videoToSearch]

11、 cloudup – 备份 GitHub 仓库到 bitbucket

你在 GitHub 上托管过任何项目吗?如果托管过,那么你可以随时间 GitHub 仓库备份到 bitbucket,它是一种用于源代码和开发项目的基于 Web 的托管服务。

你可以使用 -a 选项一次性备份指定用户的所有 GitHub 仓库,或者备份单个仓库。

要备份 GitHub 仓库,运行:

$ cloudup

系统将要求你输入 GitHub 用户名, 要备份的仓库名称以及 bitbucket 用户名和密码等。

12、 Qrify – 将字符串转换为二维码

这个脚本将任何给定的文本字符串转换为二维码。这对于发送链接或者保存一串命令到手机非常有用。

$ qrify convert this text into qr code

示例输出:

很酷,不是吗?

13、 Cryptocurrency

它将显示十大加密货币实时汇率。

输入以下命令,然后单击回车来运行:

$ cryptocurrency

14、 Lyrics

这个脚本从命令行快速获取一首歌曲的歌词。

例如,我将获取 “who is it” 歌曲的歌词,这是一首由 迈克尔·杰克逊 Michael Jackson 演唱的流行歌曲。

$ lyrics -a michael jackson -s who is it

15、 Meme

这个脚本允许你从命令行创建简单的表情贴图。它比基于 GUI 的表情包生成器快得多。

要创建一个表情贴图,只需输入:

$ meme -f mymeme
Enter the name for the meme's background (Ex. buzz, doge, blb ): buzz
Enter the text for the first line: THIS IS A
Enter the text for the second line: MEME

这将在你当前的工作目录创建 jpg 文件。

16、 Newton

厌倦了解决复杂的数学问题?你来对了。Newton 脚本将执行数值计算,乃至于符号数学解析。

17、 Siteciphers

这个脚本可以帮助你检查在给定的 https 站点上启用/禁用哪些加密算法。(LCTT 译注:指 HTTPS 通讯中采用的加密算法)

$ siteciphers google.com

18、 Todo

它允许你直接从终端创建日常任务。

让我们来创建一些任务。

$ todo -a The first task
01). The first task Tue Jun 26 14:51:30 IST 2018

要添加其它任务,只需添加任务名称重新运行上述命令即可。

$ todo -a The second task
01). The first task Tue Jun 26 14:51:30 IST 2018
02). The second task Tue Jun 26 14:52:29 IST 2018

要查看任务列表,运行:

$ todo -g
01). The first task Tue Jun 26 14:51:30 IST 2018
02). A The second task Tue Jun 26 14:51:46 IST 2018

一旦你完成了任务,就可以将其从列表中删除,如下所示:

$ todo -r 2
Sucessfully removed task number 2
01). The first task Tue Jun 26 14:51:30 IST 2018

要清除所有任务,运行:

$ todo -c
Tasks cleared.

19、 Transfer

Transfer 脚本允许你通过互联网快速轻松地传输文件和目录。

让我们上传一个文件:

$ transfer test.txt
Uploading test.txt
################################################################################################################################################ 100.0%
Success!
Transfer Download Command: transfer -d desiredOutputDirectory ivmfj test.txt
Transfer File URL: https://transfer.sh/ivmfj/test.txt

该文件将上传到 transfer.sh 站点。Transfer.sh 允许你一次上传最大 10 GB 的文件。所有共享文件在 14 天后自动过期。如你所见,任何人都可以通过 Web 浏览器访问 URL 或使用 transfer 目录来下载文件,当然,transfer 必须安装在他/她的系统中。

现在从你的系统中移除文件。

$ rm -fr test.txt

现在,你可以随时(14 天内)从 transfer.sh 站点下载该文件,如下所示:

$ transfer -d Downloads ivmfj test.txt

获取关于此实用脚本的更多详情,参考以下指南。

获得帮助

如果你不知道如何使用特定脚本,只需输入该脚本的名称,然后按下 ENTER 键,你将会看到使用细节。以下示例显示 Qrify 脚本的帮助信息。

$ qrify
Qrify
Usage: qrify [stringtoturnintoqrcode]
Description: Converts strings or urls into a qr code.
 -u Update Bash-Snippet Tools
 -m Enable multiline support (feature not working yet)
 -h Show the help
 -v Get the tool version
Examples:
 qrify this is a test string
 qrify -m two\\nlines
 qrify github.com # notice no http:// or https:// this will fail

更新脚本

你可以随时使用 -u 选项更新已安装的工具。以下命令更新 “weather” 工具。

$ weather -u

卸载

你可以使用以下命令来卸载这些工具。

克隆仓库:

$ git clone https://github.com/alexanderepstein/Bash-Snippets

进入 Bash-Snippets 目录:

$ cd Bash-Snippets

运行以下命令来卸载脚本:

$ sudo ./uninstall.sh

输入 y,并按下回车键来移除每个脚本。

Do you wish to uninstall currency [Y/n]: y

另请阅读:

好了,这就是全部了。我必须承认,在测试这些脚本时我印象很深刻。我真的很喜欢将所有有用的脚本组合到一个包中的想法。感谢开发者。试一试,你不会失望的。

干杯!


via: https://www.ostechnix.com/collection-useful-bash-scripts-heavy-commandline-users/

作者:SK 选题:lujun9972 译者:MjSeven 校对:wxy

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

如果你在 Linux 终端工作,那么与非 Linux 用户一同工作时可能遇到困难。这些工具有助于文档兼容性和企业即时消息。

我大部分时间都在使用 Shell(命令行、终端或其它随便什么你使用的平台)上。但是,当我需要与大量其他人合作时,这可能会有点挑战,特别是在大型企业公司中 —— 除了 shell 外其他都使用。

当公司内的其他人使用与你不同的平台时,问题就会变得更加严重。我倾向于使用 Linux。如果我在 Linux 终端上做了很多日常工作,而我的大多数同事都使用 Windows 10(完全使用 GUI 端),那么事情就会变得……有问题。

幸运的是,在过去的几年里,我已经想出如何处理这些问题。我已经找到了在非 Unix 的企业环境中使用 Linux(或其他类 Unix 系统)Shell 的方法。这些工具/技巧同样适用于在公司服务器上工作的系统管理员们,就像对开发人员或营销人员一样。

让我们首先关注对于大公司中的许多人来说似乎最难解决的两个方面:文档兼容性和企业即时消息。

Linux 和非 Linux 系统之间的文档兼容性

出现的最大问题之一是简单的文字处理文档的兼容性。

假设你的公司已在 Microsoft Office 上进行了标准化。这让你难过。但不要失去希望!有很多方法可以使它(基本)可用 —— 甚至在 shell 中。

两个工具在我的武器库中至关重要:PandocWordgrinder

Wordgrinder 是一个简单、直观的文字处理器。它可能不像 LibreOffice 那样功能齐全(或者,实际上,任何主要的 GUI 文字处理应用程序),但速度很快。它很稳定。它有足够的功能(和文件格式)来完成工作。事实上,我完全在 Wordgrinder 中写了我的大部分文章和书籍。

但是有一个问题(你知道肯定会有)。

Wordgrinder 不支持 .doc(或 .docx)文件。这意味着它无法读取使用 Windows 和 MS Office 的同事发送给你的大多数文件。

这就是 Pandoc 的用武之地。它是一个简单的文档转换器,可以将各种文件作为输入(MS Word、LibreOffice、HTML、markdown 等)并将它们转换为其他内容。它支持的格式数量绝对是惊人的 —— PDF、ePub、各种幻灯片格式。它确实使格式之间的文档转换变得轻而易举。

这并不是说我不会偶尔遇到格式或功能问题。要转换有大量自定义格式、某些脚本和嵌入式图表的 Word 文档?是的,在这个过程中会丢失很多。

但实际上,Pandoc(用于转换文件)和 Wordgrinder(用于文档编辑)的组合已经证明非常有用和强大。

Linux 和非 Linux 系统之间的企业即时消息传递

每家公司都喜欢在即时通讯系统上实现标准化 —— 所有员工都可以使用它来保持实时联系。

在命令行中,这可能会变得棘手。如果贵公司使用 Google 环聊怎么办?或者 Novell GroupWise Messenger 怎么样?既没有官方支持,也没有基于终端的客户端。

谢天谢地,还有 Finch 和 Hangups

Finch 是 Pidgin(开源,多协议消息客户端)的终端版本。它支持各种协议,包括 Novell GroupWise、(很快会死的)AOL Instant Messenger 以及其他一些协议。

而 Hangups 是 Google Hangouts 客户端的开源实现 —— 包含消息历史记录和精美的标签界面。

这些方案都不会为你提供语音或视频聊天功能,但对于基于文本的消息,它们的工作得非常好。它们并不完美(Finch 的用户界面需要时间习惯),但它们肯定足以与你的同事保持联系。

这些方案能否让你在纯文本 shell 中舒适地过完一个工作日?可能不会。就个人而言,我发现(使用这些工具和其他工具)我可以轻松地将 80% 的时间花在纯文本界面上。

这感觉很棒。


via: https://www.networkworld.com/article/3235688/linux/linux-command-line-tools-for-working-with-non-linux-users.html

作者:Bryan Lunduke 译者:geekpi 校对:wxy

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

通过这篇教程提升你的 top 命令的知识。

尝试找出你的机器正在运行什么程序,以及哪个进程耗尽了内存导致系统非常非常慢 —— 这是 top 命令所能胜任的工作。

top 是一个非常有用的程序,其作用类似于 Windows 任务管理器或 MacOS 的活动监视器。在 *nix 机器上运行 top 将实时显示系统上运行的进程的情况。

$ top

取决于你运行的 top 版本,你会看到类似如下内容:

top - 08:31:32 up 1 day,  4:09,  0 users,  load average: 0.20, 0.12, 0.10
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.3 sy,  0.0 ni, 99.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   4042284 total,  2523744 used,  1518540 free,   263776 buffers
KiB Swap:  1048572 total,        0 used,  1048572 free.  1804264 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   21964   3632   3124 S   0.0  0.1   0:00.23 bash
  193 root      20   0  123520  29636   8640 S   0.0  0.7   0:00.58 flask
  195 root      20   0   23608   2724   2400 R   0.0  0.1   0:00.21 top

你所用的 top 版本可能跟这个看起来不一样,特别是在显示的列上。

如何阅读输出的内容

你可以根据输出判断你正在运行的内容,但尝试去解释结果你可能会有些困惑。

前几行包含一堆统计信息(详细信息),后跟一个包含结果列的表(列)。让我们从后者开始吧。

这些是系统正在运行的进程。默认按 CPU 使用率降序排序。这意味着在列表顶部的程序正使用更多的 CPU 资源并对你的系统造成更重的负担。对于资源使用而言,这些程序是字面上的消耗资源最多的(top)进程。不得不说,top 这个名字起得很妙。

最右边的 COMMAND 一列报告进程名(启动它们的命令)。在这个例子里,进程名是 bash(一个我们正在运行 top 的命令解释器)、flask(一个 Python 写的 web 框架)和 top 自身。

其它列提供了关于进程的有用信息:

  • PID:进程 ID,一个用来定位进程的唯一标识符
  • USER:运行进程的用户
  • PR:任务的优先级
  • NI:Nice 值,优先级的一个更好的表现形式
  • VIRT:虚拟内存的大小,单位是 KiB(kibibytes)
  • RES:常驻内存大小,单位是 KiB(物理内存和虚拟内存的一部分)
  • SHR:共享内存大小,单位是 KiB(共享内存和虚拟内存的一部分)
  • S:进程状态,一般 I 代表空闲,R 代表运行,S 代表休眠,Z 代表僵尸进程,Tt 代表停止(还有其它更少见的选项)
  • %CPU:自从上次屏幕更新后的 CPU 使用率
  • %MEM:自从上次屏幕更新后的 RES 常驻内存使用率
  • TIME+:自从程序启动后总的 CPU 使用时间
  • COMMAND:启动命令,如之前描述那样

确切知道 VIRTRESSHR 值代表什么在日常操作中并不重要。重要的是要知道 VIRT 值最高的进程就是内存使用最多的进程。当你在用 top 排查为什么你的电脑运行无比卡的时候,那个 VIRT 数值最大的进程就是元凶。如果你想要知道共享内存和物理内存的确切意思,请查阅 top 手册的 Linux Memory Types 段落。

是的,我说的是 kibibytes 而不是 kilobytes。通常称为 kilobyte 的 1024 值实际上是 kibibyte。希腊语的 kilo(χίλιοι)意思是一千(例如一千米是 1000 米,一千克是 1000 克)。Kibi 是 kilo 和 binary 的合成词,意思是 1024 字节(或者 2 10 )。但是,因为这个词很难说,所以很多人在说 1024 字节的时候会说 kilobyte。top 试图在这里使用恰当的术语,所以按它说的理解就好。

屏幕更新说明

实时屏幕更新是 Linux 程序可以做的 非常酷 的事之一。这意味着程序能实时更新它们显示的内容,所以看起来是动态的,即使它们用的是文本。非常酷!在我们的例子中,更新时间间隔很重要,因为一些统计数据(%CPU%MEM)是基于上次屏幕更新的数值的。

因为我们运行在一个持久性的程序中,我们就可以输入一些命令来实时修改配置(而不是停止应用,然后用一个不同的命令行选项再次运行)。

按下 h 调用帮助界面,该界面也显示了默认延迟(屏幕更新的时间间隔)。这个值默认(大约)是 3 秒,但你可以输入 d(大概是 delay 的意思)或者 s(可能是 screen 或 seconds 的意思)来修改它。

细节

在进程列表上面有一大堆有用的信息。有些细节看起来有点儿奇怪,让人困惑。但是一旦你花点儿时间来逐个过一遍,你会发现,在紧要关头,这些是非常有用的。

第一行包含系统的大致信息:

  • top:我们正在运行 top!你好!top
  • XX:YY:XX:当前时间,每次屏幕更新的时候更新
  • up(接下去是 X day, YY:ZZ):系统的 uptime,或者自从系统启动后已经过去了多长时间
  • load average(后跟三个数字):分别是过去一分钟、五分钟、15 分钟的系统负载)

第二行(Task)显示了正在运行的任务的信息,不用解释。它显示了进程总数和正在运行的、休眠中的、停止的进程数和僵尸进程数。这实际上是上述 S(状态)列的总和。

第三行(%Cpu(s))显示了按类型划分的 CPU 使用情况。数据是屏幕刷新之间的值。这些值是:

  • us:用户进程
  • sy:系统进程
  • ninice#Etymology) 用户进程
  • id:CPU 的空闲时间,这个值比较高时说明系统比较空闲
  • wa:等待时间,或者消耗在等待 I/O 完成的时间
  • hi:消耗在硬件中断的时间
  • si:消耗在软件中断的时间
  • st:“虚拟机管理程序从该虚拟机窃取的时间”

你可以通过点击 t(toggle)来展开或折叠 Task%Cpu(s) 行。

第四行(Kib Mem)和第五行(KiB Swap)提供了内存和交换空间的信息。这些数值是:

  • 总内存容量
  • 已用内存
  • 空闲内存
  • 内存的缓冲值
  • 交换空间的缓存值

默认它们是用 KiB 为单位展示的,但是按下 E(扩展内存缩放 extend memory scaling)可以轮换不同的单位:KiB、MiB、GiB、TiB、PiB、EiB(kilobytes、megabytes、gigabytes、terabytes、petabytes 和 exabytes)

top 用户手册有更多选项和配置项信息。你可以运行 man top 来查看你系统上的文档。还有很多 HTML 版的 man 手册,但是请留意,这些手册可能是针对不同 top 版本的。

两个 top 的替代品

你不必总是用 top 查看系统状态。你可以根据你的情况用其它工具来协助排查问题,尤其是当你想要更图形化或更专业的界面的时候。

htop

htop 很像 top,但是它带来了一些非常有用的东西:它可以以图形界面展示 CPU 和内存使用情况。

这是我们在刚才运行 top 的同一环境中 htop 的样子。显示更简洁,但功能却很丰富。

任务统计、负载、uptime 和进程列表仍然在,但是它有了漂亮、彩色、动态的每核 CPU 使用情况,还有图形化的内存使用情况。

以下是不同颜色的含义(你也可以通过按下 h 来获得这些信息的帮助)。

CPU 任务优先级或类型:

  • 蓝色:低优先级
  • 绿色:正常优先级
  • 红色:内核任务
  • 蓝色:虚拟任务
  • 条状图末尾的值是已用 CPU 的百分比

内存:

  • 绿色:已经使用的内存
  • 蓝色:缓冲的内存
  • 黄色:缓存内存
  • 条状图末尾的值显示已用内存和总内存

如果颜色对你没用,你可以运行 htop -C 来禁用它们;那样 htop 将使用不同的符号来展示 CPU 和内存类型。

它的底部有一组激活的快捷键提示,可以用来操作过滤结果或改变排序顺序。试着按一些快捷键看看它们能做什么。不过尝试 F9 时要小心,它会调出一个信号列表,这些信号会杀死(即停止)一个过程。我建议在生产环境之外探索这些选项。

htop 的作者 Hisham Muhammad(是的,htop 的名字就是源自 Hisham 的)在二月份的 FOSDEM 2018 做了一个简短的演讲。他阐述了 htop 不仅有简洁的图形界面,还有更现代的进程信息统计展示方式,这都是之前的工具(如 top)所不具备的。

你可以在手册页面htop 网站阅读更多关于 htop 的信息。(提示:网站背景是一个动态的 htop。)

docker stats

如果你在用 Docker,你可以运行 docker stats 来为容器状态生成一个有丰富上下文的界面。

这可能比 top 更有帮助,因为它不是按进程分类,而是按容器分类的。这点特别有用,当某个容器运行缓慢时,查看哪个容器耗资源最多比运行 top 再找到容器的进程要快。

借助于上面对 tophtop 术语的解释,你应该会更容易理解 docker stats 中的那些。然而,docker stats 文档对每一列都提供了详尽的描述。


via: https://opensource.com/article/18/8/top-tips-speed-up-computer

作者:Katie McLaughlin 选题:lujun9972 译者:ypingcn 校对:pityonline

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

Python 是为谁设计的?

几年前,我在 python-dev 邮件列表中,以及在活跃的 CPython 核心开发人员和认为参与这一过程不是有效利用个人时间和精力的人中强调说,“CPython 的发展太快了也太慢了” 是很多冲突的原因之一。

我一直认为事实确实如此,但这也是一个要点,在这几年中我也花费了很多时间去反思它。在我写那篇文章的时候,我还在波音防务澳大利亚公司(Boeing Defence Australia)工作。下个月,我离开了波音进入红帽亚太(Red Hat Asia-Pacific),并且开始在大企业的开源供应链管理方面取得了 再分发者 redistributor 层面的视角。

Python 的参考解析器使用情况

我尝试将 CPython 的使用情况分解如下,尽管看起来有些过于简化(注意,这些分类的界线并不是很清晰,他们仅关注于考虑新软件特性和版本发布后不同因素的影响):

  • 教育类:教育工作者的主要兴趣在于建模方法的教学和计算操作方面,不会去编写或维护生产级别的软件。例如:

  • 个人类的自动化和爱好者的项目:主要且经常是一类自写自用的软件。例如:

  • 组织 organisational 过程自动化:主要且经常是为组织利益而编写的。例如:

  • 一劳永逸 Set-and-forget ” 的基础设施:这类软件在其生命周期中几乎不会升级,但在底层平台可能会升级(这种说法有时候有些争议)。例如:

    • 大多数自我管理的企业或机构的基础设施(在那些资金充足的可持续工程计划中,这种情况是让人非常不安的)
    • 拨款资助的软件(当最初的拨款耗尽时,维护通常会终止)
    • 有严格认证要求的软件(如果没有绝对必要的话,从经济性考虑,重新认证比常规升级来说要昂贵很多)
    • 没有自动升级功能的嵌入式软件系统
  • 持续升级的基础设施:具有健壮支撑的工程学模型的软件,对于依赖和平台升级通常是例行的,不必关心源码变更。例如:

    • Facebook 的 Python 服务基础设施
    • 滚动发布的 Linux 分发版
    • 大多数的公共 PaaS 无服务器环境(Heroku、OpenShift、AWS Lambda、Google Cloud Functions、Azure Cloud Functions 等等)
  • 长周期性升级的标准的操作环境:对其核心组件进行常规升级,但这些升级以年为单位进行,而不是周或月。例如:

    • VFX 平台
    • 长期支持(LTS)的 Linux 分发版
    • CPython 和 Python 标准库
    • 基础设施管理和编排工具(如 OpenStack、Ansible)
    • 硬件控制系统
  • 短生命周期的软件:软件仅被使用一次,然后就丢弃或忽略,而不是随后接着升级。例如:

    • 临时 Ad hoc 自动化脚本
    • 被确定为 “终止” 的单用户游戏(你玩了一次后,甚至都忘了去卸载它们,或许在一个新的设备上都不打算再去安装了)
    • 不具备(或不完整)状态保存的单用户游戏(如果你卸载并重安装它们,游戏体验也不会有什么大的变化)
    • 特定事件的应用程序(这些应用程序与特定的事件捆绑,一旦事件结束,这些应用程序就不再有用了)
  • 常规用途的应用程序:部署后定期升级的软件。例如:

    • 业务管理软件
    • 个人和专业的生产力应用程序(如 Blender)
    • 开发工具和服务(如 Mercurial、Buildbot、Roundup)
    • 多用户游戏,和其它明显处于持续状态还没有被定义为 “终止” 的游戏
    • 有自动升级功能的嵌入式软件系统
  • 共享的抽象层:在一个特定的问题领域中,设计用于让工作更高效的软件组件。即便是你没有亲自掌握该领域的所有错综复杂的东西。例如:

    • 大多数的 运行时 runtime 库和框架都归入这一类(如 Django、Flask、Pyramid、SQL Alchemy、NumPy、SciPy、requests)
    • 适合归入这一类的许多测试和类型推断工具(如 pytest、Hypothesis、vcrpy、behave、mypy)
    • 其它应用程序的插件(如 Blender plugins、OpenStack hardware adapters)
    • 本身就代表了 “Python 世界” 基准的标准库(那是一个难以置信的复杂的世界观)

CPython 主要服务于哪些受众?

从根本上说,CPython 和标准库的主要受众是哪些呢?是那些不管出于什么原因,将有限的标准库和从 PyPI 显式声明安装的第三方库组合起来所提供的服务还不能够满足需求的那些人。

为了更进一步简化上面回顾的不同用法和部署模型,宏观地将最大的 Python 用户群体分开来看,一类是在一些感兴趣的环境中将 Python 作为一种 脚本语言 使用的人;另外一种是将它用作一个 应用程序开发语言 的人,他们最终发布的是一种产品而不是他们的脚本。

把 Python 作为一种脚本语言来使用的开发者的典型特性包括:

  • 主要的工作单元是由一个 Python 文件组成的(或 Jupyter notebook),而不是一个 Python 和元数据文件的目录
  • 没有任何形式的单独的构建步骤 —— 是作为一个脚本分发的,类似于分发一个独立的 shell 脚本的方式
  • 没有单独的安装步骤(除了下载这个文件到一个合适的位置),因为在目标系统上要求预配置运行时环境
  • 没有显式的规定依赖关系,除了最低的 Python 版本,或一个预期的运行环境声明。如果需要一个标准库以外的依赖项,他们会通过一个环境脚本去提供(无论是操作系统、数据分析平台、还是嵌入 Python 运行时的应用程序)
  • 没有单独的测试套件,使用 “通过你给定的输入,这个脚本是否给出了你期望的结果?” 这种方式来进行测试
  • 如果在执行前需要测试,它将以 试运行 dry run> 预览 preview 模式来向用户展示软件怎样运行
  • 如果使用静态代码分析工具,则通过集成到用户的软件开发环境中,而不是为每个脚本单独设置

相比之下,使用 Python 作为一个应用程序开发语言的开发者特征包括:

  • 主要的工作单元是由 Python 和元数据文件组成的目录,而不是单个 Python 文件
  • 在发布之前有一个单独的构建步骤去预处理应用程序,哪怕是把它的这些文件一起打包进一个 Python sdist、wheel 或 zipapp 中
  • 应用程序是否有独立的安装步骤做预处理,取决于它是如何打包的,和支持的目标环境
  • 外部的依赖明确存在于项目目录下的一个元数据文件中,要么是直接在项目目录中(如 pyproject.tomlrequirements.txtPipfile),要么是作为生成的发行包的一部分(如 setup.pyflit.ini
  • 有独立的测试套件,或者作为一个 Python API 的一个单元测试,或者作为功能接口的集成测试,或者是两者都有
  • 静态分析工具的使用是在项目级配置的,并作为测试管理的一部分,而不是作为依赖

作为以上分类的一个结果,CPython 和标准库的主要用途是,在相应的 CPython 特性发布后,为教育和 临时 ad hoc 的 Python 脚本环境提供 3-5 年基础维护服务。

对于临时脚本使用的情况,这个 3-5 年的延迟是由于再分发者给用户开发新版本的延迟造成的,以及那些再分发版本的用户们花在修改他们的标准操作环境上的时间。

对于教育环境中的情况是,教育工作者需要一些时间去评估新特性,然后决定是否将它们包含进教学的课程中。

这些相关问题的原因是什么?

这篇文章很大程度上是受 Twitter 上对我的这个评论的讨论的启发,它援引了定义在 PEP 411 临时 Provisional API 的情形,作为一个开源项目的例子,对用户发出事实上的邀请,请其作为共同开发者去积极参与设计和开发过程,而不是仅被动使用已准备好的最终设计。

这些回复包括一些在更高级别的库中支持临时 API 的困难程度的一些沮丧性表述,没有这些库做临时状态的传递,因此而被限制为只有临时 API 的最新版本才支持这些相关特性,而不是任何早期版本的迭代。

我的主要回应是,建议开源提供者应该强制实施有限支持,通过这种强制的有限支持可以让个人的维护努力变得可持续。这意味着,如果对临时 API 的老版本提供迭代支持是非常痛苦的,那么,只有在项目开发人员自己需要、或有人为此支付费用时,他们才会去提供支持。这与我的这个观点是类似的,那就是,志愿者提供的项目是否应该免费支持老的、商业性质的、长周期的 Python 版本,这对他们来说是非常麻烦的事,我不认为他们应该这样做,正如我所期望的那样,大多数这样的需求都来自于管理差劲的惯性,而不是真正的需求(真正的需求,应该去支付费用来解决问题)。

而我的第二个回应是去实现这一点,尽管多年来一直在讨论这个问题(比如,在上面链接中最早在 2011 年的一篇的文章中,以及在 Python 3 问答的回复中的这里这里、和这里,以及去年的这篇文章 Python 包生态系统中也提到了一些),但我从来没有真实地尝试直接去解释它在标准库设计过程中的影响。

如果没有这些背景,设计过程中的一部分,比如临时 API 的引入,或者是 受启发而不同于它 inspired-by-not-the-same-as 的引入,看起来似乎是完全没有意义的,因为他们看起来似乎是在尝试对 API 进行标准化,而实际上并没有。

适合进入 PyPI 规划的方面有哪些?

任何提交给 python-ideas 或 python-dev 的提案所面临的第一个门槛就是清楚地回答这个问题:“为什么 PyPI 上的模块不够好?”。绝大多数的提案都在这一步失败了,为了通过这一步,这里有几个常见的话题:

  • 比起下载一个合适的第三方库,新手一般可能更倾向于从互联网上 “复制粘贴” 错误的指导。(这就是为什么存在 secrets 库的原因:它使得人们很少去使用 random 模块,由于安全敏感的原因,它预期用于游戏和模拟统计)
  • 该模块旨在提供一个参考实现,并允许与其它的竞争实现之间提供互操作性,而不是对所有人的所有事物都是必要的。(如 asynciowsgirefunittest、和 logging 都是这种情况)
  • 该模块是预期用于标准库的其它部分(如 enum 就是这种情况,像 unittest 一样)
  • 该模块是被设计用于支持语言之外的一些语法(如 contextlibasynciotyping
  • 该模块只是普通的临时的脚本用途(如 pathlibipaddress
  • 该模块被用于一个教育环境(例如,statistics 模块允许进行交互式地探索统计的概念,尽管你可能根本就不会用它来做完整的统计分析)

只通过了前面的 “PyPI 是不是明显不够好” 的检查,一个模块还不足以确保被纳入标准库中,但它已经足以将问题转变为 “在未来几年中,你所推荐的要包含的库能否对一般的入门级 Python 开发人员的经验有所提升?”

标准库中的 ensurepipvenv 模块的引入也明确地告诉再分发者,我们期望的 Python 级别的打包和安装工具在任何平台的特定分发机制中都予以支持。

当添加它们到标准库中时,为什么一些 API 会被修改?

现有的第三方模块有时候会被批量地采用到标准库中,在其它情况下,实际上添加的是吸收了用户对现有 API 体验之后进行重新设计和重新实现的 API,但是会根据另外的设计考虑和已经成为其中一部分的语言实现参考来进行一些删除或细节修改。

例如,与流行的第三方库 path.pypathlib 的前身不同,它们并没有定义字符串子类,而是以独立的类型替代。作为解决文件互操作性问题的结果,定义了文件系统路径协议,它允许使用文件系统路径的接口去使用更多的对象。

为了在 “IP 地址” 这个概念的教学上提供一个更好的工具,ipaddress 模块设计调整为明确地将主机接口定义与地址和网络的定义区分开(IP 地址被关联到特定的 IP 网络),而最原始的 ipaddr 模块中,在网络术语的使用方式上不那么严格。

另外的情况是,标准库将综合多种现有的方法的来构建,以及为早已存在的库定义 API 时,还有可能依赖不存在的语法特性。比如,asynciotyping 模块就全部考虑了这些因素,虽然在 PEP 557 中正在考虑将后者所考虑的因素应用到 dataclasses API 上。(它可以被总结为 “像属性一样,但是使用可变注释作为字段声明”)。

这类修改的原理是,这类库不会消失,并且它们的维护者对标准库维护相关的那些限制通常并不感兴趣(特别是相对缓慢的发布节奏)。在这种情况下,在标准库文档的更新版本中使用 “See Also” 链接指向原始模块的做法非常常见,尤其是在第三方版本额外提供了标准库模块中忽略的那些特性时。

为什么一些 API 是以临时的形式被添加的?

虽然 CPython 维护了 API 的弃用策略,但在没有正当理由的情况下,我们通常不会去使用该策略(在其他项目试图与 Python 2.7 保持兼容性时,尤其如此)。

然而在实践中,当添加这种受已有的第三方启发而不是直接精确拷贝第三方设计的新 API 时,所承担的风险要高于一些正常设计决定可能出现问题的风险。

当我们考虑到这种改变的风险比平常要高,我们将相关的 API 标记为临时,表示保守的终端用户要避免完全依赖它们,而共享抽象层的开发者可能希望对他们准备去支持的那个临时 API 的版本考虑实施比平时更严格的限制。

为什么只有一些标准库 API 被升级?

这里简短的回答得到升级的主要 API 有哪些:

  • 不太可能有大量的外部因素干扰的附加更新的
  • 无论是对临时脚本用例还是对促进将来多个第三方解决方案之间的互操作性,都有明显好处的
  • 对这方面感兴趣的人提交了一个可接受的建议的

如果在将模块用于应用程序开发目的时(如 datetime),现有模块的限制主要是显而易见的,如果再分发者通过第三方方案很容易地实现了改进,(如 requests),或者如果标准库的发布节奏与所需要的包之间真的存在冲突,(如 certifi),那么,建议对标准库版本进行改变的因素将显著减少。

从本质上说,这和上面关于 PyPI 问题正好相反:因为从应用程序开发人员体验的角度来说,PyPI 的分发机制通常已经够好了,这种分发方式的改进是有意义的,允许再分发者和平台提供者自行决定将哪些内容作为他们缺省提供的一部分。

假设在 3-5 年时间内,缺省出现了被认为是改变带来的可感知的价值时,才会将这些改变纳入到 CPython 和标准库中。

标准库任何部分都有独立的版本吗?

是的,就像是 ensurepip 使用的捆绑模式(CPython 发行了一个 pip 的最新捆绑版本,而并没有把它放进标准库中),将来可能被应用到其它模块中。

最有可能的第一个候选者是 distutils 构建系统,因为切换到这种模式将允许构建系统在多个发行版本之间保持一致。

这种处理方式的其它可能候选者是 Tcl/Tk 图形套件和 IDLE 编辑器,它们已经被拆分,并且一些开发者将其改为可选安装项。

这些注意事项为什么很重要?

从本质上说,那些积极参与开源开发的人就是那些致力于开源应用程序和共享抽象层的人。

那些写一些临时脚本或为学生设计一些教学习题的人,通常不认为他们是软件开发人员 —— 他们是教师、系统管理员、数据分析人员、金融工程师、流行病学家、物理学家、生物学家、市场研究员、动画师、平面设计师等等。

对于一种语言,当我们全部的担心都是开发人员的经验时,那么我们就可以根据人们所知道的内容、他们使用的工具种类、他们所遵循的开发流程种类、构建和部署他们软件的方法等假定,来做大量的简化。

当应用程序运行时作为脚本引擎广泛流行时,事情会变得更加复杂。做好任何一项工作已经很困难,并且作为单个项目的一部分来平衡两个受众的需求会导致双方经常不理解和不相信。

这篇文章不是为了说明我们在开发 CPython 过程中从来没有做出过不正确的决定 —— 它只是去合理地回应那些对添加到 Python 标准库中的看上去很荒谬的特性的质疑,它将是 “我不是那个特性的预期目标受众的一部分”,而不是 “我对它没有兴趣,因此它对所有人都是毫无用处和没有价值的,添加它纯属骚扰我”。


via: http://www.curiousefficiency.org/posts/2017/10/considering-pythons-target-audience.html

作者:Nick Coghlan 译者:qhwdw 校对:wxypityonline

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