Seth Kenlon 发布的文章

从 Bash 进阶到 Z-shell,改进你的 shell 体验。

Z-shell(Zsh)是一种 Bourne 式的交互式 POSIX shell,以其丰富的创新功能而著称。Z-Shell 用户经常会提及它的许多便利之处,赞誉它对效率的提高和丰富的自定义支持。

如果你刚接触 Linux 或 Unix,但你的经验足以让你可以打开终端并运行一些命令的话,那么你可能使用的就是 Bash shell。Bash 可能是最具有代表意义的自由软件 shell,部分是因为它具有的先进的功能,部分是因为它是大多数流行的 Linux 和 Unix 操作系统上的默认 shell。但是,随着使用的次数越多,你可能会开始发现一些细节可能能够做的更好。开源有一个众所周知的地方,那就是选择。所以,许多人选择从 Bash “毕业”到 Z。

Zsh 介绍

Shell 只是操作系统的接口。交互式 shell 程序允许你通过称为标准输入(stdin)的某个东西键入命令,并通过标准输出(stdout)和标准错误(stderr)获取输出。有很多种 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每个都有其开发者所认为最适合于 Shell 的功能。而这些功能的好坏,则取决于最终用户。

Zsh 具有交互式制表符补全、自动文件搜索、支持正则表达式、用于定义命令范围的高级速记符,以及丰富的主题引擎等功能。这些功能也包含在你所熟悉的其它 Bourne 式 shell 环境中,这意味着,如果你已经了解并喜欢 Bash,那么你也会熟悉 Zsh,除此以外,它还有更多的功能。你可能会认为它是一种 Bash++。

安装 Zsh

用你的包管理器安装 Zsh。

在 Fedora、RHEL 和 CentOS 上:

$ sudo dnf install zsh

在 Ubuntu 和 Debian 上:

$ sudo apt install zsh

在 MacOS 上你可以使用 MacPorts 安装它:

$ sudo port install zsh

或使用 Homebrew:

$ brew install zsh

在 Windows 上也可以运行 Zsh,但是只能在 Linux 层或类似 Linux 的层之上运行,例如 Windows 的 Linux 子系统(WSL)或 Cygwin。这类安装超出了本文的范围,因此请参考微软的文档。

设置 Zsh

Zsh 不是终端模拟器。它是在终端仿真器中运行的 shell。因此,要启动 Zsh,必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或你喜欢的其它终端。然后,你可以通过键入以下命令启动 Zsh:

$ zsh

首次启动 Zsh 时,会要求你选择一些配置选项。这些都可以在以后更改,因此请按 1 继续。

This is the Z Shell configuration function for new users, zsh-newuser-install.

(q)  Quit and do nothing.

(0)  Exit, creating the file ~/.zshrc

(1)  Continue to the main menu.

偏好设置分为四类,因此请从顶部开始。

  1. 第一个类使你可以选择在 shell 历史记录文件中保留多少个命令。默认情况下,它设置为 1,000 行。
  2. Zsh 补全是其最令人兴奋的功能之一。为了简单起见,请考虑使用其默认选项激活它,直到你习惯了它的工作方式。按 1 使用默认选项,按 2 手动设置选项。
  3. 选择 Emacs 式键绑定或 Vi 式键绑定。Bash 使用 Emacs 式绑定,因此你可能已经习惯了。
  4. 最后,你可以了解(以及设置或取消设置)Zsh 的一些精妙的功能。例如,当你提供不带命令的非可执行路径时,可以通过让 Zsh 来改变目录而无需你使用 cd 命令。要激活这些额外选项之一,请输入选项号并输入 s 进行设置。请尝试打开所有选项以获得完整的 Zsh 体验。你可以稍后通过编辑 ~/.zshrc 取消设置它们。

要完成配置,请按 0

使用 Zsh

刚开始,Zsh 的使用感受就像使用 Bash 一样,这无疑是其众多功能之一。例如,Bash 和 Tcsh 之间就存在严重的差异,因此如果你必须在工作中或在服务器上使用 Bash,而 Zsh 就可以在家里轻松尝试和使用,这样在 Bash 和 Zsh 之间轻松切换就是一种便利。

在 Zsh 中改变目录

正是这些微小的差异使 Zsh 变得好用。首先,尝试在没有 cd 命令的情况下,将目录更改为 Documents 文件夹。简直太棒了,难以置信。如果你输入的是目录路径而没有进一步的指令,Zsh 会更改为该目录:

% Documents
% pwd
/home/seth/Documents

而这会在 Bash 或任何其他普通 shell 中导致错误。但是 Zsh 却根本不是普通的 shell,而这仅仅才是开始。

在 Zsh 中搜索

当你想使用普通 shell 程序查找文件时,可以使用 findlocate 命令。最起码,你可以使用 ls -R 来递归地列出一组目录。Zsh 内置有允许它在当前目录或任何其他子目录中查找文件的功能。

例如,假设你有两个名为 foo.txt 的文件。一个位于你的当前目录中,另一个位于名为 foo 的子目录中。在 Bash Shell 中,你可以使用以下命令列出当前目录中的文件:

$ ls
foo.txt

你可以通过明确指明子目录的路径来列出另一个目录:

$ ls foo
foo.txt

要同时列出这两者,你必须使用 -R 开关,并结合使用 grep

$ ls -R | grep foo.txt
foo.txt
foo.txt

但是在 Zsh 中,你可以使用 ** 速记符号:

% ls **/foo.txt
foo.txt
foo.txt

你可以在任何命令中使用此语法,而不仅限于 ls。想象一下在这样的场景中提高的效率:将特定文件类型从一组目录中移动到单个位置、将文本片段串联到一个文件中,或对日志进行抽取。

使用 Zsh 的制表符补全

