Seth Kenlon 发布的文章

比较 tmux、GNU Screen、Konsole 和 Terminator,看看哪个最适合你。

 title=

Linux 用户通常需要大量的虚拟视觉空间。一个终端窗口是永远不够的,所以终端有了标签。一个桌面太受限制了,所以有了虚拟桌面。当然,应用程序窗口可以堆叠,但当它们堆叠起来时,又有多大的好处呢?哎呀,即使是后台文本控制台也有 F1F7,可以在任务之间来回翻转。

有了这么多的多任务处理方式,有人发明了终端 多路复用器 的概念就不奇怪了。诚然,这是一个令人困惑的术语。在传统的电子学中,“ 多路复用器 multiplexer ”是一个接收多个输入信号并将选定的信号转发到单一输出的部件。终端多路复用器的作用正好相反。它从一个输入(人类在键盘上向一个终端窗口打字)接收指令,并将该输入转发给任意数量的输出(例如,一组服务器)。

然后,“多路复用器”一词在美国也是一个流行的术语,指的是有许多屏幕的电影院(与“ 影城 cineplex ”一词一个意思)。在某种程度上,这很好地描述了终端复用器的作用。它可以在一个框内提供许多屏幕。

不管这个词是什么意思,任何尝试过它的人都有自己的喜好的某一种多路复用器。因此,我决定考察一些流行的终端多路复用器,看看每一个都怎么样。就我的评估标准而言,最低限度,我需要每个多路复用器能够分割堆叠终端窗口。

tmux

 title=

据我所知,是从 tmux 开始使用“多路复用器”这个术语的。它工作的很出色。

它作为一个守护程序运行,这样即使你关闭了正在查看的终端模拟器,你的终端会话仍然处于活动状态。它将你的终端屏幕分割成多个面板,这样你就可以在每个面板上打开独特的终端提示符。

推而广之,这意味着你也可以远程连接到任何数量的系统,并在你的终端中打开它们。利用 tmux 的能力,将输入镜像(或者以电子学术语说是“反向多路复用”)到其他打开的窗格,就能从一个中央命令窗格同时控制几台计算机。

tmux 在 GNU Screen 还只能水平分割的时候就有了垂直分割能力,这吸引了追求最大灵活性的粉丝。而灵活性正是用户在 tmux 中得到的。它可以分割、堆叠、选择和提供服务;几乎没有什么是它做不到的。

? 软件包大小

从软件包中安装 tmux 大约需要 700K,这还不算它所依赖的十几个共享库。

?️ 控制键

tmux 的默认触发键是 Ctrl+B,尽管很容易在其配置文件中重新定义。

⌨️ 黑客因子

即使你只是在学习如何使用终端,你也一定会觉得使用 tmux 的人很像黑客。它看起来很复杂,但一旦你了解了正确的键绑定,就很容易使用。它为你提供了很多有用的技巧,让你玩的飞起,而且它是一种快速构建 HUD(抬头显示器)的超简单方法,可以把你需要的所有信息摆在你面前。

GNU Screen

 title=

像 tmux 一样,GNU Screen 也运行一个守护程序,所以即使你关闭了用来启动它的终端,你的 shell 仍然可用。你可以从不同的计算机上连接并共享屏幕。它可以将你的终端屏幕分割成水平或垂直的窗格。

与 tmux 不同的是,GNU Screen 可以通过串行连接进行连接(screen 9600 /dev/ttyUSB0 就可以了),通过按键绑定可以方便地发出 XONXOFF 信号。

与 SSH 会话相比,在串行连接中需要多路复用器的情况可能并不常见,所以大多数用户并不了解 Screen 这个真正特殊的功能。不过,GNU Screen 是一个很棒的多路复用器,有很多有用的选项。而如果你真的需要同时向多个服务器发送信号,还有专门的工具,比如 ClusterSSH 和 Ansible

? 软件包大小

从软件包中安装 GNU Screen 大约需要 970K,这还不算它所依赖的十几个共享库。

?️ 控制键

GNU Screen 的默认触发键是 Ctrl+A,这对于熟悉 Bash 快捷键的人来说可能特别烦人。幸运的是,你可以在配置文件中轻松地重新定义这个触发键。

⌨️ 黑客因子

当使用 Screen 通过串行连接到你的路由器或你的原型电路板时,你会成为你所有硬件黑客朋友羡慕的对象。

Konsole

 title=

对于没有标榜自己是多路复用器的 Konsole 来说,令人惊讶的是它也是其中一个。它可以使用 Qt 窗格和标签进行必要的窗口分割和堆叠,但它也可以通过“编辑(将输入复制到)”菜单中的一个选项将输入从一个窗格传到另一个(或全部)。

然而,它所最明显缺乏的功能是作为一个守护程序运行以进行远程重新连接的能力。与 tmux 和 GNU Screen 不同,你不能远程连接到运行 Konsole 的机器并加入会话。对于一些管理员来说,这可能不是一个问题。许多管理员用 VNC 连接到机器的次数比用 SSH 还要多,所以“重新加入”一个会话就像在 VNC 客户端上点击 Konsole 窗口一样简单。

使用 Konsole 作为多路复用器是 KDE 极客们的大招。Konsole 是我使用的第一个 Linux 终端(直到今天,我有时也会按 Ctrl+N 来切换新标签),所以有能力使用这个熟悉的终端作为多路复用器是一个很大的便利。这绝不是必要的,因为无论如何 tmux 和 Screen 都可以在 Konsole 里面运行,但是通过让 Konsole 处理窗格,我就不必调整肌肉记忆。这种微妙的功能包容正是 KDE 的伟大之处

? 软件包大小

Konsole 本身大约是 11KB,但它依赖于 105 个 KDE 和 Qt 库,所以实际上,它至少有 50MB。

?️ 控制键