制表符补全是 Bash 和其他一些 Shell 中的高级用户功能,它变得司空见惯,席卷了 Unix 世界。Unix 用户不再需要在输入冗长而乏味的路径时使用通配符(例如输入 /h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v,比输入 /home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv 要容易得多)。相反,他们只要输入足够的唯一字符串即可按 Tab 键。例如,如果你知道在系统的根目录下只有一个以 h 开头的目录,则可以键入 /h,然后单击 Tab。快速、简单、高效。它还会确认路径存在;如果 Tab 无法完成任何操作,则说明你在错误的位置或输入了错误的路径部分。

但是,如果你有许多目录有五个或更多相同的首字母,Tab 会坚决拒绝进行补全。尽管在大多数现代终端中,它将(至少会)显示阻止其进行猜测你的意思的文件,但通常需要按两次 Tab 键才能显示它们。因此,制表符补全通常会变成来回按下键盘上字母和制表符,以至于你好像在接受钢琴独奏会的训练。

Zsh 通过循环可能的补全来解决这个小问题。如果键入 ls ~/D 并按 Tab,则 Zsh 首先使用 Documents 来完成命令;如果再次按 Tab,它将提供 Downloads,依此类推,直到找到所需的选项。

Zsh 中的通配符

在 Zsh 中,通配符的行为不同于 Bash 中用户所习惯的行为。首先,可以对其进行修改。例如,如果要列出当前目录中的所有文件夹,则可以使用修改后的通配符:

% ls
dir0   dir1   dir2   file0   file1
% ls *(/)
dir0   dir1   dir2

在此示例中,(/) 限定了通配符的结果,因此 Zsh 仅显示目录。要仅列出文件,请使用 (.)。要列出符号链接,请使用 (@)。要列出可执行文件,请使用 (*)

% ls ~/bin/*(*)
fop  exify  tt

Zsh 不仅仅知道文件类型。它也可以使用相同的通配符修饰符约定根据修改时间列出。例如,如果要查找在过去八个小时内修改的文件,请使用 mh 修饰符(即 “modified hours” 的缩写)和小时的负整数:

% ls ~/Documents/*(mh-8)
cal.org   game.org   home.org

要查找超过(例如)两天前修改过的文件,修饰符更改为 md(即 “modified day” 的缩写),并带上天数的正整数:

% ls ~/Documents/*(+2)
holiday.org

通配符修饰符和限定符还可以做很多事情,因此,请阅读 Zsh 手册页,以获取全部详细信息。

通配符的副作用

要像在 Bash 中使用通配符一样使用它,有时必须在 Zsh 中对通配符进行转义。例如,如果要在 Bash 中将某些文件复制到服务器上,则可以使用如下通配符:

$ scp IMG_*.JPG [email protected]:~/www/ph*/*19/09/14

这在 Bash 中有效,但是在 Zsh 中会返回错误,因为它在发出 scp 命令之前尝试在远程端扩展该变量(通配符)。为避免这种情况,必须转义远程变量(通配符):

% scp IMG_*.JPG [email protected]:~/www/ph\*/\*19/09/14

当你切换到新的 shell 时,这些小异常可能会使你感到沮丧。使用 Zsh 时会遇到的问题不多(体验过 Zsh 后切换回 Bash 的可能遇到更多),但是当它们发生时,请保持镇定且坦率。严格遵守 POSIX 的情况很少会出错,但是如果失败了,请查找问题以解决并继续。对于许多在工作中困在一个 shell 上而在家中困在另一个 shell 上的用户来说,hyperpolyglot.org 已被证明其是无价的。

在我的下一篇 Zsh 文章中,我将向你展示如何安装主题和插件以定制你的 Z-Shell 甚至 Z-ier。


via: https://opensource.com/article/19/9/getting-started-zsh

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

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

想知道什么是 Linux 内核上真正的(不是那种时髦的)创新吗?

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux 内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大物。

撇开营销和模式不谈,Linux 可以说是开源世界中最受欢迎的内核,它在近 30 年的生命时光当中引入了一些真正的规则改变者。

Cgroups(2.6.24)

早在 2007 年,Paul Menage 和 Rohit Seth 就在内核中添加了深奥的控制组(cgroups)功能(cgroups 的当前实现是由 Tejun Heo 重写的)。这种新技术最初被用作一种方法,从本质上来说,是为了确保一组特定任务的服务质量。

例如,你可以为与你的 WEB 服务相关联的所有任务创建一个控制组定义(cgroup),为例行备份创建另一个 cgroup ,再为一般操作系统需求创建另一个 cgroup。然后,你可以控制每个组的资源百分比,这样你的操作系统和 WEB 服务就可以获得大部分系统资源,而你的备份进程可以访问剩余的资源。

然而,cgroups 如今变得这么著名是因其作为驱动云技术的角色:容器。事实上,cgroups 最初被命名为进程容器。当它们被 LXCCoreOS 和 Docker 等项目采用时,这并不奇怪。

就像闸门打开后一样,“容器” 一词就像成为了 Linux 的同义词一样,微服务风格的基于云的“应用”概念很快成为了规范。如今,已经很难摆脱 cgroups 了,它们是如此普遍。每一个大规模的基础设施(如果你运行 Linux 的话,可能还有你的笔记本电脑)都以一种合理的方式使用了 cgroups,这使得你的计算体验比以往任何时候都更加易于管理和灵活。

例如,你可能已经在电脑上安装了 FlathubFlatpak,或者你已经在工作中使用 Kubernetes 和/或 OpenShift。不管怎样,如果“容器”这个术语对你来说仍然模糊不清,则可以 通过 Linux 容器从背后获得对容器的实际理解。

LKMM(4.17)

2018 年,Jade Alglave、Alan Stern、Andrea Parri、Luc Maranget、Paul McKenney 以及其他几个人的辛勤工作的成果被合并到主线 Linux 内核中,以提供正式的内存模型。Linux 内核内存[一致性]模型(LKMM)子系统是一套描述 Linux 内存一致性模型的工具,同时也产生用于测试的用例(特别命名为 klitmus)。

随着系统在物理设计上变得越来越复杂(增加了更多的中央处理器内核,高速缓存和内存增长,等等),它们就越难知道哪个中央处理器需要哪个地址空间,以及何时需要。例如,如果 CPU0 需要将数据写入内存中的共享变量,并且 CPU1 需要读取该值,那么 CPU0 必须在 CPU1 尝试读取之前写入。类似地,如果值是以一种顺序方式写入内存的,那么期望它们也以同样的顺序被读取,而不管哪个或哪些 CPU 正在读取。

即使在单个处理器上,内存管理也需要特定的任务顺序。像 x = y 这样的简单操作需要处理器从内存中加载 y 的值,然后将该值存储在 x 中。在处理器从内存中读取值之前,是不能将存储在 y 中的值放入 x 变量的。此外还有地址依赖:x[n] = 6 要求在处理器能够存储值 6 之前加载 n

LKMM 可以帮助识别和跟踪代码中的这些内存模式。它部分是通过一个名为 herd 的工具来实现的,该工具(以逻辑公式的形式)定义了内存模型施加的约束,然后列举了与这些约束一致性的所有可能的结果。

低延迟补丁(2.6.38)

很久以前,在 2011 年之前,如果你想在 Linux 上进行多媒体工作,你必须得有一个低延迟内核。这主要适用于录音时添加了许多实时效果(如对着麦克风唱歌和添加混音,以及在耳机中无延迟地听到你的声音)。有些发行版,如 Ubuntu Studio,可靠地提供了这样一个内核,所以实际上这没有什么障碍,这只不过是当艺术家选择发行版时的一个重要提醒。

然而,如果你没有使用 Ubuntu Studio,或者你需要在你的发行版提供之前更新你的内核,你必须跳转到 rt-patches 网页,下载内核补丁,将它们应用到你的内核源代码,编译,然后手动安装。

后来,随着内核版本 2.6.38 的发布,这个过程结束了。Linux 内核突然像变魔术一样默认内置了低延迟代码(根据基准测试,延迟至少降低了 10 倍)。不再需要下载补丁,不用编译。一切都很顺利,这都是因为 Mike Galbraith 编写了一个 200 行的小补丁。

对于全世界的开源多媒体艺术家来说,这是一个规则改变者。从 2011 年开始事情变得如此美好,到 2016 年我自己做了一个挑战,在树莓派 v1(型号 B)上建造一个数字音频工作站(DAW),结果发现它运行得出奇地好。

RCU(2.5)

RCU,即 读-拷贝-更新 Read-Copy-Update ,是计算机科学中定义的一个系统,它允许多个处理器线程从共享内存中读取数据。它通过延迟更新但也将它们标记为已更新来做到这一点,以确保数据读取为最新内容。实际上,这意味着读取与更新同时发生。

典型的 RCU 循环有点像这样:

  1. 删除指向数据的指针,以防止其他读操作引用它。
  2. 等待读操作完成它们的关键处理。
  3. 回收内存空间。

将更新阶段划分为删除和回收阶段意味着更新程序会立即执行删除,同时推迟回收直到所有活动读取完成(通过阻止它们或注册一个回调以便在完成时调用)。

虽然 RCU 的概念不是为 Linux 内核发明的,但它在 Linux 中的实现是该技术的一个定义性的例子。

合作(0.01)

对于 Linux 内核创新的问题的最终答案永远是协作。你可以说这是一个好时机,也可以称之为技术优势,称之为黑客能力,或者仅仅称之为开源,但 Linux 内核及其支持的许多项目是协作与合作的光辉范例。

它远远超出了内核范畴。各行各业的人都对开源做出了贡献,可以说都是因为 Linux 内核。Linux 曾经是,现在仍然是自由软件的主要力量,激励人们把他们的代码、艺术、想法或者仅仅是他们自己带到一个全球化的、有生产力的、多样化的人类社区中。

你最喜欢的创新是什么?

这个列表偏向于我自己的兴趣:容器、非统一内存访问(NUMA)和多媒体。无疑,列表中肯定缺少你最喜欢的内核创新。在评论中告诉我。


via: https://opensource.com/article/19/8/linux-kernel-top-5-innovations

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

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

GIC 是一个聊天应用程序的原型,展示了一种使用 Git 的新方法。

Git 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软件开发中的源代码更改而闻名,但它还有许多其他用途,可以让你的生活更轻松、更有条理。在这个 Git 系列中,我们将分享七种鲜为人知的使用 Git 的方法。

今天我们来看看 GIC,它是一个基于 Git 的聊天应用。

初识 GIC

虽然 Git 的作者们可能期望会为 Git 创建前端,但毫无疑问他们从未预料到 Git 会成为某种后端,如聊天客户端的后端。然而,这正是开发人员 Ephi Gabay 用他的实验性的概念验证应用 GIC 所做的事情:用 Node.js 编写的聊天客户端,使用 Git 作为其后端数据库。

GIC 并没有打算用于生产用途。这纯粹是一种编程练习,但它证明了开源技术的灵活性。令人惊讶的是,除了 Node 库和 Git 本身,该客户端只包含 300 行代码。这是这个聊天客户端和开源所反映出来的最好的地方之一:建立在现有工作基础上的能力。眼见为实,你应该自己亲自来了解一下 GIC。

架设起来

GIC 使用 Git 作为引擎,因此你需要一个空的 Git 存储库为聊天室和记录器提供服务。存储库可以托管在任何地方,只要你和需要访问聊天服务的人可以访问该存储库就行。例如,你可以在 GitLab 等免费 Git 托管服务上设置 Git 存储库,并授予聊天用户对该 Git 存储库的贡献者访问权限。(他们必须能够提交到存储库,因为每个聊天消息都是一个文本的提交。)