大多数重要的 Konsole 快捷键以 Shift+Ctrl 开始,分割屏幕、打开新标签、复制输入到其他窗格等都是如此。这是 KDE 里的主控台,所以如果你对 Plasma 桌面很熟悉,会感觉快捷键很熟悉。

⌨️ 黑客因子

使用 Konsole 作为你的多路复用器让你有资格称自己为 KDE 高级用户。

Terminator

 title=

对于 GNOME 用户来说,Terminator 多路复用器是为他们原本极简的 GNOME 终端增加功能的一个简单方法。除了必要的多路复用功能外,Terminator 还可以向所有打开的窗格广播输入,但和 Konsole 一样,它不会在后台运行以便你可以通过 SSH 重新连接到它。话说回来,由于 GNOME 和 Wayland 让 VNC 变得如此简单,你有可能会觉得没有必要通过 SSH 来恢复终端会话。

如果你愿意,Terminator 可以完全由鼠标驱动。Konsole 通过其主菜单也有同样的能力。有了 Terminator,你可以在 Shell 的任何地方点击右键,弹出相关选项,以水平或垂直分割窗口,将窗格分组作为广播目标,广播输入,关闭窗格,等等。你还可以为所有这些动作配置键盘快捷键,所以在许多方面,你可以形成自己的体验。

我认为自己主要是一个 KDE 用户,所以当我说 Terminator 感觉像一个 KDE 应用时,我其实是一种极大的赞美。Terminator 是一个令人惊讶的可配置的和灵活的应用程序。在许多方面,它体现了开源的力量,把简陋的 GNOME 终端变成了一个强大的多路复用器。

? 软件包大小

Terminator 的安装容量为 2.2MB,其中大部分是 Python 模块。但它依赖于 GTK3 和 GNOME,所以如果你没有运行完整的 GNOME 桌面,可以预料你需要一个更大的安装来拉入这些依赖。

?️ 控制键

Terminator 的默认控制键没有什么一致性。你可以用 Alt 键来执行一些命令,用 Ctrl 来执行其他命令,还可以用 Shift+CtrlCtrl+AltShift+Super 等等,还有鼠标。话说回来,这是我试过的最可配置的多路复用器之一,所以只要有想法,稍加努力,你就能设计出适合你的模式。

⌨️ 黑客因子

当你使用 Terminator 时,你会觉得自己是最现代、最务实的黑客。由于它的各种极客选项,它是多路复用的最佳选择,而且由于它非常灵活,无论你的手是在键盘上,还是键盘和鼠标并用,你都可以同样轻松地使用它。

我全要

还有更多的多路复用器和一些具有类似多路复用能力的应用。你不必非要找到一个完全按照你想要的方式完成你需要的所有工作的多路复用器。你可以使用不止一个。事实上,你甚至可以同时使用多个,因为 tmux 和 Screen 实际上是 shell,而 Konsole 和 Terminator 是显示 shell 的终端。对唾手可得的工具感到舒适,而且它们能帮助你管理你的工作空间,使你能有效地工作,才是最重要的。

去尝试一下多路复用器,或者在你喜欢的应用程序中发现类似多路复用器的功能。它可能会改变你看待计算的方式。


via: https://opensource.com/article/21/5/linux-terminal-multiplexer

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

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

CMake 是一个跨平台的编译、测试和打包软件,即使你以前从来没有使用过构建系统,也可以轻松上手。

 title=

在我以前的文章 Autotools 入门 一文中,我说明了如何使用 Autotools 来管理和打包代码。这是一个强大且通用的平台,可轻松集成到许多打包系统中,包括 RPM、APT、pkgsrc 等等。它的语法和结构可能会令人困惑,但幸运的是,我们还有其他选择,开源的 CMake 就是其中一个。

CMake 是一个用于构建、测试和打包软件的跨平台套件。它使用简单而清晰的语法,因此即使你以前从未使用过构建系统,也很容易开始使用。

安装 CMake

CMake 可能已经安装在你的 Linux 系统上。如果没有,你可以使用发行版的程序包管理器进行安装:

$ sudo dnf install cmake

在 Debian 或者其他相似的系统上:

$ sudo apt install cmake

在 Mac 上,你可以使用 MacPorts 或者 Homebrew 来安装:

$ sudo port install cmake

在 Windows 上,你可以使用 Chocolatey 或者直接从 CMake 网站 下载二进制来安装。

使用 CMake

对于想要从源代码构建软件的开发人员或用户来说,CMake 是一种快速简便的编译和安装方法。 CMake 分阶段工作:

  1. 首先,在 cmake 步骤中,CMake 扫描计算机查看一些默认设置。默认设置包括库的位置以及在系统上安装软件的位置。
  2. 接下来,使用系统上的 make 命令(在 Linux 上是 GUN Make,在 NetBSD 上是 NetBSD Make)来编译程序。这个过程通常是将人类可读的源代码转换成机器语言。
  3. 最后,在 make install 一步中,那些编译过的文件将被拷贝到(在 cmake 步骤中扫描出来的)计算机上合适的位置。

这看起来很简单,当你使用 CMake 时就是这样。

CMake 的可移植性

CMake 在设计时就考虑了可移植性。虽然它不能使你的项目在所有 POSIX 平台上都能正常工作(这取决于作为开发者的你),但它可以确保将标记为要安装的文件安装到已知平台上最合适的位置。而且由于有了 CMake 之类的工具,对于高级用户而言,根据其系统需求自定义和覆盖任何不合适的选项都很容易。

使用 CMake,你只需要知道将哪些文件安装到哪个常规位置即可。它会照顾其他一切。不再需要自定义安装脚本,它们有可能在任何未经测试的操作系统上失败。

打包

像 Autotools 一样,CMake 也得到了很好的打包支持。无论它们是打包成 RPM 还是 DEB 或 TGZ(或其他任何东西),将带有 CMake 的项目交给打包者,他们的工作既简单又直接。打包工具支持 CMake,因此可能不需要进行任何修补或者调整。在许多情况下,可以自动将 CMake 项目整合到工作流中。