如果你自己托管,请创建一个中心化的裸存储库。聊天中的每个用户必须在裸存储库所在的服务器上拥有一个帐户。你可以使用如 GitoliteGitea 这样的 Git 托管软件创建特定于 Git 的帐户,或者你可以在服务器上为他们提供个人用户帐户,可以使用 git-shell 来限制他们只能访问 Git。

自托管实例的性能最好。无论你是自己托管还是使用托管服务,你创建的 Git 存储库都必须具有一个活跃分支,否则 GIC 将无法在用户聊天时进行提交,因为没有 Git HEAD。确保分支初始化和活跃的最简单方法是在创建存储库时提交 README 或许可证文件。如果你没有这样做,你可以在事后创建并提交一个:

$ echo "chat logs" > README
$ git add README
$ git commit -m 'just creating a HEAD ref'
$ git push -u origin HEAD

安装 GIC

由于 GIC 基于 Git 并使用 Node.js 编写,因此必须首先安装 Git、Node.js 和 Node 包管理器npm(它应该与 Node 捆绑在一起)。安装它们的命令因 Linux 或 BSD 发行版而异,这是 Fedora 上的一个示例命令:

$ sudo dnf install git nodejs

如果你没有运行 Linux 或 BSD,请按照 git-scm.comnodejs.org 上的安装说明进行操作。

因此,GIC 没有安装过程。每个用户(在此示例中为 Alice 和 Bob)必须将存储库克隆到其硬盘驱动器:

$ git clone https://github.com/ephigabay/GIC GIC

将目录更改为 GIC 目录并使用 npm 安装 Node.js 依赖项:

$ cd GIC
$ npm install

等待 Node 模块下载并安装。

配置 GIC

GIC 唯一需要的配置是 Git 聊天存储库的位置。编辑 config.js 文件:

module.exports = {
  gitRepo: '[email protected]:/home/gitchat/chatdemo.git',
  messageCheckInterval: 500,
  branchesCheckInterval: 5000
};

在尝试 GIC 之前测试你与 Git 存储库的连接,以确保你的配置是正确的:

$ git clone --quiet [email protected]:/home/gitchat/chatdemo.git > /dev/null

假设你没有收到任何错误,就可以开始聊天了。

用 Git 聊天

在 GIC 目录中启动聊天客户端:

$ npm start

客户端首次启动时,必须克隆聊天存储库。由于它几乎是一个空的存储库,因此不会花费很长时间。输入你的消息,然后按回车键发送消息。

 title=

基于 Git 的聊天客户端。 他们接下来会怎么想?

正如问候消息所说,Git 中的分支在 GIC 中就是聊天室或频道。无法在 GIC 的 UI 中创建新分支,但如果你在另一个终端会话或 Web UI 中创建一个分支,它将立即显示在 GIC 中。将一些 IRC 式的命令加到 GIC 中并不需要太多工作。

聊了一会儿之后,可以看看你的 Git 存储库。由于聊天发生在 Git 中,因此存储库本身也是聊天日志:

$ git log --pretty=format:"%p %cn %s"
4387984 Seth Kenlon Hey Chani, did you submit a talk for All Things Open this year?
36369bb Chani No I didn't get a chance. Did you?
[...]

退出 GIC

Vim 以来,还没有一个应用程序像 GIC 那么难以退出。你看,没有办法停止 GIC。它会一直运行,直到它被杀死。当你准备停止 GIC 时,打开另一个终端选项卡或窗口并发出以下命令:

$ kill `pgrep npm`

GIC 是一个新奇的事物。这是一个很好的例子,说明开源生态系统如何鼓励和促进创造力和探索,并挑战我们从不同角度审视应用程序。尝试下 GIC,也许它会给你一些思路。至少,它可以让你与 Git 度过一个下午。


via: https://opensource.com/article/19/4/git-based-chat

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

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

使 Linux 变得丰富多彩(或单色)。

你可以使用特殊的 ANSI 编码设置为 Linux 终端添加颜色,可以在终端命令或配置文件中动态添加,也可以在终端仿真器中使用现成的主题。无论哪种方式,你都可以黑色屏幕上找回怀旧的绿色或琥珀色文本。本文演示了如何使 Linux 变得丰富多彩(或单色)的方法。

终端的功能特性

现代系统的终端的颜色配置通常默认至少是 xterm-256color,但如果你尝试为终端添加颜色但未成功,则应检查你的 TERM 设置。

从历史上看,Unix 终端从字面上讲是:用户可以输入命令的共享计算机系统上实际的物理端点(终点)。它们专指通常用于远程发出命令的电传打字机(这也是我们今天在 Linux 中仍然使用 /dev/tty 设备的原因)。终端内置了 CRT 显示器,因此用户可以坐在办公室的终端上直接与大型机进行交互。CRT 显示器价格昂贵 —— 无论是制造还是使用控制;比担心抗锯齿和现代计算机专家理所当然认为的漂亮信息,让计算机吐出原始 ASCII 文本更容易。然而,即使在那时,技术的发展也很快,很快人们就会发现,随着新的视频显示终端的设计,他们需要新的功能特性来提供可选功能。

例如,1978 年发布的花哨的新 VT100 支持 ANSI 颜色,因此如果用户将终端类型识别为 vt100,则计算机可以提供彩色输出,而基本串行设备可能没有这样的选项。同样的原则适用于今天,它是由 TERM 环境变量设定的。你可以使用 echo 检查你的 TERM 定义:

$ echo $TERM
xterm-256color

过时的(但在一些系统上仍然为了向后兼容而维护)/etc/termcap 文件定义了终端和打印机的功能特性。现代的版本是 terminfo,位于 /etc/usr/share 中,具体取决于你的发行版。 这些文件列出了不同类型终端中可用的功能特性,其中许多都是由历史上的硬件定义的,如 vt100 到 vt220 的定义,以及 xterm 和 Xfce 等现代软件仿真器。大多数软件并不关心你使用的终端类型; 在极少数情况下,登录到检查兼容功能的服务器时,你可能会收到有关错误的终端类型的警告或错误。如果你的终端设置为功能特性很少的配置文件,但你知道你所使用的仿真器能够支持更多功能特性,那么你可以通过定义 TERM 环境变量来更改你的设置。你可以通过在 ~/.bashrc 配置文件中导出 TERM 变量来完成此操作:

export TERM=xterm-256color

保存文件并重新载入设置:

$ source ~/.bashrc

ANSI 颜色代码

现代终端继承了用于“元”特征的 ANSI 转义序列。这些是特殊的字符序列,终端将其解释为操作而不是字符。例如,此序列将清除屏幕,直到下一个提示符:

$ printf '\033[2J'

它不会清除你的历史信息;它只是清除终端仿真器中的屏幕,因此它是一个安全且具有示范性的 ANSI 转义序列。

ANSI 还具有设置终端颜色的序列。例如,键入此代码会将后续文本更改为绿色:

$ printf '\033[32m'

只要你对相同的计算机使用同一个颜色,就可以使用颜色来帮助你记住你登录的系统。例如,如果你经常通过 SSH 连接到服务器,则可以将服务器的提示符设置为绿色,以帮助你一目了然地将其与本地的提示符区分开来。 要设置绿色提示符,请在提示符前使用 ANSI 代码设置为绿色,并使用代表正常默认颜色的代码结束:

export PS1=`printf "\033[32m$ \033[39m"`

前景色和背景色

你不仅可以设置文本的颜色。使用 ANSI 代码,你还可以控制文本的背景颜色以及做一些基本的样式。