如何使用 CMake

要在项目中使用 CMake,只需在项目目录中创建 CMakeLists.txt 文件。首先,声明最低要求的 CMake 版本以及项目名称和版本。CMake 会努力在尽可能长时间内保持兼容性,但是随着你使用的时间越长,并且关注它最新的开发动态,你就会知道哪些特性是你所依赖的。

cmake_minimum_required(VERSION 3.10)

project(Hello VERSION 1.0)

如你可能已经看到的那样,CMake 的语法是一个带有括号和参数的命令。大写的 VERSION 字符串不是任意的,也不只是格式。它们是 project 命令中的有效参数。

在继续之前,先写一个简单的 C 或者 C++ 的 hello world 程序。为了简单,我就写了六行 C 代码,并把它保存在 hello.c 中(为了匹配我在 CMakeLists.txt 中可执行文件的名字)。

#include <stdio.h>

int main() {
   printf("Hello open source\n");
   return 0;
}

不过,不要搞错了,CMake 不仅适用于 C 和 C++。它可以处理任意文件,并且有许多可用的命令,因此它可以帮助你维护许多不同形式的项目。

CMake 网站中记录了所有有效的内置命令及其可用参数,因此无论你要做什么,都可以轻松发现所需的功能。不过,这是一个简单的示例,因此,你需要的下一个命令是必不可少的 —— 你必须为 CMake 定义要构建的代码:

add_executable(Hello hello.c)

这个命令指定了你编译后的二进制文件的名字为 Hello。因此,它与你在终端中执行带有 -o Hellogcc 命令是一样的。

在一些比较复杂的项目中,你可能还需要使用库文件,你可以使用 add library 命令来链接库文件。

在你设置了你想要构建和标记为安装的文件之后,你必须要告诉 CMake 一旦用户安装了程序,最终的应用程序应该在哪个位置。

在这个简单的例子里,你仅需要做的一件事就是在你的 CMakeLists.txt 文件里添加 install 命令。install 命令接受几个参数。但是在这个例子中,你仅需要使用 TARGET 命令来指定你要安装文件的名字。

install(TARGETS Hello)

向 CMake 工程添加一些文件

一个软件项目向用户交付的往往不仅仅只有代码,还有一些其他的文件数据,例如手册或者是信息页、示例项目,或者是配置文件。你可以使用与包含编译文件时类似的工作流程,将任意数据包含在 CMake 项目中:在 CMakelists.txt 文件中使用 file 命令,然后说明一下这些文件要安装在哪里。

例如,你可以在这个项目中包含一个 assets 目录,你可以使用 file 命令,后面跟上 COPYDESTINATION 参数来告诉 CMake 将这些额外的文件复制到你的分发包中。

file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")

这个 ${CMAKE_CURRENT_BINARY_DIR} 变量是一个特殊的 CMake 内置变量,表示 CMake 正在处理的目录。换句话说,你的任何文件都会被复制到编译目录(在你运行 cmake 命令后,这个过程会更加清晰,到时候回过头来看一下)。

因为这些额外的数据文件有些杂乱不堪(如果你不信的话,可以看一下 /usr/share 这个目录)。对于你自己的项目创建一个子文件夹对谁都有好处。最好也带上版本名字。你可以通过在 CMAKE_CURRENT_BINARY_DIR 中指定一个新的目录,使用你选择的项目名称,后面跟一个为你的项目命名的特殊变量和你在项目声明中为它设置的 VERSION

file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}")

定义安装位置

你已经定义你要编译的文件,因此现在你要告诉 CMake 你的程序要安装在哪个位置。比如你的主程序,这个要程使用 install 命令:

install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}" TYPE DATA)

这里有一些新的参数。DIRECTORY 参数指定了数据文件是一个目录,而不是一个文件(FILE)或者脚本(SCRIPT)。你使用的参数和复制一些额外文件到编译目录时是一样。另外,在 install 命令中 TYPE 或者 DESTINATION 必须要指定其一。TYPE 参数指定了通用的文件类型,这些文件通常将会被放到合适的位置。在 Linux 系统上,TYPE DATA 一般是 /usr/local/share 或者 /usr/share,除非用户定义了其他的位置。

这是诸如 CMake 之类的良好构建系统的强大功能之一。你不必担心文件的确切位置,因为你知道用户可以更改 CMake 的首选默认设置,并且 CMake 将构建代码以使其正常工作。

运行 CMake

CMake 有多种方式来让你执行命令,你可以在终端或者在一个可交互的程序上执行命令,或者你也可以使用它的图形界面(GUI)。我比较偏向于使用终端命令,但是我也喜欢使用一些其他的方式(相比与在 Makefile 中查找那些晦涩的变量然后去修改它们更胜一筹)。

对于编译过开源 C++ 项目的任何人,都熟悉的第一步是创建一个 build 目录,进入到该目录,然后运行 cmake .. 命令。 我是一个懒惰的打字员,所以我将构建目录命名为 b,但是你可以使用最合适的方式:

$ mkdir b
$ cd b
$ cmake ..
-- The C compiler identification is GNU 11.1.1
-- The CXX compiler identification is GNU 11.1.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /var/home/seth/demo-hello/b
$

这或多或少相当于经典的 ./configure; make; make install 中的 ./configure。看一下你的构建目录,CMake 已经帮你生成了几个新的文件,来让你的项目更完整。这里生成了 CMake 的数据文件、一个常规的 Makefile 文件(这是一个免费提供的 247 行的文件,但对于越复杂的项目,行数要多得多),还有一个包含这个示例程序的任意非编译数据的 Hello-1.0 目录。

$ ls
CMakeCache.txt
CMakeFiles
Makefile
Hello-1.0
cmake_install.cmake

接下来,你可以进行构建。你可以使用 CMake 的 --build 选项来做这件事,使用当前的构建目录作为源目录。