例如,使用 \033[4m,你可以为文本加上下划线,或者使用 \033[5m 你可以将其设置为闪烁的文本。起初这可能看起来很愚蠢,因为你可能不会将你的终端设置为所有文本带有下划线并整天闪烁, 但它对某些功能很有用。例如,你可以将 shell 脚本生成的紧急错误设置为闪烁(作为对用户的警报),或者你可以为 URL 添加下划线。

作为参考,以下是前景色和背景色的代码。前景色在 30 范围内,而背景色在 40 范围内:

颜色前景色背景色
黑色\033[30m\033[40m
红色\033[31m\033[41m
绿色\033[32m\033[42m
橙色\033[33m\033[43m
蓝色\033[34m\033[44m
品红\033[35m\033[45m
青色\033[36m\033[46m
浅灰\033[37m\033[47m
回退到发行版默认值\033[39m\033[49m

还有一些可用于背景的其他颜色:

颜色背景色
深灰\033[100m
浅红\033[101m
浅绿\033[102m
黄色\033[103m
浅蓝\033[104m
浅紫\033[105m
蓝绿\033[106m
白色\033[107m

持久设置

在终端会话中设置颜色只是暂时的,相对无条件的。有时效果会持续几行;这是因为这种设置颜色的方法依赖于 printf 语句来设置一种模式,该模式仅持续到其他设置覆盖它。

终端仿真器通常获取使用哪种颜色的指令的方式来自于 LS_COLORS 环境变量的设置,该设置又由 dircolors 的设置填充。你可以使用 echo 语句查看当前设置:

$ echo $LS_COLORS
rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;
38;5;11:so=38;5;13:do=38;5;5:bd=48;5;
232;38;5;11:cd=48;5;232;38;5;3:or=48;
5;232;38;5;9:mi=01;05;37;41:su=48;5;
196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;
196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;
[...]

或者你可以直接使用 dircolors

$ dircolors --print-database
[...]
# image formats
.jpg 01;35
.jpeg 01;35
.mjpg 01;35
.mjpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.tif 01;35
.tiff 01;35
[...]

这看起来很神秘。文件类型后面的第一个数字是属性代码,它有六种选择:

  • 00 无
  • 01 粗体
  • 04 下划线
  • 05 闪烁
  • 07 反白
  • 08 暗色

下一个数字是简化形式的颜色代码。你可以通过获取 ANSI 代码的最后一个数字来获取颜色代码(绿色前景为 32,绿色背景为 42;红色为 31 或 41,依此类推)。

你的发行版可能全局设置了 LS_COLORS,因此系统上的所有用户都会继承相同的颜色。如果你想要一组自定义的颜色,可以使用 dircolors。首先,生成颜色设置的本地副本:

$ dircolors --print-database > ~/.dircolors

根据需要编辑本地列表。如果你对自己的选择感到满意,请保存文件。你的颜色设置只是一个数据库,不能由 ls 直接使用,但你可以使用 dircolors 获取可用于设置 LS_COLORS 的 shellcode:

$ dircolors --bourne-shell ~/.dircolors
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:
pi=40;33:so=01;35:do=01;35:bd=40;33;01:
cd=40;33;01:or=40;31;01:mi=00:su=37;41:
sg=30;43:ca=30;41:tw=30;42:ow=34;
[...]
export LS_COLORS

将输出复制并粘贴到 ~/.bashrc 文件中并重新加载。或者,你可以将该输出直接转储到 .bashrc 文件中并重新加载。

$ dircolors --bourne-shell ~/.dircolors >> ~/.bashrc
$ source ~/.bashrc

你也可以在启动时使 Bash 解析 .dircolors 而不是手动进行转换。实际上,你可能不会经常改变颜色,所以这可能过于激进,但如果你打算改变你的配色方案,这是一个选择。在 .bashrc 文件中,添加以下规则:

[[ -e $HOME/.dircolors ]] && eval "`dircolors --sh $HOME/.dircolors`"

如果你的主目录中有 .dircolors 文件,Bash 会在启动时对其进行评估并相应地设置 LS_COLORS

颜色

在终端中使用颜色是一种可以为你自己提供特定信息的快速视觉参考的简单方法。但是,你可能不希望过于依赖它们。毕竟,颜色不是通用的,所以如果其他人使用你的系统,他们可能不会像你那样看懂颜色代表的含义。此外,如果你使用各种工具与计算机进行交互,你可能还会发现某些终端或远程连接无法提供你期望的颜色(或根本不提供颜色)。

除了上述警示之外,颜色在某些工作流程中可能很有用且很有趣,因此创建一个 .dircolor 数据库并根据你的想法对其进行自定义吧。


via: https://opensource.com/article/19/9/linux-terminal-colors

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

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

有时当你需要移动一个文件时,mv 命令似乎不是最佳选项,那么你会如何做呢?

不起眼的 mv 命令是在你见过的每个 POSIX 系统中都能找到的有用工具之一。它的作用是明确定义的,并且做得很好:将文件从文件系统中的一个位置移动到另一个位置。但是 Linux 非常灵活,还有其他移动文件的办法。使用不同的工具可以完美匹配一些特殊用例,这算一个小优势。

在远离 mv 之前,先看看这个命令的默认结果。首先,创建一个目录并生成一些权限为 777 的文件:

$ mkdir example
$ touch example/{foo,bar,baz}
$ for i in example/*; do ls /bin > "${i}"; done
$ chmod 777 example/*

你可能不会这么认为,但是文件在一个文件系统中作为条目存在,称为索引节点(通常称为 inode),你可以使用 ls 命令及其 --inode 选项查看一个文件占用的 inode:

$ ls --inode example/foo
7476868 example/foo

作为测试,将文件从示例目录移动到当前目录,然后查看文件的属性:

$ mv example/foo .
$ ls -l -G -g --inode
7476868 -rwxrwxrwx. 1 29545 Aug  2 07:28 foo

如你所见,原始文件及权限已经被“移动”,但它的 inode 没有变化。

这就是 mv 工具用来移动的方式:保持 inode 不变(除非文件被移动到不同的文件系统),并保留其所有权和权限。

其他工具提供了不同的选项。

复制和删除

在某些系统上,移动操作是真的在做移动:比特从文件系统中的某个位置删除并重新分配给另一个位置。这种行为在很大程度上已经失宠。现在,移动操作要么是属性重新分配(inode 现在指向文件组织中的不同位置),要么是复制和删除操作的组合。这种设计的哲学意图是确保在移动失败时,文件不会碎片化。

mv 不同,cp 命令会在文件系统中创建一个全新的数据对象,它有一个新的 inode 位置,并取决于 umask。你可以使用 cprm(如果有的话,或者 trash —— LCTT 译注:它是一个命令行回收站工具)命令来模仿 mv 命令。

$ cp example/foo .
$ ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug  2 11:58 foo
$ trash example/foo

示例中的新 foo 文件获得了 755 权限,因为此处的 umask 明确排除了写入权限。

$ umask
0002

有关 umask 的更多信息,阅读 Alex Juarez 这篇关于文件权限的文章。

查看和删除

与复制和删除类似,使用 cat(或 tac)命令在创建“移动”文件时分配不同的权限。假设当前目录中是一个没有 foo 的新测试环境:

$ cat example/foo > foo
$ ls -l -G -g --inode
7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo
$ trash example/foo

这次,创建了一个没有事先设置权限的新文件,所以文件最终权限完全取决于 umask 设置,它不会阻止用户和组的权限位(无论 umask 是什么,都不会为新文件授予可执行权限),但它会阻止其他人的写入(值为 2)。所以结果是一个权限是 664 的文件。

Rsync

rsync 命令是一个强大的多功能工具,用于在主机和文件系统位置之间发送文件。此命令有许多可用选项,包括使其目标镜像成为源。

你可以使用带有 --remove-source-files 选项的 rsync 复制,然后删除文件,并可以带上你选择执行同步的任何其他选项(常见的通用选项是 --archive):

$ rsync --archive --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo

在这里,你可以看到保留了文件权限和所有权,只是更新了时间戳,并删除了源文件。

警告:不要将此选项与 --delete 混淆,后者会从目标目录中删除(源目录中不存在的)文件。误用 --delete 会清除很多数据,建议你不要使用此选项,除非是在测试环境中。

你可以覆盖其中一些默认值,更改权限和修改设置:

$ rsync --chmod=666 --times \
    --remove-source-files example/foo .
$ ls example
bar  baz
$ ls -lGgi
7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo

这里,目标的 umask 会生效,因此 --chmod=666 选项会产生一个权限为 644 的文件。

好处不仅仅是权限,与简单的 mv 命令相比,rsync 命令有很多有用的选项(其中最重要的是 --exclude 选项,这样你可以在一个大型移动操作中排除某些项目),这使它成为一个更强大的工具。例如,要在移动文件集合时排除所有备份文件:

$ rsync --chmod=666 --times \
    --exclude '*~' \
    --remove-source-files example/foo .

使用 install 设置权限

install 命令是一个专门面向开发人员的复制命令,主要是作为软件编译安装例程的一部分调用。它并不为用户所知(我经常想知道为什么它有这么一个直观的名字,而剩下的包管理器却只能使用缩写和昵称),但是 install 实际上是一种将文件放在你想要地方的有用方法。

install 命令有很多选项,包括 --backup--compare 命令(以避免更新文件的新副本)。

cpcat 命令不同,但与 mv 完全相同,install 命令可以在复制文件的同时而保留其时间戳:

$ install --preserve-timestamp example/foo .
$ ls -l -G -g --inode
7476869 -rwxr-xr-x. 1 29545 Aug  2 07:28 foo
$ trash example/foo

在这里,文件被复制到一个新的 inode,但它的 mtime(修改时间)没有改变。但权限被设置为 install 的默认值 755

你可以使用 install 来设置文件的权限,所有者和组:

$ install --preserve-timestamp \
    --owner=skenlon \
    --group=dialout \
    --mode=666 example/foo .
$ ls -li
7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug  2 07:28 foo
$ trash example/foo

移动、复制和删除

文件包含数据,而真正重要的文件包含你的数据。学会聪明地管理它们是很重要的,现在你有了确保以你想要的方式来处理数据的工具包。

你是否有不同的数据管理方式?在评论中告诉我们你的想法。


via: https://opensource.com/article/19/8/moving-files-linux-without-mv

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

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

像源代码一样对待时间并在 Git 的帮助下维护你的日历。

Git 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软件开发中的源代码更改而闻名,但它还有许多其他用途,可以让你的生活更轻松、更有条理。在这个 Git 系列中,我们将分享七种鲜为人知的使用 Git 的方法。

今天,我们将使用 Git 来跟踪你的日历。

使用 Git 跟踪你的日程安排

如果时间本身只是可以管理和版本控制的源代码呢?虽然证明或反驳这种理论可能超出了本文的范围,但在 Git 的帮助下,你可以将时间视为源代码并管理你的日程安排。

日历的卫冕冠军是 CalDAV 协议,它支撑了如 NextCloud 这样的流行的开源及闭源的日历应用程序。CalDAV 没什么问题(评论者,请注意),但它并不适合所有人,除此之外,它还有一种不同于单一文化的鼓舞人心的东西。

因为我对大量使用 GUI 的 CalDAV 客户端没有兴趣(如果你正在寻找一个好的终端 CalDAV 查看器,请参阅 khal),我开始研究基于文本的替代方案。基于文本的日历具有在明文中工作的所有常见好处。它很轻巧,非常便携,只要它结构化,就很容易解析和美化(无论美丽对你意味着什么)。

最重要的是,它正是 Git 旨在管理的内容。

Org 模式不是一种可怕的方式

如果你没有对你的明文添加结构,它很快就会陷入一种天马行空般的混乱,变成恶魔才能懂的符号。幸运的是,有一种用于日历的标记语法,它包含在令人尊敬的生产力 Emacs 模式 —— Org 模式 中(承认吧,你其实一直想开始使用它)。

许多人没有意识到 Org 模式的惊人之处在于你不需要知道甚至不需要使用 Emacs来利用 Org 模式建立的约定。如果你使用 Emacs,你会得到许多很棒的功能,但是如果 Emacs 对你来说太难了,那么你可以实现一个基于 Git 的 Org 模式的日历系统,而不需要安装 Emacs。

关于 Org 模式你唯一需要知道的部分是它的语法。Org 模式的语法维护成本低、直观。使用 Org 模式而不是 GUI 日历应用程序进行日历记录的最大区别在于工作流程:你可以创建一个任务列表,然后每天分配一个任务,而不是转到日历并查找要安排任务的日期。

组织模式中的列表使用星号(*)作为项目符号。这是我的游戏任务列表:

* Gaming
** Build Stardrifter character
** Read Stardrifter rules
** Stardrifter playtest

** Blue Planet @ Mike's

** Run Rappan Athuk
*** Purchase hard copy
*** Skim Rappan Athuk
*** Build Rappan Athuk maps in maptool
*** Sort Rappan Athuk tokens

如果你熟悉 CommonMark 或 Markdown,你会注意到,Org 模式不是使用空格来创建子任务,而是更明确地使用了其它项目符号。无论你的使用背景和列表是什么,这都是一种构建列表的直观且简单的方法,它显然与 Emacs 没有内在联系(尽管使用 Emacs 为你提供了快捷方式,因此你可以快速地重新排列列表)。

要将列表转换为日历中的计划任务或事件,请返回并添加关键字 SCHEDULED 和(可选):CATEGORY:

* Gaming
:CATEGORY: Game
** Build Stardrifter character
SCHEDULED: <2019-03-22 18:00-19:00>
** Read Stardrifter rules
SCHEDULED: <2019-03-22 19:00-21:00>
** Stardrifter playtest
SCHEDULED: <2019-03-25 0900-1300>
** Blue Planet @ Mike's
SCHEDULED: <2019-03-18 18:00-23:00 +1w>

and so on...

SCHEDULED 关键字将该条目标记为你希望收到通知的事件,并且可选的 :CATEGORY: 关键字是一个可供你自己使用的任意标记系统(在 Emacs 中,你可以根据类别对条目使用颜色代码)。

对于重复事件,你可以使用符号(如+1w)创建每周事件或 +2w 以进行每两周一次的事件,依此类推。

所有可用于 Org 模式的花哨标记都记录于文档,所以不要犹豫,找到更多技巧来让它满足你的需求。

放进 Git

如果没有 Git,你的 Org 模式的日程安排只不过是本地计算机上的文件。这是 21 世纪,所以你至少需要可以在手机上使用你的日历,即便不是在你所有的个人电脑上。你可以使用 Git 为自己和他人发布日历。

首先,为 .org 文件创建一个目录。我将我的存储在 ~/cal 中。

$ mkdir ~/cal

转到你的目录并使其成为 Git 存储库:

$ cd cal
$ git init

.org 文件移动到你本地的 Git 存储库。在实践中,我为每个类别维护一个 .org 文件。

$ mv ~/*.org ~/cal
$ ls
Game.org Meal.org Seth.org Work.org

暂存并提交你的文件:

$ git add *.org
$ git commit -m 'cal init'

创建一个 Git 远程源

要在任何地方提供日历,你必须在互联网上拥有 Git 存储库。你的日历是纯文本,因此任何 Git 存储库都可以。你可以将日历放在 GitLab 或任何其他公共 Git 托管服务(甚至是专有服务)上,只要你的主机允许,你甚至可以将该存储库标记为私有库。如果你不想将日历发布到你无法控制的服务器,则可以自行托管 Git 存储库,或者为单个用户使用裸存储库,或者使用 GitoliteGitea 等前端服务。

为了简单起见,我将假设一个自托管的 Git 裸存储库。你可以使用 Git 命令在任何具有 SSH 访问权限的服务器上创建一个远程裸存储库:

$ ssh -p 22122 [[email protected]][14]
[remote]$ mkdir cal.git
[remote]$ cd cal.git
[remote]$ git init --bare
[remote]$ exit

这个裸存储库可以作为你日历在互联网上的家。

将其设置为本地 Git 存储库(在你的计算机上,而不是你的服务器上)的远程源:

$ git remote add origin [email protected]:/home/seth/cal.git

然后推送你的日历到该服务器:

$ git push -u origin HEAD

将你的日历放在 Git 存储库中,就可以在任何运行 Git 的设备上使用它。这意味着你可以对计划进行更新和更改,并将更改推送到上游,以便在任何地方进行更新。

我使用这种方法使我的日历在我的工作笔记本电脑和家庭工作站之间保持同步。由于我每天大部分时间都在使用 Emacs,因此能够在 Emacs 中查看和编辑我的日历是一个很大的便利。对于大多数使用移动设备的人来说也是如此,因此下一步是在移动设备上设置 Org 模式的日历系统。

移动设备上的 Git

由于你的日历数据是纯文本的,严格来说,你可以在任何可以读取文本文件的设备上“使用”它。这是这个系统之美的一部分;你永远不会缺少原始数据。但是,要按照你希望的现代日历的工作方式将日历集成到移动设备上,你需要两个组件:移动设备上的 Git 客户端和 Org 模式查看器。

移动设备上的 Git 客户端

MGit 是 Android 上的优秀 Git 客户端。同样,iOS 也有 Git 客户端。

一旦安装了 MGit(或类似的 Git 客户端),你必须克隆日历存储库,以便在你的手机上有副本。要从移动设备访问服务器,必须设置 SSH 密钥进行身份验证。MGit 可以为你生成和存储密钥,你必须将其添加到服务器的 ~/.ssh/authorized_keys 文件或托管的 Git 的帐户设置中的 SSH 密钥中。

你必须手动执行此操作。MGit 没有登录你的服务器或托管的 Git 帐户的界面。如果你不这样做,你的移动设备将无法访问你的服务器以访问你的日历数据。

我是通过将我在 MGit 中生成的密钥文件通过 KDE Connect 复制到我的笔记本电脑来实现的(但你可以通过蓝牙、SD 卡读卡器或 USB 电缆进行相同操作,具体取决于你访问手机上的数据的首选方法)。 我用这个命令将密钥(一个名为 calkey 的文件)复制到我的服务器:

$ cat calkey | ssh [email protected] "cat >> /home/seth/.ssh/authorized_keys"

你可能有不同的方法,但如果你曾经将服务器设置为无密码登录,这是完全相同的过程。如果你使用的是 GitLab 等托管的 Git 服务,则必须将密钥文件的内容复制并粘贴到用户帐户的 SSH 密钥面板中。

 title=

完成后,你的移动设备可以向你的服务器授权,但仍需要知道在哪里查找你的日历数据。不同的应用程序可能使用不同的表示法,但 MGit 使用普通的旧式 Git-over-SSH。这意味着如果你使用的是非标准 SSH 端口,则必须指定要使用的 SSH 端口:

$ git clone ssh://[email protected]:22122//home/seth/git/cal.git

 title=

如果你使用其他应用程序,它可能会使用不同的语法,允许你在特殊字段中提供端口,或删除 ssh:// 前缀。如果遇到问题,请参阅应用程序文档。

将存储库克隆到手机。

 title=

很少有 Git 应用程序设置为自动更新存储库。有一些应用程序可以用来自动拉取,或者你可以设置 Git 钩子来推送服务器的更新 —— 但我不会在这里讨论这些。目前,在对日历进行更新后,请务必在 MGit 中手动提取新更改(或者如果在手机上更改了事件,请将更改推送到服务器)。

 title=

移动设备上的日历

有一些应用程序可以为移动设备上的 Org 模式提供前端。Orgzly 是一个很棒的开源 Android 应用程序,它为 Org 模式的从 Agenda 模式到 TODO 列表的大多数功能提供了一个界面。安装并启动它。

从主菜单中,选择“设置同步存储库”,然后选择包含日历文件的目录(即,从服务器克隆的 Git 存储库)。

给 Orgzly 一点时间来导入数据,然后使用 Orgzly 的汉堡包菜单选择日程视图。

 title=

在 Orgzly 的“设置提醒”菜单中,你可以选择在手机上触发通知的事件类型。你可以获得 SCHEDULED 任务,DEADLINE 任务或任何分配了事件时间的任何通知。如果你将手机用作任务管理器,那么你将永远不会错过 Org 模式和 Orgzly 的活动。

 title=

Orgzly 不仅仅是一个解析器。你可以编辑和更新事件,甚至标记事件为 DONE

 title=

专为你而设计

关于使用 Org 模式和 Git 的重要一点是,这两个应用程序都非常灵活,并且你可以自定义它们的工作方式和内容,以便它们能够适应你的需求。如果本文中的内容是对你如何组织生活或管理每周时间表的冒犯,但你喜欢此提案提供的其他部分,那么请丢弃你不喜欢的部分。如果需要,你可以在 Emacs 中使用 Org 模式,或者你可以将其用作日历标记。你可以将手机设置为在一天结束时从计算机上拉取 Git 数据,而不是从互联网上的服务器上,或者你可以将计算机配置为在手机插入时同步日历,或者你可以每天管理它,就像你把你工作日所需的所有东西都装到你的手机上一样。这取决于你,而这是关于 Git、Org 模式和开源的最重要的事情。


via: https://opensource.com/article/19/4/calendar-git

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

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