$ cmake --build .
Scanning dependencies of target Hello
[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o
[100%] Linking C executable Hello
[100%] Built target Hello

或者你可以运行 make 命令。这将读取由 CMake 生成的 Makefile 文件。在这个例子中,make 默认的行为就是由源程序 hello.c 生成目标文件。

$ make
Scanning dependencies of target Hello
[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o
[100%] Linking C executable Hello
[100%] Built target Hello
$

如你所料,Hello 二进制可执行文件现在存在于当前的构建目录中。因为它是一个简单的自包含应用程序,所以你可以运行它进行测试:

$ ./Hello
Hello open source
$

最后,你可以用 --install 选项进行安装。因为我不希望我的简单的 “hello world” 应用程序真的被安装到我的系统上,我设置了 --prefix 选项,将 CMake 的目标从根目录(/)重定向到 /tmp 的一个子目录。

$ cmake --install . --prefix /tmp/hello/
-- Install configuration: ""
-- Installing: /tmp/dist-hello/usr/local/bin/Hello
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

另外,你也可以运行 make install 来调用 Makefile 的安装动作。同样,为了避免在我的系统上安装一个演示程序,我在这个例子中设置了 DESTDIR 变量,将安装目标重定向到 /tmp 的一个子目录:

$ mkdir /tmp/dist-hello
$ make install DESTDIR=/tmp/dist-hello
[100%] Built target Hello
Install the project...
-- Install configuration: ""
-- Installing: /tmp/dist-hello/usr/local/bin/Hello
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0
-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

看一下输出的内容,来确定它具体的安装位置,这个程序已经安装好了。

快速自定义

CMake 的安装前缀(由 CMAKE_INSTALL_PREFIX 变量指定)默认是在 /usr/local 这个位置,但是所有的 CMake 变量都可以在你运行 cmake 命令的时候,加一个 -D 选项来改变它。

$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$ make install DESTDIR=/tmp/dist-hello
$ make install DESTDIR=/tmp/dist-hello
[100%] Built target Hello
Install the project...
-- Install configuration: ""
-- Installing: /tmp/dist-hello/usr/bin/Hello
-- Installing: /tmp/dist-hello/usr/share/Hello-1.0
-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file0
-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file1

所有由 CMake 使用的变量都可以通过这种方式来修改。

交互式的 CMake

CMake 的交互模式是一种用于配置安装环境的友好而有用的方法。要让用户知道该项目使用的所有可能的 CMake 变量是一件工作量很大的事,因此 CMake 交互式界面是他们无需查看 MakefileCMakeLists 即可发现自定义选项的简便方法。

为了调用这个交互式的 CMake,使用 ccmake 命令,在这个简单的项目里没有太多的东西。但是对于像 Rosegarden 这样的大型项目,这将非常有用。

 title=

CMake 的更多知识

还有很多很多的 CMake 知识需要去了解。作为一个开发者,我非常喜欢它简洁的语法、详尽的文档、可扩展性以及便捷性。作为一个用户我非常喜欢 CMake 友好且实用的错误提示信息还有它的用户界面,如果你的项目还未开始使用构建系统,请了解一下 CMake 吧。你以及以后尝试打包你应用程序的任何人都不会后悔。


via: https://opensource.com/article/21/5/cmake

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

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

了解 sed 的基本用法,然后下载我们的备忘单,方便快速地参考 Linux 流编辑器。

 title=

很少有 Unix 命令像 sedgrepawk 一样出名,它们经常组合在一起,可能是因为它们具有奇怪的名称和强大的文本解析能力。它们还在一些语法和逻辑上有相似之处。虽然它们都能用于文本解析,但都有其特殊性。本文研究 sed 命令,它是一个 流编辑器 stream editor

我之前写过关于 sed 以及它的远亲 ed 的文章。要熟悉 sed,对 ed 有一点了解是有帮助的,因为这有助于你熟悉缓冲区的概念。本文假定你熟悉 sed 的基本知识,这意味着你至少已经运行过经典的 s/foo/bar 风格的查找和替换命令。

安装 sed

如果你使用的是 Linux、BSD 或 macOS,那么它们已经安装了 GNU 的或 BSD 的 sed。这些是原始 sed 命令的独特重新实现。虽然它们很相似,但也有一些细微的差别。本文已经在 Linux 和 NetBSD 版本上进行了测试,所以你可以使用你的计算机上找到的任何 sed,但是对于 BSD sed,你必须使用短选项(例如 -n 而不是 --quiet)。

GNU sed 通常被认为是功能最丰富的 sed,因此无论你是否运行 Linux,你可能都想要尝试一下。如果在 Ports 树中找不到 GNU sed(在非 Linux 系统上通常称为 gsed),你可以从 GNU 网站 下载源代码。 安装 GNU sed 的好处是,你可以使用它的额外功能,但是如果需要可移植性,还可以限制它以遵守 sed 的 POSIX 规范。

MacOS 用户可以在 MacPortsHomebrew 上找到 GNU sed。

在 Windows 上,你可以通过 Chocolatey安装 GNU sed

了解模式空间和保留空间

sed 一次只能处理一行。因为它没有可视化模式,所以会创建一个 模式空间 pattern space ,这是一个内存空间,其中包含来自输入流的当前行(删除了尾部的任何换行符)。填充模式空间后,sed 将执行你的指令。当命令执行完时,sed 将模式空间中的内容打印到输出流,默认是 标准输出,但是可以将输出重定向到文件,甚至使用 --in-place=.bak 选项重定向到同一文件。

然后,循环从下一个输入行再次开始。

为了在遍历文件时提供一点灵活性,sed 还提供了 保留空间 hold space (有时也称为 保留缓冲区 hold buffer ),即 sed 内存中为临时数据存储保留的空间。你可以将保留空间当作剪贴板,实际上,这正是本文所演示的内容:如何使用 sed 复制/剪切和粘贴。

首先,创建一个示例文本文件,其内容如下:

Line one
Line three
Line two

复制数据到保留空间

要将内容放置在 sed 的保留空间,使用 hH 命令。小写的 h 告诉 sed 覆盖保留空间中的当前内容,而大写的 H 告诉 sed 将数据追加到保留空间中已经存在的内容之后。

单独使用,什么都看不到:

$ sed --quiet -e '/three/ h' example.txt
$

--quiet(缩写为 -n)选项禁止显示所有输出,但 sed 执行了我的搜索需求。在这种情况下,sed 选择包含字符串 three 的任何行,并将其复制到保留空间。我没有告诉 sed 打印任何东西,所以没有输出。

从保留空间复制数据

要了解保留空间,你可以从保留空间复制内容,然后使用 g 命令将其放入模式空间,观察会发生什么:

$ sed -n -e '/three/h' -e 'g;p' example.txt

Line three
Line three

第一个空白行是因为当 sed 第一次复制内容到模式空间时,保留空间为空。

接下来的两行包含 Line three 是因为这是从第二行开始的保留空间。

该命令使用两个唯一的脚本(-e)纯粹是为了帮助提高可读性和组织性。将步骤划分为单独的脚本可能会很有用,但是从技术上讲,以下命令与一个脚本语句一样有效:

$ sed -n -e '/three/h ; g ; p' example.txt

Line three
Line three

将数据追加到模式空间

G 命令会将一个换行符和保留空间的内容添加到模式空间。

$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one

Line three
Line three
Line two
Line three

此输出的前两行同时包含模式空间(Line one)的内容和空的保留空间。接下来的两行与搜索文本(three)匹配,因此它既包含模式空间又包含保留空间。第三行的保留空间没有变化,因此在模式空间(Line two)的末尾是保留空间(仍然是 Line three)。

用 sed 剪切和粘贴

现在你知道了如何将字符串从模式空间转到保留空间并再次返回,你可以设计一个 sed 脚本来复制、删除,然后在文档中粘贴一行。例如,将示例文件的 Line three 挪至第三行,sed 可以解决这个问题:

$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
  • 第一个脚本找到包含字符串 three 的行,并将其从模式空间复制到保留空间,替换当前保留空间中的任何内容。
  • 第二个脚本删除包含字符串 three 的任何行。这样就完成了与文字处理器或文本编辑器中的 剪切 动作等效的功能。
  • 最后一个脚本找到包含字符串 two 的行,并将保留空间的内容\_追加\_到模式空间,然后打印模式空间。

任务完成。

使用 sed 编写脚本

再说一次,使用单独的脚本语句纯粹是为了视觉和心理上的简单。剪切和粘贴命令作为一个脚本同样有效:

$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three

它甚至可以写在一个专门的脚本文件中:

#!/usr/bin/sed -nf

/three/h
/three/d
/two/ G
p

要运行该脚本,将其加入可执行权限,然后用示例文件尝试:

$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three

当然,你需要解析的文本越可预测,则使用 sed 解决问题越容易。发明 sed 操作(例如复制和粘贴)的“配方”通常是不切实际的,因为触发操作的条件可能因文件而异。但是,你对 sed 命令的使用越熟练,就越容易根据需要解析的输入来设计复杂的动作。

重要的事情是识别不同的操作,了解 sed 何时移至下一行,并预测模式和保留空间包含的内容。

下载备忘单

sed 很复杂。虽然它只有十几个命令,但它灵活的语法和原生功能意味着它充满了无限的潜力。为了充分利用 sed,我曾经参考过一些巧妙的单行命令,但是直到我开始发明(有时是重新发明)自己的解决方案时,我才觉得自己真正开始学习 sed 了 。如果你正在寻找命令提示和语法方面的有用技巧,下载我们的 sed 备忘单,然后开始一劳永逸地学习 sed!


via: https://opensource.com/article/21/3/sed-cheat-sheet

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

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

通过在 GNOME 3 和 Wayland 上重新映射你的键盘,提高你的打字和导航速度,避免重复性压力伤害。

 title=

对我来说,有许多改变生活的 Linux 时刻,但大多数都在成为现状后淡忘了。有一个 Linux 教给我的键盘小技巧,每次我使用它的时候(也许每天有 1000 次),我都会想起这件事,那就是把大写锁定键转换为 Ctrl 键。

我从不使用大写锁定键,但我整天使用 Ctrl 键进行复制、粘贴、在 Emacs 内导航,以及 调用 BashGNU Screentmux 等操作。大写锁定键在我的键盘上占据了宝贵的空间,而将实际上有用的 Ctrl 键挤到了难以触及的底部角落。

 title=

这看起来就痛苦

重新映射 Ctrl 提高了我的打字和导航速度,并可能使我免受重复性压力伤害。

消失的控制

系好安全带,这是个过山车式的历史课。

对于像我这样的大写锁定键交换者来说,不幸的是,当 GNOME 3 问世时,它几乎删除了改变 Ctrl 键位置的功能。

幸运的是,优秀的 GNOME Tweaks 应用程序带回了这些 “失踪” 的控制面板。

不幸的是,GNOME 40 没有 GNOME Tweaks 应用程序(还没有?)

另外,不幸的是,过去在 X11 上可以工作的老的 xmodmap 技巧在新的 Wayland 显示服务器 上没有用。

有一小段时间(最多一个下午),我觉得对于那些讨厌大写锁定键的人来说人生都灰暗了。然后我想起我是一个开源的用户,总有一种方法可以解决诸如被忽略的 GUI 控制面板之类的简单问题。

dconf

GNOME 桌面使用 dconf,这是一个存储重要配置选项的数据库。它是 GSettings 的后端,GSettings 是 GNOME 系统应用程序需要发现系统偏好时的接口。你可以使用 gsetting 命令查询 dconf 数据库,也可以使用 dconf 命令直接设置 dconf 的键值。

GSettings

dconf 数据库不一定是你可能称为可发现的数据库。它是一个不起眼的数据库,你通常不需要去考虑它,它包含了许多通常无需直接交互的数据。然而,如果你想更好地了解 GNOME 所要管理的所有偏好选项,那么浏览它是很有趣的。

你可以用 list-schemas 子命令列出所有 dconf 的模式。在浏览了数百个模式之后,你可以使用 grep 将你的注意力缩小到一些看起来特别相关的东西上,比如 org.gnome.desktop

$ gsettings list-schemas | grep ^org.gnome.desktop
[...]
org.gnome.desktop.background
org.gnome.desktop.privacy
org.gnome.desktop.remote-desktop.vnc
org.gnome.desktop.interface
org.gnome.desktop.default-applications.terminal
org.gnome.desktop.session
org.gnome.desktop.thumbnailers
org.gnome.desktop.app-folders
org.gnome.desktop.notifications
org.gnome.desktop.sound
org.gnome.desktop.lockdown
org.gnome.desktop.default-applications.office

无论是通过手动搜索还是通过 阅读 GSetting 文档,你可能会注意到 org.gnome.desktop.input-sources 模式,它有助于定义键盘布局。从设计上来说,GSetting 模式包含了键和值。

用 dconf 重新映射大写字母锁

xkb-options 键包含了可选的键盘覆写。要设置这个键值,请使用dconf,将上面模式中的点(.)转换为斜线(/),因为 dconf 数据库需要使用 /

$ dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']"

我把 caps 设置为 ctrl_modifier,因为我使用 Ctrl 修饰键的次数多于其他修饰键,但 Vim 用户可能喜欢把它设置为 escape

查看你的设置

这个改变会立即生效,并在重启后仍然生效。这是你在 GNOME 中定义的首选项,在你改变它之前一直有效。

你可以通过 gsettings 查看 dconf 中的新值。首先,查看可用的键:

$ gsettings list-keys \
    org.gnome.desktop.input-sources
xkb-options
mru-sources
show-all-sources
current
per-window
sources

然后用 xkb-options 键名查看设置:

$ gsettings get \
    org.gnome.desktop.input-sources \
    xkb-options
['caps:ctrl_modifier']

选项丰富

我在我的 GNOME 3.4 系统上使用这个小技巧来设置大写锁定键以及 Compose 键(compose:ralt)。虽然我相信正在开发中的 GUI 控件可以控制这些选项,但我也不得不承认,能以编程方式设置这些选项的能力是我的荣幸。作为以前没有可靠方法来调整桌面设置的系统的管理员,能够用命令修改我的首选项使得设置新桌面变得快速而容易。

GSettings 提供了很多有用的选项,而且文档也很详尽。如果你有想要改变的东西,可以看看有什么可用的。


via: https://opensource.com/article/21/5/remap-caps-lock-key-linux

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

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

游戏、交易、预算、艺术、编程等等,这些都只是任何人都可以使用 Linux 的众多方式中的一种。

 title=

当我在度假时,我经常会去一家或者多家的二手书店。我经常能够找到我想读的一本好书,而且我总是以 “我在度假;我应该用这本书来犒劳自己” 来为不可避免的购买行为辩护。这很有效,我用这种方式获得了一些我最喜欢的书。但是,买一本好书在生活中很常见,这个理由经不起推敲。事实上,我不需要为买一本好书来找理由。事情都是这样的,我可以在任何时候做我想做的事。但不知何故,有一个理由似乎确实能让这个过程更有趣。

在我的日常生活中,我会收到很多关于 Linux 的问题。有时候我会不自觉地滔滔不绝地讲述开源软件的历史,或者共享资源的知识和利益。有时候,我会设法提到一些我喜欢的 Linux 上的特性,然后对这些好处进行逆向工程以便它们可以在其它的操作系统上享用。这些讨论经常是有趣且有益的,但只有一个问题:这些讨论都没有回答大家真正要问的问题。

当一个人问你关于 Linux 的问题时,他们经常希望你能够给他们一些使用 Linux 的理由。当然,也有例外。从来没有听过“Linux”的人们可能会问一些字面定义。但是当你的朋友或者同事吐露出他们对当前的操作系统有些不满意的时候,解释一下你为什么喜欢 Linux 可能更好,而不是告诉他们为什么 Linux 是一个比专有系统更好的选择。换句话说,你不需要销售演示,你需要的是度假照片(如果你是个书虫的话,也可以是度假时买的一本书)。

为了达到这个目的,下面是我喜欢 Linux 的 21 个原因,分别在 21 个不同的场合讲给 21 个不同的人。

游戏

 title=

说到玩电脑,最明显的活动之一就是玩游戏,说到玩游戏,我很喜欢。我很高兴花一个晚上玩一个 8 位的益智游戏或者 epic 工作室的一个 AAA 级游戏。其它时候,我还会沉浸在棋盘游戏或者角色扮演游戏(RPG)中。

这些我都是 在 Linux 系统的电脑上做的

办公

 title=

一种方法并不适合所有人。这对帽子和办公室工作来说都是如此。看到同事们被困在一个不适合他们的单一工作流程中,我感到很痛苦,我喜欢 Linux 鼓励用户找到他们喜欢的工具。我曾使用过的应用大到套件(例如 LibreOffice 和 OpenOffice),小到轻量级文字处理器(如 Abiword),再到最小的文本编辑器(利用 Pandoc 进行转换)。

不管我周围的用户被限制在什么范围内,我都可以 自由地使用可以在我的电脑上工作的最好的工具,并且以我希望的方式工作。

选择

 title=

开源最有价值的特性之一是用户在使用这些软件的时候是可以信任它的。这种信任来自于好友网络,他们可以阅读他们所使用的应用程序和操作系统的源代码。也就是说,即使你不知道源代码的好坏,你也可以在 开源社区 中结交一些知道的朋友。这些都是 Linux 用户在探索他们运行的发行版时建立的重要联系。如果你不信任构建和维护的发行版的社区,你可以去找其它的发行版。我们都是这样做的,这是有许多发行版可供选择的优势之一。

Linux 提供了可选择的特性。一个强大的社区,充满了真实的人际关系,结合 Linux 提供的选择自由,所有这些都让用户对他们运行的软件有信心。因为我读过一些源码,也因为我信任哪些维护我没读过的代码的人,所以我信任 Linux

预算

 title=

做预算并不有趣,但是很重要。我很早就认识到,在业余时间做一些不起眼的工作,就像我学会了一种 免费 的操作系统(Linux!)一样。预算不是为了追踪你的钱,而是为了追踪你的习惯。这意味着无论你是靠薪水生活,还是正在计划退休,你都应该 保持预算

如果你在美国,你甚至可以 用 Linux 来交税

艺术

 title=

不管你是画画还是做像素艺术、编辑视频 还是随性记录,你都可以在 Linux 上创建出色的内容。我所见过的一些最优秀的艺术作品都是使用一些非“行业标准”的工具随意创作出来的,并且你可能会惊讶于你所看到的许多内容都是基于同样的方式创造出来的。Linux 是一个不会被宣扬的引擎,但它是具有强大功能的引擎,驱动着独立艺术家和大型制作人。

尝试使用 Linux 来 创作一些艺术作品

编程

 title=

听着,用 Linux 来编程几乎是定论。仅次于服务器管理,开源和 Linux 是一个明显的组合。这其中有 许多原因,但我这里给出了一个有趣的原因。我在发明新东西时遇到了很多障碍,所以我最不希望的就是操作系统或者软件工具开发包(SDK)成为失败的原因。在 Linux 上,我可以访问一切,字面意义上的一切。

封包

 title=

当他们在谈编程的时候,没有人谈封包。作为一个开发者,你必须将你的代码提供给您的用户,否则你将没有任何用户。Linux 使得开发人员可以轻松地 发布应用程序,用户也可以轻松地 安装这些应用程序

令很多人感到惊讶的是 Linux 可以像运行本地程序一样运行许多 Windows 应用程序。你不应该期望一个 Windows 应用可以在 Linux 上执行。不过,许多主要的通用应用要么已经在 Linux 上原生存在,要么可以通过名为 Wine 的兼容层运行。

技术

 title=

如果你正在找一份 IT 工作,Linux 是很好的第一步。作为一个曾经为了更快地渲染视频而误入 Linux 的前艺术系学生,我说的是经验之谈。

尖端技术发生在 Linux 上。Linux 驱动着大部分的互联网、世界上最快的超级计算机以及云本身。现在,Linux 驱动着 边缘计算,将云数据中心的能力与分散的节点相结合,以实现快速响应。

不过,你不需要从最顶层开始。你可以学习在笔记本电脑或者台式机上自动完成任务,并通过一个 好的终端 远程控制系统。

Linux 对你的新想法是开放的,并且 可以进行定制

分享文件

 title=

无论你是一个新手系统管理员,还是仅仅是要将一个将文件分发给室友,Linux 都可以使 文件共享变得轻而易举

多媒体

 title=

在所有关于编程和服务器的讨论中,人们有时把 Linux 想象成一个充满绿色的 1 和 0 的黑屏。对于我们这些使用它的人来说,Linux 也能 播放你所有的媒体,这并不令人惊讶。

易于安装

 title=

以前从来没有安装过操作系统吗?Linux 非常简单。一步一步来,Linux 安装程序会手把手带你完成操作系统的安装,让你在一个小时内感觉到自己是个电脑专家。

来安装 Linux 吧!

试一试 Linux

 title=

如果你还没有准备好安装 Linux,你可以 试一试 Linux。不知道如何开始?它没有你想象的那么吓人。这里给了一些你 一开始需要考虑的事情。然后选择下载一个发行版,并想出你自己使用 Linux 的 21 个理由。


via: https://opensource.com/article/21/4/linux-reasons

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

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

在超级信息高速公路上绕行。

 title=

用传奇的 DNS 黑客 Dan Kaminsky 的话说,“事实证明,互联网对全球社会而言意义重大”。为了使互联网发挥作用,计算机必须能够在最复杂的网络万维网(WWW)中找到彼此。这是几十年前给政府工作人员和学术界 IT 人员提出的问题,而今天我们使用的正是他们的解决方案。然而,他们实际上并不是在寻求建立 互联网 the Internet ,他们是在为 互联网络(实际上是 级联网 catenets ,即“ 级联的网络 concatenated networks ”,但这个术语最终不再流行)定义规范,它是一个 互连的网络 interconnected networks 的通用术语。

根据这些规范,网络使用数字组合,作为每台在线计算机的一种家地址,并为每个网站分配一个人性化但高度结构化的“主机名”(如 example.com)。由于用户主要是通过网站 名称 与互联网互动,可以说互联网的运作只是因为我们都同意一个标准化的命名方案。如果有足够多的人决定使用不同的命名方案,互联网的工作方式 可能 会有所不同。一群用户可以形成一个平行的互联网,它使用相同的物理基础设施(电缆、卫星和其他传输方式,将数据从一个地方传送到另一个地方),但使用不同的方法将主机名与编号地址联系起来。

事实上,这已经存在了,这篇文章展示了你如何访问它。

了解名称服务器

术语“ 互联网 internet ”实际上是 互联 interconnected 网络 networks 这两个术语的组合,因为这正是它的本质。就像一个城市里的邻里、一个国家里的城市、或一个大陆里的国家,或一个星球里的大陆一样,互联网通过将数据从一个家庭或办公室网络传输到数据中心和服务器房或其他家庭或办公室网络而跨越了全球。这是一项艰巨的任务,但它并非没有先例。毕竟,电话公司很久以前就把世界连接起来了,在那之前,电报和邮政服务也是这样做的。

在电话或邮件系统中,有一份名单,无论是正式的还是非正式的,都将人名与实际地址联系起来。它过去以电话簿的形式传递到家里,该电话簿是社区内每个电话所有者的目录。邮局的运作方式不同:他们通常依靠寄信人知道预定收信人的姓名和地址,但邮政编码和城市名称被用来把信送到正确的邮局。无论哪种方式,都需要有一个标准的组织方案。

对于计算机来说,IP 协议 描述了必须如何设置互联网上的地址格式。域名服务器 (DNS) 协议 描述了如何将人性化名称分配给 IP 以及从 IP 解析。无论你使用的是 IPv4 还是 IPv6,其想法都是一样的:当一个节点(可能是一台计算机或通往另一个网络的网关)加入一个网络时,它被分配一个 IP 地址。

如果你愿意,你可以在 ICANN(一个帮助协调互联网上的网站名称的非营利组织)注册一个域名,并将该名称指向该 IP。没有要求你“拥有”该 IP 地址。任何人都可以将任何域名指向任何 IP 地址。唯一的限制是,一次只能有一个人拥有一个特定的域名,而且域名必须遵循公认的 DNS 命名方案。

域名及其相关 IP 地址的记录被输入到 DNS 中。当你在浏览器中导航到一个网站时,它会迅速查询 DNS 网络,以找到与你所输入(或从搜索引擎点击)的任何 URL 相关的 IP 地址。

一个不同的 DNS

为了避免在谁拥有哪个域名的问题上发生争论,大多数域名注册商对域名注册收取一定的费用。该费用通常是象征性的,有时甚至是 0 美元(例如,freenom.com 提供免费的 .tk.ml.gq.cf 域名,先到先得)。

在很长一段时间里,只有几个“顶级”域名,包括 .org.edu.com。现在有很多,包括 .club.biz.name.international 等等。本质上它们就是字母组合,但是,有很多潜在的顶级域名是无效的,如 .null。如果你试图导航到一个以 .null 结尾的网站,那么你不会成功。它不能注册,也不是域名服务器的有效条目,而且它根本就不存在。

OpenNIC项目 已经建立了一个备用的 DNS 网络,将域名解析为 IP 地址,但它包括目前互联网不使用的名字。可用的顶级域名包括:

  • .geek
  • .indy
  • .bbs
  • .gopher
  • .o
  • .libre
  • .oss
  • .dyn
  • .null

你可以在这些(以及更多的)顶级域名中注册一个域名,并在 OpenNIC 的 DNS 系统上注册,使它们映射到你选择的 IP 地址。

换句话说,一个网站可能存在于 OpenNIC 网络中,但对于不使用 OpenNIC 名称服务器的人来说,仍然无法访问。这绝不是一种安全措施,甚至不是一种混淆手段。这只是一种有意识的选择,在 超级信息高速公路上绕行

如何使用 OpenNIC 的 DNS 服务器

要访问 OpenNIC 网站,你必须配置你的计算机使用 OpenNIC 的 DNS 服务器。幸运的是,这并不是一个非此即彼的选择。通过使用一个 OpenNIC 的 DNS 服务器,你可以同时访问 OpenNIC 和标准网络。

要配置你的 Linux 电脑使用 OpenNIC 的 DNS 服务器,你可以使用 nmcli 命令,这是 Network Manager 的一个终端界面。在开始配置之前,请访问 opennic.org,寻找离你最近的 OpenNIC DNS 服务器。与标准 DNS 和 边缘计算 一样,服务器在地理上离你越近,你的浏览器查询时的延迟就越少。

下面是如何使用 OpenNIC:

1、首先,获得一个连接列表:

$ sudo nmcli connection
NAME                TYPE             DEVICE
Wired connection 1  802-3-ethernet   eth0
MyPersonalWifi      802-11-wireless  wlan0
ovpn-phx2-tcp       vpn              --

你的连接肯定与这个例子不同,但要关注第一栏。这提供了你的连接的可读名称。在这个例子中,我将配置我的以太网连接,但这个过程对无线连接是一样的。

2、现在你知道了需要修改的连接的名称,使用 nmcli 更新其 ipv4.dns 属性:

$ sudo nmcli con modify "Wired connection 1" ipv4.dns "134.195.4.2"

在这个例子中,134.195.4.2 是离我最近的服务器。

3、防止 Network Manager 使用你路由器设置的内容自动更新 /etc/resolv.conf

$ sudo nmcli con modify "Wired connection 1" ipv4.ignore-auto-dns yes

4、将你的网络连接关闭,然后再次启动,以实例化新的设置:

$ sudo nmcli con down "Wired connection 1"
$ sudo nmcli con up "Wired connection 1"

完成了。你现在正在使用 OpenNIC 的 DNS 服务器。

路由器上的 DNS

你可以通过对你的路由器做这样的修改,将你的整个网络设置为使用 OpenNIC。你将不必配置你的计算机的连接,因为路由器将自动提供正确的 DNS 服务器。我无法演示这个,因为路由器的接口因制造商而异。此外,一些互联网服务提供商 (ISP) 不允许你修改名称服务器的设置,所以这并不总是一种选择。

测试 OpenNIC

为了探索你所解锁的“其他”互联网,尝试在你的浏览器中导航到 grep.geek。如果你输入 http://grep.geek,那么你的浏览器就会带你到 OpenNIC 的搜索引擎。如果你只输入 grep.geek,那么你的浏览器会干扰你,把你带到你的默认搜索引擎(如 SearxYaCy),并在窗口的顶部提供一个导航到你首先请求的页面。

 title=

不管怎么说,你最终还是来到了 grep.geek,现在可以在网上搜索 OpenNIC 的版本了。

广阔天地

互联网旨在成为一个探索、发现和平等访问的地方。OpenNIC 利用现有的基础设施和技术帮助确保这些东西。它是一个可选择的互联网替代方案。如果这些想法吸引了你,那就试一试吧!


via: https://opensource.com/article/21/4/opennic-internet

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

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