Linux 终端基础提示和技巧(四)

原文:Basic Linux Terminal Tips and Tricks

协议:CC BY-NC-SA 4.0

十四、配置 Bash

在这一章中,我们将会看到 bash 的各种配置。这通常是通过使用 bash 启动时运行的配置脚本以及其他配置文件来完成的,这些配置文件控制已安装的实用程序或底层库,如.inputrc

配置脚本

我们将从用于直接定制bash的三个配置文件开始。这些包括.bashrc_profile.bashrc.profile

。bashrc_profile 或者。轮廓

.bashrc_profile配置脚本类似于.bashrc,但是它只在用户第一次登录时运行一次。在某些系统上,这个文件可能被指定为.profile,尽管如果.profile.bash_profile都存在,那么将使用.bash_profile

.bashrc_profile是定义.bashrc位置的入口点。这里有一个例子:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

前面的代码检查执行脚本的语言。如果语言是 bash,那么它会检查主文件夹中是否存在一个.bashrc文件。如果存在一个.bashrc文件,则执行该文件。

一个更简单的实现可能只包括以下内容,即如果.bashrc存在,则加载它:

test -r ~/.bashrc && . ~/.bashrc

虽然通常情况下.bashrc_profile只是加载.bashrc,但是也有可能将在.bashrc中完成的任何事情直接包含在.bashrc_profile中。

Note

的“.”在前面的. ~/.bashrc中是内置 bash 命令source的简写,它允许您将外部脚本加载到正在运行的脚本中。

.bashrc

~/.bashrc文件包含 bash 配置。它可用于定义在所有会话中都可用的变量或函数。每当您打开一个新的 bash 终端时,就会运行该脚本。

作为一个实验,试着打开你的.bashrc,它应该在~/.bashrc是可访问的。在文件的底部添加一行如下内容(尽管在文件的任何地方添加都可以):

export HELLO=world

接下来通过运行(或关闭终端并重新打开来重新加载~/.bashrc文件

source ~/.bashrc

现在,您应该能够在 bash 中使用变量$HELLO,并让它返回值“world”,例如,使用echo:

echo $HELLO

。bash_logout

虽然.profile脚本在登录时运行一次,但是.bash_logout正好相反。它只在您注销时运行一次。如果您想删除临时文件,这可能很有用。举个例子,我的 Ubuntu 系统上默认的.bash_logout包括以下内容:

# when leaving console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

前面的代码说明,如果退出的 shell 是基础层,并且文件/usr/bin/clear_console存在,那么运行带有-q标志的文件。

这里的$SHLVL 是一个自动存在的环境变量。要了解它是如何工作的,试试echo $SHLVL;这应该会返回值 1。那就试试

bash
echo $SHLVL

在 bash 中运行一个 bash 会话后,这个数字将是 2。如果您在那个会话中运行另一个 bash 会话,这个数字将变为 3。

Note

取决于您的发行版和用户,该文件可能存在,也可能不存在。比如我们发现使用 root 用户时,默认没有.bash_logout。当使用 Fedora 而不是 Ubuntu 时,我们发现该文件确实存在,但包含的代码不同。

全球版本

除了主目录中的.bashrc,如果你在基于 Debian 的系统上,你会在/etc/bash.bashrc有一个全局版本,在基于 Red Hat 的系统上,你会有/etc/bashrc。此外,你应该有一个充当全球版.profile/etc/profile。这些文件用于为所有用户设置 bash 的初始状态,在本地概要文件之前运行,.bashrc文件为每个用户运行。

在启动过程中,当/etc/profile运行时,还有一个文件夹执行几个名为/etc/profile.d/的脚本。如果你把一个可执行脚本放在这个目录中,只要它的扩展名是.sh,它就会在启动时运行。与普通的可执行文件不同,执行这些文件需要扩展名。

有用的配置。没有则创建

你可以用一个.bashrc文件做几件有用的事情。一些最常见的包括为常用任务创建别名,或者添加简单的函数以便在系统范围内访问。

定义别名

别名是一个短命令,它可以转换成一个更长的命令。这使得编写命令更加方便。例如,许多 Ubuntu 系统默认使用别名ll作为ls -alF的简称,它显示了当前目录的更详细视图。当我打开我的.bashrc时,我看到ll和一些默认的别名一起被定义:

alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

我在自己的机器上添加的一个是将vi别名化为vim。这允许我运行相同的命令,不管我是运行在一个有完整 Vim 的机器上还是只有vi。如果你在 Fedora 上,你会发现这个别名是默认存在的。

alias vi="vim"

本着同样的精神,你可能想升级diff来代替使用colordiff(注意colordiff可能不是默认安装的):

alias diff="colordiff"

自定义功能

在某些情况下,如果你想创建一个快捷方式,你会发现你需要创建一个短函数,而不是使用一个例子。人们喜欢做的一件事是创建一个函数,用mkdir创建一个文件夹,然后用cd立即移动到那个目录。让我们通过向.bashrc添加以下函数来创建一个命令:

mkcd() { mkdir -p "$1" && cd "$1"; }

保存后,关闭终端并重新打开,因为新终端打开时会运行.bashrc文件。或者,您可以运行source .bashrc来重新加载配置,而无需重启您的终端。现在,如果你运行mkcd hello,你将创建一个名为 hello 的文件夹,并立即移入其中。

在某些情况下,您可能只是想包装一个有些难以记忆的现有命令。例如,许多系统将amixer用于声音。可以用amixer改变音量;我们可以包装现有的命令,使它变得简单一些:

volume() { amixer sset 'Master' $1%; }

这允许您从终端传入 0 到 100 之间的任何值来设置音量。

添加到路径

.bashrc中的另一个常见变化是增加了$PATH变量。此变量跟踪系统中存储可执行文件的文件夹列表。当您在没有指定完整路径的情况下运行一个可执行文件时,例如nmap,系统会检查您路径中指定的所有文件夹。当找到匹配时,就使用它。

如果你在系统上安装了编程语言,它们通常会自动修改你的.bashrc文件,并将保存可执行文件的文件夹添加到你的路径中。通过这样做,他们使他们的所有模块对你可用,作为你的路径的一部分。下面是安装 Rust 编程语言时创建的一行代码的示例。

export PATH="$HOME/.cargo/bin:$PATH"

注意结尾的:$PATH。这指定我们使用旧的 P A T H ,并在前面加上出现在 ‘ : ‘ 之前的所有内容。在追加或前置现有的 PATH,并在前面加上出现在`:`之前的所有内容。在追加或前置现有的 PATH,并在前面加上出现在:之前的所有内容。在追加或前置现有的PATH 变量时,请始终使用该变量。否则,您可能会删除添加到其他文件或位置的文件夹。

更改 PS1 提示

.bashrc中另一个常见的定制是改变提示文本的颜色或内容。光标左侧显示的提示由环境变量 PS1 控制。如果您运行echo $PS1,您将在您的系统上看到一个编码版本。

可以通过更新 PS1 变量来改变,比如让我们把文本变成红色(为了实验,直接在终端运行而不是修改。bashrc):

export PS1="\e[0;31m[\u@\h \W]\$ \em "

运行前面的命令应该会导致提示符变成红色。接下来,尝试再次运行相同的命令,但增加 31,并观察每个数字如何产生不同的颜色。预期结果的示例如图 [14-1 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-1

更改 bash 提示文本的颜色

这段代码内容有点难以理解,因为它首先以一个根本看不到的转义字符\eo;开始。转义字符的存在导致窗口的标题栏包含工作目录,如图 [14-2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-2

标题栏中的文件路径由于\eo;在 PS1

之后我们需要31m[来设置颜色。这是一个 ANSI 转义序列,可追溯到 20 世纪 70 年代;它们被用作嵌入文本的一种方式,而文本应该被解释为命令而不是文本。在这条线的最末端,我们有\e[m来重置颜色;如果不包含,您在终端中键入的文本将与别名的颜色相同。不同 ANSI 颜色代码的列表如表 [14-1 所示。

表 14-1

颜色的 ANSI 转义序列

|

顺序

|

描述

|
| — | — |
| 3000 万 | 黑色 |
| 3100 万美元[ | 红色 |
| 3200 万美元[ | 格林(姓氏);绿色的 |
| 33m[ | 黄色 |
| 34m[ | 蓝色 |
| 3500 万美元[ | 品红 |
| 3600 万美元[ | 蓝绿色 |
| 3700 万[ | 白色的 |

\u翻译成用户名,\h代表主机名,\W代表工作目录的基址。如果我们需要最少的提示文本,我们可以用

export PS1="-> "

或者如果我们只需要工作目录库:

export PS1="\W -> "

这导致了一个更小的外观,只显示工作目录的基础。如果您喜欢显示完整工作目录的默认方式,而不仅仅是基本目录,您只需要用小写版本的\w替换\W。PS1 符号列表如表 [14-2 所示。

表 14-2

PS1 提示命令

|

性格;角色;字母

|

描述

|
| — | — |
| h | 主机名改为第一个。“ |
| H | 完整主机名 |
| s | Shell 名称,例如“bash” |
| t | 24 小时制的当前时间 |
| @ | 12 小时制的当前时间 |
| u | 用户名 |
| w | 工作目录的完整路径 |
| W | 当前文件夹名称 |

另一种修改提示颜色的方法是使用tput。这种方法实际上更加灵活,因为它允许您使用 256 种颜色。然而,你必须在你的终端上启用 256 色;要快速查看支持的数量,请运行

tput colors

如果你得到一个小于 256 的数字,你需要确保你已经启用了xterm-256color。您可以通过在您的.bashrc中添加下面一行来实现:

export TERM=xterm-256color

确保在更新后运行source ~/.bashrc

启用 256 种颜色后,您现在可以将tput setaf与 256 种颜色代码中的一种一起使用。您可以通过搜索“256 种颜色代码”找到完整的列表然而,我们实际上可以通过在 bash 中运行以下命令来创建一个包含所有颜色的列表:

for c in {0..255}
do
   :
   if ! (( $c % 16 )) ; then
     printf '\n'
   fi
   printf '\e48;5;%dm'"%5s" $c $c; printf '\e[0m'
done

该脚本将遍历从 0 到 255 的每个数字,并根据该代码用背景色打印该数字。运行它应该会产生如图 [14-3 所示的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-3

创建一个包含所有 256 种颜色代码的表格

我们将使用之前的最小 PS1,然后用一个tput命令设置颜色,另一个命令重置颜色:

export PS1="$(tput setaf 166)\W -> $(tput sgr0)"

在您的终端中直接进行试验后,如果您发现您想要永久保存的东西,只需将它添加到您的.bashrc文件的底部。然后,如果你决定你不想要它了,你可以删除有问题的线。

PS2、PS3 和 PS4

除了 PS1 环境变量,还有一个 PS2。要查看您的 PS2,请运行以下命令:

echo $PS2
echo "hi

在第二行,一定不要包括结束”。这将导致 PS2 提示符显示,表明您需要完成前一个命令。注意这两个符号是如何与图 14-4 中的相同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-4

将 PS2 与交互式 shell 文本提示进行比较

请注意,前面的两个命令显示相同的“>”。

除了 PS1 和 PS2,还有 PS3 和 PS4,但它们并不常用。当 bash 中使用 select 提示符时,会使用 PS3,例如:

PS3=">"
select i in red blue green exit
do
  case $i in
    red) echo "Red";;
    blue) echo "Blue";;
    green) echo "Green";;
    exit) exit;;
  esac
done

运行时,我们会看到一个使用 PS3 值的选择菜单,旁边会提示用户输入文本,如图 14-5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-5

使用select的脚本中的 PS3 示例

如果 PS3 没有指定值,缺省值将是#?。

最后,PS4 专用于调试带有-x标志的 bash。此标志用于调试;如果我们让用户选择一种颜色并把它放在一个文件中,我们可以用-x标志运行它:

bash -x ./choice.sh

当我们这样做时,我们会看到运行时显示的行,左边是 PS4 的值,在本例中是一个“+”号。示例见图 14-6 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-6

-x标志用于调试模式时的 PS4 示例

主题

您可以手动检查和更改视觉显示的所有方面,或者安装一个社区项目,使预先创建的终端颜色主题可用。

一些受欢迎的项目包括“Bash-it”和“哦,我的 Bash”;然而,这两个项目都捆绑了大量的功能和配置。其他项目,如高,更少,只提供主题。

这些都需要运行外部 bash 脚本,所以请确保做自己的研究,以检查这些项目在阅读时仍然处于良好状态。也值得自己浏览一些脚本,并检查公共问题跟踪器,以确保项目在试验之前仍然处于良好状态。这可以通过查看项目的最后一次提交或发布来完成。你也可以在一个项目的 GitHub 页面的 issues 选项卡上查看用户最近的反馈。

终端中的实时时钟

另一个巧妙的技巧是添加一个实时时钟,它展示了增加终端趣味的多种可能性。这可以通过运行下面的代码片段来实现(或者将它放在您的.bashrc中使之永久化):

while sleep 1;
do
  tput sc;
  tput cup 0 $(($(tput cols)-11));
  echo -e "\e31m`date +%r`\e[39m";
  tput rc;
done &

这会创建一个每秒运行一次的循环。它获取你的终端的宽度,并将光标移动到右上角的左边 11 个空格。然后用date输出当前时间,最后用tput rc将光标返回正常位置。图 [14-7 显示了一个实时时钟效果的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-7

终端右上角的实时时钟

或者,如果我们不介意时间只在每个命令后更新,我们可以将时间放在提示文本中。为此,您可以使用我们之前使用的一个命令来更新提示颜色,并添加指定当前时间的\t,例如:

export PS1="\e0;32m\t \W \$ \e[m "

运行前面的命令后,您将在提示文本中看到时间。如果您想使用 12 小时制,将t切换到T:

export PS1="\e[0;32m\T \W \$ \e[m "

或者,您可以使用@字符来表示带有 AM/PM 指示器的完整 12 小时格式:

export PS1="\e[0;32m\@ \W \$ \e[m "

三种提示时间格式的示例如图 [14-8 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-8

bash 提示文本中的时间格式

在打开时运行程序

有时人们会在终端上运行程序,开始使用.bashrc来增加美感。这可以包括像fortune这样的事情,或者回显一个包含一些 TODO 项的文本文件。

另一个需要运行的常用命令是neofetch命令。这不是默认安装的,但是可以在大多数包管理器中找到。这是一个高度可定制的系统信息脚本。这是一种在截图中与世界分享他们选择的设置的方式,同时展示他们选择的终端主题。图 14-9 显示了我的机器上 Neofetch 的输出示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14-9

Neofetch 的输出

图 14-9 是在我的机器上运行neofetch的一个例子。

在 terminal open 上运行这个命令或任何命令就像在您的.bashrc底部添加一行命令一样简单。当打开一个新的 bash 终端时,您从.bashrc运行的任何程序都将运行。

Note

程序screenfetch提供了一个类似于neofetch的替代方案,只是对徽标的渲染略有不同。它也可能比neofetch略快。

导入文件

如果您的.bashrc文件变得很大,您可能希望将其分成多个文件。这允许你共享和重用部件,而不必处理一个长文件。例如,您可能希望将所有别名分离到一个名为.bash_aliases的文件中。只需将别名行移动到一个新文件中,并使用source导入新文件:

source ~/.bash_aliases

放置在.bashrc中的前一段代码将导致.bash_aliases在每次打开新终端时被加载和运行。

。inputrc(输入 rc)

我们在前面的章节中提到过.inputrc是一种将 bash ( 和其他几个程序)键盘快捷键改为基于 Vim 的快捷键,而不是默认的类似 Emacs 的快捷键。

.inputrc文件影响所有使用 GNU readline 库的程序,该库包括几个流行的程序,包括 bash 以及 Ruby、Python 和 MySQL 等编程语言的 REPLs。

如前所述,.inputrc中的一个选项是通过添加行来切换到 Vim 键盘快捷键

set editing-mode vi
set keymap vi

通过打开全局文件/etc/inputrc,我们可以看到.inputrc的所有默认值,该文件为所有用户提供了初始值。这个文件可能包含一些配置以及解释这些配置的注释。

一个可能的修改是当你双击 tab 激活自动完成时关闭声音输出。您可能没有注意到,在许多系统中,当您按 tab 激活自动完成时,会发出声音。这可以通过添加以下内容来关闭

set bell-style none

另一个可能但很少使用的选项是使自动完成不区分大小写,这样,如果您用大写或不大写来写文件夹的名称,它将完成,而不管匹配的文件夹使用什么大小写。

set completion-ignore-case On

你可能已经注意到你经常需要点击 tab 键两次来显示所有的完成。如果您希望立即看到所有可能的完成,您可以添加以下行:

set show-all-if-unmodified On

有时按 tab 会导致文件部分完成,但这时你会碰到有两种或更多可能的方式来完成文件名的地方。通常情况下,它会补全到差值,然后您必须再次按 tab 来查看可能的补全。如果你想让它自动完成所有可能的事情,并在一个结局中显示所有结局,请启用show-all-if-ambiguous:

set show-all-if-ambiguous On

当您运行类似于ls的命令时,您可能会收到颜色编码的结果,这取决于您的系统。如果您也想为自动完成启用此功能,您可以添加以下行:

set colored-stats On

如果您想用一个可视符号来指示文件类型,类似于运行ls -F时显示的类型,您可以添加一行

set visible-stats On

虽然修改.inputrc并不常见,但它确实提供了一些不同的选项,这些选项在其他地方是做不到的。

除了改变通知声音和在 Vim 和 Emacs 风格的键盘快捷键之间切换,你可能永远不需要修改你的.inputrc,尽管也可以修改键盘快捷键的功能或者添加新的快捷键。要获得.inputrc所有可能选项的完整列表,运行

man 3 readline

其他点文件

术语点文件是指以点开头的隐藏文件,用于配置程序。虽然.bashrc是最受欢迎的网络文件之一,但它远不是唯一的。安装的默认程序和附加程序都有各种类型的点文件。可用于定制程序的一些其他示例包括

  • 。wgetrc

  • . curlrc

  • .gitconfig

  • -vim 的

  • . tmux.conf 文件

摘要

在这一章中,我们看了.bashrc.inputrc,这两个点文件可以用来定制 bash 终端。我们看到了一些常见的修改,比如添加路径、定义函数和创建别名。我们还查看了一些不常用的配置文件,如.bash_logout和配置选项,如终端提示符和颜色。

十五、Tmux 工作流

在这一章中,我们将学习 Tmux,终端多路复用器的缩写——一个主要用于管理后台进程的实用程序,但也有许多其他用途。除了保持进程运行之外,Tmux 还可以用于将终端划分成更小的屏幕,创建一个定制的布局,可以同时监视几个窗格。

后台脚本

Tmux 是我最常用的程序之一。它主要用于管理正在运行的 shell 脚本、ssh 会话和任何类型的 bash shell 进程。在过去的几年中,Tmux 变得如此流行,以至于它被预装在一些 Linux 发行版中,比如最新的 Ubuntu Desktop。

如果您的机器上没有安装 Tmux,应该可以通过您的软件包管理器获得:

sudo apt-get install tmux

一旦您开始使用基于终端的应用和进程,您会很快发现您可能想要运行一个进程并保持它运行,而不必在您的用户界面上保持一个专用的终端窗口打开。传统上,这可以通过内置命令的组合来完成。

为了演示,让我们创建一个持续的进程,每 3 秒钟用当前时间更新一个文件:

(while sleep 3; do date > /tmp/time; done)

当前面的命令在活动终端中运行时,按ctrl+z暂停该过程。那就跑

bg

运行bg将再次启动该进程,但是在后台。但是,该进程仍将与终端会话相关联。接下来,让我们获取当前终端会话中运行的作业列表。

jobs

您将获得当前终端中运行的作业列表,每个作业都有一个相关的编号。通过运行以下命令,您可以使用作业号取消它与终端会话的关联:

disown %1

您需要将 1 替换为与您想要脱离的进程相关联的数字。一旦运行了该命令,您就可以安全地关闭终端窗口,该过程将继续运行。您可以通过进入/tmp文件夹并确保time文件每 3 秒更新一次来确认这一点。

使用 Tmux 的后台脚本

手动方法的问题是没有简单的方法来重新附加一个被放弃的进程或程序。相反,建议您使用 Tmux 来管理和切换虚拟终端窗口。要创建新的终端会话,只需运行

tmux

您应该在页面底部看到一个绿色的小条,表示您的窗口是一个 Tmux 会话。现在,作为一个示例程序,运行以下内容:

top

您现在应该看到top正在运行并列出您机器上所有正在运行的进程。现在,我们将从 Tmux 会话中分离出来,并保持窗口在操作系统的后台运行,这样我们以后就可以轻松地重新挂接了。为此,请按 ctrl+b(同时)然后按 d。

Note

这里不要同时按下d按钮,这一点很重要。对于所有 Tmux 命令,首先按下ctrl+b,然后释放,再按下命令专用键。

现在,您将回到默认的终端窗口,该窗口可以关闭,而不会影响在后台运行的 Tmux 会话。

如果您想查看计算机上运行的所有 Tmux 会话,请运行

tmux ls

这将返回 Tmux 会话及其相关 id 的列表。要重新连接到其中一个会话,请运行以下命令(用要连接的会话 ID 替换 1):

tmux a -t 0

这在多种情况下非常有用,包括但不限于

  • 您希望同时连接到多个服务器或物联网设备,以运行可能需要一些时间才能完成的命令。

  • 您希望将命令放在后台,但保留返回调试的能力。

  • 您正在使用基于终端的编辑器,比如 Vim,并且想要在多个文件之间切换而不关闭它们。

带 SSH 的 Tmux

您希望使用 Tmux 的最有用的情况之一是通过 SSH 使用远程服务器或设备。通常,当连接到服务器时,您需要执行长时间运行的任务。由于无法方便地后台处理和重新连接会话,一些人求助于让 SSH 会话在他们的桌面上运行,等待作业完成。

这不仅通过强制用户在命令期间保持计算机打开来限制用户,还引入了连接中断的风险。当一个正常的 SSH 会话中断时,通常运行的脚本会被终止;因此,重新连接后,您需要从头开始。

Tmux 让您可以自由地启动一个命令,断开与会话的连接,然后关闭 SSH。当您返回服务器并连接到会话时,就好像您从未离开过一样。如果您正处于 Tmux 会话中,并且您的 SSH 连接中断了,不必担心,因为它将继续运行,并且在您重新连接时可用。

这使得 Tmux 不仅是长时间运行的命令的理想选择,也是您想要永久运行的脚本(如 web 服务器或脚本)的理想选择。在出错的情况下,通过名称连接到有问题的会话、查看程序输出中的错误、进行必要的更改并重新启动脚本变得很容易。

命名会话

当我们创建第一个 Tmux 会话时,我们看到它被自动命名为0,我们使用tmux a -t 0重新连接。当创建一个新的会话时,也可以给这个会话起一个昵称来帮助你了解它正在运行什么。让我们创建一个名为“top”的会话:

tmux new -s top

现在,如果我们从会话中分离并使用tmux ls,我们将在之前看到“0”的地方“置顶”。如果您已经创建了一个会话,并且想要更改名称,您可以运行

tmux rename-session -t top new-name

只需切换出“top”作为目标会话的名称,切换出“new-name”作为您想要的新名称。

切换 Tmux 会话

高度可定制,有许多快捷的键盘快捷键。大部分键盘快捷键会使用 ctrl+b 后跟一个字母。我最常用的键盘快捷键之一是 ctrl+b 后跟 s。在这种情况下,s代表 switch,允许您在打开的 Tmux 会话之间快速切换,而无需分离。

例如,假设您打开了几个 ssh 会话,并希望在等待进程完成时从一个会话切换到另一个会话。只需运行ctrl+b s,并使用向下箭头选择您想要打开的会话。然后在另一个会话中运行您想要的任何命令,并再次快速按下ctrl+b s切换回来。

杀死会话

有几种方法可以终止现有会话。如果您已经主动连接到会话,只需按下ctrl+d按钮,会话就会像普通终端一样关闭。

或者,您可以用kill-session命令终止一个没有连接的会话。与附加和重命名一样,您将使用-t标志提供有问题的终端的名称:

​​tmux​​ ​​kill-session​​ ​​-t​​ new-name

前面的命令将终止名为“new-name”的会话。也可以通过关闭整个服务器来一次关闭所有会话。为此,运行

​​tmux​​ kill-server

使用该命令时要小心,因为它会在没有警告的情况下立即停止您在 Tmux 会话中运行的任何脚本。

会话中的窗口

可以在一个 Tmux 会话中创建多个窗口,每个窗口运行自己的 bash 会话。在我们讨论创建窗口和在窗口之间导航之前,我们应该澄清 Tmux 中存在的三个层次以及 Tmux 窗口的技术定义,因为它与我们通常认为的窗口略有不同。Tmux 上终端会话的层次结构如表 15-1 所述。

表 15-1

Tmux 层级

|

学期

|

描述

|
| — | — |
| 会议 | 一组窗口。是 Tmux 中层次结构的最高级别 |
| 窗户 | Tmux 会话中包含的 bash 会话。一个会话可以包含多个窗口 |
| 窗格 | 窗格包含在窗口中。一个窗口可以分成多个窗格,这样就可以同时查看多个窗格 |

当我们创建一个 Tmux 会话时,默认情况下它自动有一个单独的窗口。要创建第二个窗口,请确保您在 tmux 会话中,然后运行ctrl+bc。这将使你进入一个新的窗口。

窗口通常被比作选项卡,因为它们是可以在会话中轻松切换的工作区。此外,在屏幕的左下角,显示了会话中的所有窗口,活动窗口的末尾有一个“*”。图 15-1 显示了指示运行 Tmux 窗口的文本示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-1

Tmux 状态栏中的窗口列表

要更好地查看窗口与我们的会话的关系,请按下ctrl+b,然后按下w。这将打开所有会话和窗口的列表;这是在两者之间转换的简单方法。Tmux 会话列表的示例如图 15-2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-2

Tmux 中活动会话和窗口的列表

注意这两个窗口是如何作为标签为0的会话的子窗口列出的。您可以按上下箭头键在窗口之间移动,并按 enter 键聚焦于一个窗口。为了强调窗口是会话的孩子,让我们通过按下ctrl+b然后按下d来完全脱离 Tmux。

接下来通过运行tmux创建一个新的会话,当会话打开时,创建一个新的窗口,在ctrl+b后面跟着c。现在,如果我们再次按下ctrl+b,然后按下w,我们将看到类似图 15-3 所示的会话列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-3

两个会话,每个会话有两个子窗口

我们有两个会话,每个会话都有两个子窗口。让我们进入标有“(4)”的第三个窗口。现在,如果我们想从这里回到“(5)”,我们可以重新打开窗口列表,但一个更短的方法实际上是前面的ctrl+b后面跟着p。要再次返回“(4)”,您可以按下ctrl+b,然后按下n进入下一步。或者,如果我们想指定具体的窗口,我们可以用窗口号代替pn

这对于根据窗口的用途对会话中的窗口进行排序非常有用,例如,将 SSH 会话的所有窗口都放在一个会话中。

窗格分割

Tmux 还提供了一个强大的辅助功能,允许您将一个窗口分割成单独的部分,称为窗格,每个窗格运行自己的 bash 实例。当需要同时运行多个终端应用或监视多个全屏终端应用时,这非常有用。

要开始,首先确保您打开了一个 Tmux 会话,然后按下ctrl+b,再按下"。这将水平分割你的窗口。图 15-4 显示了一个窗口水平分割的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-4

分成两个窗格的 Tmux 窗口

或者,如果您想水平分割会话,请按下ctrl+b,然后按下%。图 15-5 显示了一个垂直分割窗口的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-5

Tmux 中的垂直分割窗口

也可以拆分一个已经拆分的子部分,以便为每个会话创建尽可能多的窗口。为此,只需再次运行水平或垂直分割命令。参见图 15-6 中一个窗口分成三个 bash 终端的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-6

Tmux 中垂直和水平窗格的组合

如果您决定从 Tmux 分离或在窗口和会话之间切换,您的 pane 设置将被保存。

您可以通过按下ctrl+b然后按任意箭头键在窗格之间切换。或者,ctrl+b后跟o将切换到下一个窗格,一旦到达最后一个窗格,循环回到第一个窗格。

时钟模式

如果你使用窗口分割来分割你的工作空间,你可能最终想要在一个窗口中显示一个实时时钟。Tmux 提供了一个小的额外功能来简化这个过程。当 Tmux 会话在窗口中激活时,按下ctrl+b,然后按下t。时钟模式显示的示例如图 15-7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-7

单一窗格中的 Tmux 时钟模式

这将使用您的系统时间打开一个实时时钟。要退出时钟模式,请按qesc

帮助页面

Tmux 还带有一个内置的帮助页面,其中包含一个包含每个键盘快捷键的列表;有几个,所以它是多页长。要激活它,请按

ctrl+b, ?

你应该得到一个如图 15-8 所示的可滚动页面;可以用escq退出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-8

Tmux 帮助页

使用. tmux.conf 进行自定义

可以定制 Tmux 来改变用于触发动作的组合键,以及修改外观和布局。Tmux 的所有定制都是通过编辑~/ .tmux.conf完成的;如果您的系统中不存在该文件,只需创建它,tmux 就会使用它。该配置文件可用于创建新的键盘快捷键,以及更改 tmux 的视觉外观。

Tmux 首先在/etc/tmux.conf中查找适用于所有用户的全局配置,然后在主目录中查找文件.tmux.conf。因此,如果你想在多个用户之间应用设置,你可以使用全局版本。如果你没有一个~/.tmux.conf文件,那么从创建一个开始。

touch ~/.tmux.conf

配置颜色和样式

类似于在.bashrc中改变颜色,我们只能使用尽可能多的颜色。要检查终端上启用了什么颜色,请运行

​​tput​​ ​​colors

如果您得到一个小于 256 的数字,您将希望通过在您的.bashrc文件中添加以下内容来启用 256:

export TERM=xterm-256color

可用的 256 种颜色与上一章相同。除了直接使用色标,我们还有常用颜色的关键字,包括黑色蓝色青色绿色洋红色红色白色黄色

例如,如果我们想让终端底部的 Tmux 条变成蓝色,我们可以在.tmux.conf中添加以下内容:

set-option -g status-bg blue

这将改变背景颜色为蓝色。如果我们想改变 Tmux 条的文本,我们可以添加

set-option -g status-fg white

这将产生一个类似图 15-9 的底部条。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-9

带有修改颜色的 Tmux 状态栏

Note

当更新 tmux 的颜色和样式时,你需要确保在新的样式生效之前所有的 tmux 窗口都已经被终止。如果在后台只打开了一个 tmux 窗口,改变样式,然后打开一个新窗口,旧的值仍然有效。

如果我们想直接使用 256 种颜色代码中的一种,我们可以使用color后跟颜色代码,如下所示:

set-option -g status-bg color14

我们还可以改变打开的窗口的颜色,让它显示不同于状态栏其他部分的颜色。

set-option -g window-status-bg blue
set-option -g window-status-fg black

当您将活动窗口名称设置为不同的颜色时,这将变得更加有用:

set-option -g window-status-current-bg white

这创造了窗口真的像标签的感觉,当你在窗口之间切换时,你得到一些视觉反馈。启用该样式的状态栏示例如图 15-10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-10

Tmux 状态栏中的当前窗口高亮显示

除了状态栏,您还可以更改窗格边框的颜色。

set-option -g pane-border-bg green
set-option -g pane-border-fg yellow

与 windows 一样,窗格有一个单独的选择器。

set-option -g pane-active-border-bg blue
set-option -g pane-active-border-fg yellow

图 15-11 显示了一个应用这些风格的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-11

修改了 Tmux 中的窗格边框颜色

更改状态栏内容

类似于 bash 中的文本提示可以被改变,Tmux 状态栏中的文本也可以被改变。左侧和右侧由两个不同的变量控制。作为一个例子,让我们使用一些简单的静态文本来更新左右两边。与上一节一样,以下几行可以添加到.tmux.conf文件中:

set -g status-left "Hello"
set -g status-right "World"

这将替换默认的左右状态栏文本,如图 15-12 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-12

在 Tmux 中修改状态栏文本

当然,在大多数情况下,您需要一些交互方面的信息,比如时间、主机名和打开的窗口数量。像.bashrc一样,为这些元素保留特殊代码。状态栏中可使用的代码列表如表 15-2 所示。

表 15-2

状态栏代码

|

密码

|

描述

|
| — | — |
| #我 | 当前窗口的索引 |
| #P | 当前窗格的索引 |
| #S | 会话名称 |
| #T | 当前窗口的标题 |
| ## | 用于文字# |
| #H | 主机名直到第一个 |
| #h | 完整主机名 |
| #(命令) | 运行命令并显示输出的第一行 |
| #[属性] | 通过换行修改文本的颜色或属性 |

因此,如果我们希望主机名后面跟着当前窗口的索引,例如,运行

set -g status-left "#h #I"

如果文本由于空间限制而被截断,您可以使用

set -g status-left-length 200

属性标签可以与其他代码和文本结合使用,以更改文本的颜色,例如:

set -g status-left "#[bg=red, fg=white]#h #I"

重新映射命令

如果你发现你经常使用的组合键不舒服,你可以修改它。例如,在切换到 tmux 之前使用 GNU Screen 的人经常发现自己想要使用ctrl+a来代替 Tmux 键盘快捷键之前使用的前缀ctrl+b。要将前缀命令绑定到ctrl+a,应该在配置文件中添加下面一行:

set -g prefix C-a

这将导致ctrl+a被用作命令的前缀,如分离、创建新窗口等。默认情况下,您的ctrl+b也将仍然连接到前缀命令。如果您想从命令中分离一个组合,您必须手动执行另一个步骤。

unbind C-b

如果您在编辑.tmux.conf文件时运行 tmux,您必须手动获取配置才能使其生效。

tmux source-file ~/.tmux.conf

如果您正在使用 Vim,您可能希望添加按键绑定,以便能够使用 h、j、k 和 l 进行导航,每一个都映射到类似于 Vim 中使用的方向。

# Vim Movement
bind h select-pane -L # left
bind j select-pane -D # down
bind k select-pane -U # up
bind l select-pane -R # right

这将允许您使用ctrl+b后接h来切换到您左侧的窗格以及其他键的相关方向。

使用 Tmux 共享屏幕

Tmux 使之成为可能的另一个有趣的用例是屏幕共享终端窗口。如果有两个人使用同一个用户登录到一个服务器或设备,他们都可以完全访问该用户的所有 Tmux 会话。这包括使两个人同时连接到同一个 Tmux 会话的能力,并且当任何一个人与终端交互时,两个人都可以看到实时更新。

这是进行结对编程或与他人一起调试系统的好方法。与其他屏幕共享方法不同,SSH 上的 Tmux 几乎不占用任何带宽,并且它为两个用户提供了交互的能力,而不是简单地让一个人看另一个人。

主题公园

与样式化.bashrc一样,有些项目专门研究 Tmux 的定制和主题化。其中最受欢迎的是“哦,我的 Tmux ”,它除了提供一个令人愉快的主题外,还增加了一些额外的功能,如电池指示器。图 15-13 显示了“哦,我的 Tmux”的默认样式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-13

哦,我的主题

“哦,我的 Tmux”增加的另一项功能是键盘指示器,它指示前缀ctrl+b何时被按下,Tmux 何时等待命令键。该键盘符号如图 15-14 所示;显示时,表示前缀已被按下,Tmux 正在等待 command 键。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-14

哦,我的 Tmux 前缀按下状态栏中的指标

要安装 Oh My Tmux,只需克隆项目并将.tmux.conf.tmux.conf.local移动到您的主文件夹。如果你想保存任何东西,一定要备份你原来的.tmux.conf

git clone https://github.com/gpakosz/.tmux
cd .tmux
cp .tmux.conf* ~

那么您所要做的就是打开和/或重启 Tmux。

除了样式的改变,你还会有一些额外的按键绑定,比如我们手动配置的 Vim 按键绑定——额外的绑定用于创建带有ctrl+b后跟-的水平窗格或者带有_的垂直窗格的窗口。

以及对ctrl+b的新绑定,后跟+以将窗口内的窗格移动到使用全屏仅显示该窗格的新窗口。有关特性和绑定的完整列表,请参见 Oh My Tmux GitHub 上附带的自述文件。

Tmuxinator

当您开始使用 Tmux 并通过将窗口分割成窗格来创建自定义工作空间时,您可能会发现您有一些想要经常创建的设置。例如,假设我们想要运行一个被分成systemctlhtopnmon的窗口,如图 15-15 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15-15

Tmux 中的系统监控工作区

Tmuxinator 是一个 Tmux 启动器,它允许你创建预定义的布局,这样你就可以轻松地打开特定的工作空间,而不需要在每次打开时手动操作。你需要安装 Ruby 编程语言来使用 Tmuxinator。

sudo apt-get install ruby
gem install tmuxinator

Tmuxinator 还需要设置环境变量EDITOR;如果你运行echo $EDITOR并且它是空的,你需要在你的.bashrc文件中设置它。将该值替换为您首选的编辑器:

export EDITOR="vim"

安装了 Tmuxinator 之后,您可以通过运行

tmuxinator new system-monitor

将在您选择的编辑器中打开一个 YAML 文件的模板,包括帮助您使用语法的注释。打开一个有三个窗格的窗口的布局示例如下(它使用了htopnmon,因此您需要确保它们已安装或使用其他程序):

name: system-monitor
root: ~/

windows:
  - monitor:
      layout: main-vertical
      panes:
        - systemctl
        - htop
        - nmon
  - editor: vim

Note

当您在 Tmuxinator 中创建新的布局时,请确保删除所有默认情况下存在的样板代码。样板文件中许多注释的下面是一个示例布局,如果不删除或编辑,它将覆盖您的代码。

前面的示例创建了一个名为“monitor”的窗口,其中包含三个列出了程序的窗格,以及第二个运行 Vim 的窗口。Tmuxinator 还提供了其他的配置变量,比如root定义了窗口或窗格从哪个目录开始,或者 attach 指定了会话是否应该在创建时打开。

有关功能和选项的完整列表,请参见 Tmuxinator GitHub 页面上的自述文件。

摘要

在这一章中,我们研究了在本地和远程处理长时间运行的终端会话时,Tmux 如何改进您的工作流程。除了基础知识之外,我们还看到了 Tmux 如何允许在多个 bash 会话之间分割屏幕,从而为任何目的定制布局。我们使用 tmuxinator 进一步自动化了布局的创建,它允许将布局保存为 YAML 配置文件,并在一个命令中快速打开。

我们还看到 Tmux 有一个类似于 bash 配置文件的配置文件~/.tmux.conf,在这里我们可以覆盖任何键绑定并改变 Tmux 的颜色和样式。使用这里描述的技术中的一小部分,就可以显著地改进您的终端工作流程。

十六、用于处理图像和视频的终端工具

虽然命令行主要是基于文本的,但令人惊讶的是,有一些很棒的工具可以处理图像和视频,这些工具可以与它们的 GUI 对等物相媲美,或者在某些情况下是它们的基础。例如,如果您使用过任何类型的修改或生成图像的网站,它很可能在后端使用 ImageMagick。同样,如果你使用过任何基于 Linux 的视频编辑器,很有可能它是建立在ffmpeg之上的。

考虑到这些基于视觉的程序中有许多只是简单地调用命令行的等价物,您可以通过学习使用命令行版本来完成简单的任务,如修改图像或视频,从而节省一些时间。我们还将看看一些不常用的程序,如 gnuplot,以及如何修改启动时显示的动画。

简介

操纵图像的最强大的工具之一实际上是命令行固有的。ImageMagick 不仅广泛用于命令行,还用于使用 PHP、Python 和 Node.js 等语言的服务器端代码。这些语言本质上只是为功能丰富的命令行实用程序提供了一个包装器。

使用 ImageMagick 可以做的一些事情包括

  • 转换图像

  • 绘制形状

  • 绘制文本并对其进行操作

  • 描绘一幅图像

  • 使图像变形

  • 裁剪图像

  • 图像过滤器

创建带文本的图像

若要开始,请确保安装了 ImageMagick。它可以在大多数包存储库中找到。与许多程序不同,它不是用安装时的名字来调用的。相反,ImageMagick 使其他命令如convert可用。首先,让我们创建一个大小为 400 x 400 像素的空白画布:

convert -size 400x400 xc:white white.png

你现在应该有一个 400 x 400 像素的空白白色图像。

接下来,让我们添加一些文本到我们的图像:

convert white.png -gravity North \
  -pointsize 30 -annotate +0+100 \
  'Basic Linux Terminal' white.png

这里使用的-gravity North选项告诉 ImageMagick 将文本放在图像的顶部;或者,我们可以用南、西或东。让我们使用South在图像底部创建另一段文本;这个上面写着“提示和技巧”:

convert white.png -gravity South \
  -pointsize 30 -annotate +0+100 \
  'Tips and Tricks' white.png

然后pointsize指定字体大小,接着annotate增加文本周围的空间,这样它就不会紧靠图像顶部。

检查文本是否按预期呈现后,尝试旋转文本:

convert white.png  -distort ScaleRotateTranslate 30 white.png

你现在应该有一个类似图 16-1 的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-1

ImageMagick 生成的图像

为了让前面的预览更容易看到,我实际上添加了一个 3 像素的黑色边框,这样更容易看到它的开始和结束。这可以通过命令来完成

convert -bordercolor Black -border 3x3 white.png white.png

获取图像信息

在本书的前面,我们看到我们可以使用file命令来获取文件类型的信息。然而,当谈到图像时,实际上有更多的元数据您可能想看。ImageMagick 提供了另一个名为identify的工具来检查图像细节。最简单的用法是用一个文件作为输入来运行它:

identify white.png

这将返回图像的基本信息,包括类型、尺寸、色谱和大小。您可以通过添加-verbose标志获得更详细的信息;参见图 16-2 获取identify -verbose命令的输出示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-2

使用 ImageMagick identify命令的图像数据

您可能会发现-verbose标志实际上返回了太多的数据。如果您想要挑选要显示的特定属性,您可以直接指定它们,例如:

identify -format '%f - %m - %w \n' white.png

前面的示例指定文件名、文件类型和宽度,后跟一个换行符。您可以在 https://imagemagick.org/script/escape.php 找到完整的字母列表及其代表的属性。

给图像加标签

您可能想要执行的另一个常见任务是给照片添加一个小标签;当你计划在网上展示图片,并希望人们知道你是图片的原始来源时,如果图片被保存并在其他地方展示,这将非常方便。

要做到这一点,我们可以简单地使用内置的composite label,它将在我们的照片的左上方添加一些文本,只需一步:

composite label:'github.com/kirkins' white.png labeled.png

结果将看起来像输入图像,在左上角添加了我们的小而持久的标签,如图 16-3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-3

使用 ImageMagick 向图像添加标签

ffmpeg

这类似于 ImageMagick,但用于视频而不是静态图像。ffmpeg可用于各种常见的视频编辑任务,在包括 Audacity 和 VLC media player 在内的许多流行的视频和音频编辑 GUI 软件套件的代码中实际使用了它。

您可以使用 ffmpeg 做的一些事情包括

  • 转换视频文件类型

  • 压缩视频

  • 加快/减慢视频播放速度

  • 修剪剪辑

  • 提高/降低声音

转换文件类型

ffmpeg提供的最简单和最常见的命令之一是文件类型的简单转换。在许多情况下,转换视频非常简单——只需使用-i标志进行输入,并通过使用输出所需的文件类型扩展名来指定输出类型。例如,如果我们想将 mp4 转换成 webm,只需运行以下命令:

ffmpeg -i video.mp4 video.webm

同样的技术也可以应用于音频文件,例如 mp3 到 ogg:

ffmpeg -i audio.mp3 audio.ogg

甚至可以拍摄视频并将其输出为 gif 格式,尽管您可能希望只转换短视频:

ffmpeg -i video.mp4 picture.gif

另一种稍微复杂一点的常见转换是从视频文件类型转换到纯音频文件类型。在这种情况下,您需要添加代表“视频编号”的-vn标志,例如:

ffmpeg -i video.mp4 -vn song.mp3

压缩视频

在本地录制视频并希望将其上传到网络后,您可能会发现视频文件太大,不适合实际使用。你可以用ffmpeg运行一行程序来压缩它,而不是加载一些笨重的视频编辑软件:

ffmpeg -i input.mp4 -b 1000000 output.mp4

在前面的例子中,我们获取了一个名为input.mp4的视频,并以 1,000,000 比特或每秒 1 兆比特的缩减比特率将其输出为output.mp4。客观地说,一张 DVD 通常是每秒 4-8 兆比特,而蓝光是 24-40 兆比特。大小取决于视频的尺寸和质量。

放慢视频播放速度

如果你曾经想看一些慢动作的东西,但不想做打开一个成熟的视频编辑器的艰苦工作,ffmpeg有一个解决方案给你。任何视频(或声音文件)都可以通过ffmpeg轻松加速或减速。这可以通过以下命令完成:

ffmpeg -i video.webm -filter:v "setpts=2.0*PTS" slow.webm

在前面的命令中,2.0意味着我们的视频扩展到两倍于原始长度。如果我们改为使用setpts=0.5*PTS,我们会有相反的效果,通过压缩到一半的长度来加速视频。

通过使用不同的滤波器,同样可以应用于诸如 mp3 之类的音频:

ffmpeg -i audio.mp3 -filter:a "atempo=2.0" slow.mp3

上述示例只会影响视频,但声音将以正常速度播放。如果你想改变这两个,你需要添加第二个过滤器。例如,要以与视频相同的速度减慢声音,请添加-filter:a "atempo=0.5":

ffmpeg -i video.webm \
  -filter:v "setpts=2.0*PTS" \
  -filter:a "atempo=0.5" slow.webm

或者要将视频和声音的速度都提高两倍,请使用

ffmpeg -i video.webm \
  -filter:v "setpts=0.5*PTS" \
  -filter:a "atempo=2" slow.webm

剪辑视频

你可能想使用ffmpeg的另一个常见任务是修剪视频,这样你就可以从原始视频的某个部分创建一个新的视频。如果我们想将 3 秒钟开始的内容剪切到 8 秒钟的视频中,我们可以运行

ffmpeg -i vid.webm -ss 00:00:03 -t 00:00:08 -async 1 cut.webm

这将产生一个名为cut.webm的新视频文件,其长度为 8 秒,从 3 秒标记到 11 秒标记。同样的命令也可以应用于像 mp3 这样的音频文件。

提高视频的音量

如果你曾经遇到过即使在最大音量下也很难听到音频的视频,下面这个命令就是为你准备的。有了ffmpeg,我们实际上可以放大文件的音频,让它以更大的音量播放。

音量用“dB”来衡量,dB 代表分贝。如果我们想将视频中的音频提高 5 分贝,我们可以运行以下命令:

ffmpeg -i in.mp4 -vcodec copy -af "volume=5dB" out.mp4

同样,我们可以使用负值来降低音量,例如,-5dB将音量调低 5 分贝:

ffmpeg -i in.mp4 -vcodec copy -af "volume=-5dB" out.mp4

使用 youtube-dl 下载视频

现在,您对如何使用 ffmpeg 修改、修剪和处理视频已经有点熟悉了,您可能会发现自己想要处理来自网络上的视频,例如,从 YouTube 下载一首经常听的歌曲并将其转换为 mp3,或者从一个有趣的视频中剪切一个剪辑,将其转换为 gif 与朋友分享。

youtube-dl是一个非常活跃的命令行工具,用于下载 YouTube 视频和 1000 多个不同的网站,包括

  • 维莫

  • 声音云

  • 脸谱网

  • 推特

  • 像福克斯和加拿大广播公司这样的新闻网站

这只是 1000 多个受支持网站中的一小部分。完整名单可在 https://github.com/ytdl-org/youtube-dl/blob/master/docs/supportedsites.md 找到。

安装youtube-dl最常见的方式是通过 Python 的包管理器pip:

sudo -H pip install --upgrade youtube-dl

然而,如果你不想使用pip,也可以用curl从官方网站下载一个可执行文件。要获得最新的安装选项,请在 https://github.com/ytdl-org/youtube-dl 查看 GitHub 上的项目。

最简单的命令,也可能是您最常用的命令,就是简单地使用实用程序,传入您想要下载的视频的 URL:

youtube-dl https://www.youtube.com/watch?v=DfK83xEtJ_k

请注意,默认情况下,将下载最高质量的视频,前一个视频超过 1GB。如果您想下载另一种格式,您可以使用-F标志查看视频的可用格式。返回的可用格式示例如图 16-4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-4

使用 youtube-dl 查看可用格式

记下您想要的视频的第一列“格式代码”。格式代码可以用-f标志指定,允许你下载一个小得多的版本,从而加快下载速度并节省你的日期(或仅当你想列出时才下载音频)。根据前面的列表,如果我们想下载尽可能小的视频,我们可以选择格式代码 598,它几乎可以立即下载:

youtube-dl -f 598 https://www.youtube.com/watch?v=DfK83xEtJ_k

如前所述,youtube-dl是一个非常活跃的项目,有很多选项和特性。在 GitHub README 上查看一些额外的特性绝对是值得的,但是在大多数情况下,我们在这里看到的将会完成工作。

用 gnuplot 创建图表

另一个可以从命令行执行的基于视觉的任务是将数据可视化为图形——要么在终端上查看数据,要么将数据转换为图像文件以备后用。

一个使这变得容易的程序是gnuplot,它在包管理器中广泛可用。

为了演示如何绘制一个简单的条形图,让我们创建一个名为days.dat的数据文件,包含以下内容:

0 Monday 100
1 Tuesday 220
2 Wednesday 75

接下来打开gnuplot,只需输入命令,无需输入或选项。

gnuplot打开的情况下,首先将模式切换到dumb,使生成的图表在终端显示为文字艺术。默认情况下,图表是在基于qt的 GUI 中生成的,该 GUI 在每个命令后弹出;尽管没有完全基于终端,但是qt版本的图表看起来更好。因此,如果您喜欢使用qt,只需跳过第一个命令:

set terminal dumb

接下来,我们将设置图表的框宽和填充样式:

set boxwidth 0.5
set style fill solid

最后,告诉gnuplot使用以下命令绘制days.dat文件

plot "days.dat" using 1:3:xtic(2) with boxes

这里的1:3指定我们使用数据的第 1 列作为 x 坐标,第 3 列作为 y 坐标。然后xtic(2)说我们应用第 2 列作为每个 x 值的标签。如果我们改为使用xtic(1),我们的日期名称标签将被索引数字所取代。最后,with boxes简单地指定了图表类型。可视化输出的示例如图 16-5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-5

gnuplot 在终端显示条形图

gnuplot也可以用来绘制数学方程,例如运行plot sin(x)生成如图 16-6 所示的图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-6

gnuplot 在终端显示折线图

任何方程都可以这样绘制,例如,用plot 5*x + 3可以生成一个简单的方程,表示一条斜率为 5、y 轴截距为 3 的直线。

gnuplot 到图像文件

能够在终端中显示图表是很好的,但在大多数情况下,您会希望将图表导出为图像,以便在报告或演示中传达信息。以同样的方式,我们设置gnuplot使用哑模式,我们可以设置它导出为一个图像文件。运行以下命令切换到 png 模式:

set terminal png

接下来,你必须告诉gnuplot你想在哪里输出图像文件;否则,您将在屏幕上看到未经处理的原始 png 数据,这一点用也没有。

set output "graph.png"

现在,如果我们按照与制作第一个条形图完全相同的步骤,我们将在工作目录中得到一个“graph.png”文件。每次将图形绘制到文件时,都需要使用前面的命令重新指定输出文件。

由于我们不再在终端工作,您可能会想要为您的图表添加一些颜色。为此,我们将修改原始的 plot 命令

plot "days.dat" using 1:3:0:xtic(2) with boxes lc var

我们在1:3:0中添加了一个新值,它使用索引创建了一个新变量;该变量随后与lc var一起使用,并针对每个条形递增。前面的命令应该会产生如图 16-7 所示的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-7

导出到图像文件的 gnuplot 条形图

内置多种配色方案,包括podoclassicdefault。要更改方案,运行以下程序,用您想要的方案替换podo:

set colorsequence podo

高级示例/演示文件夹

我们已经看了一些用gnuplot绘制线条和条形图绘制数据的基本例子。然而,这只是gnuplot能力的一小部分。该程序可用于创建深入的信息图表。这超出了本书的范围,但是我们将从gnuplot官方演示文件夹中分享几个例子: https://github.com/gnuplot/gnuplot/tree/master/demo 。参见图 16-8 、 16-9 和 16-10 中包含的演示示例。这些演示的代码可以用作绘制您自己的数据的起点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-10

gnuplot 图表轮廓示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-9

gnuplot 示例图表 rgb_variable.5.gnu

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-8

gnuplot 图表直方图示例

启动动画

我们可以对操作系统进行的另一个有趣的修改是改变启动时的默认动画屏幕。在某些情况下,了解这一点实际上很有用,例如,如果您正在定制嵌入式设备上工作,或者甚至是一个游戏单元,并且希望有一个主题启动屏幕。

一个很好的例子是开源主题 PlymouthTheme-Cat ( https://github.com/krishnan793/PlymouthTheme-Cat ),当安装并启用后,它会用一只动画猫取代你的默认启动屏幕,如图 16-11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-11

自定义启动动画

使用这个主题需要你的操作系统使用 Plymouth。Plymouth 是一个提供无闪烁图形引导过程的包,默认安装在基于 Debian 和 Fedora 的发行版上。

首先在你的/usr/share/plymouth/themes里安装主题;这可以通过直接克隆到文件夹中来实现:

sudo git clone \ https://github.com/krishnan793/PlymouthTheme-Cat.git \ /usr/share/plymouth/themes/PlymouthTheme-Cat

主题成功下载到主题文件夹后,接下来您需要安装主题:

sudo update-alternatives --install \ /usr/share/plymouth/themes/default.plymouth default.plymouth \ /usr/share/plymouth/themes/PlymouthTheme-Cat/PlymouthTheme-Cat.plymouth 100

安装后,通过运行以下命令将其设置为默认值

sudo update-alternatives --config default.plymouth

这将弹出一个选择菜单;输入选项列表 PlymouthTheme-Cat 的编号,如图 16-12 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16-12

选择要使用的普利茅斯主题

最后,您需要更新 initramfs 映像。这是启动时运行的映像,目的是挂载文件系统。

sudo update-initramfs -u

完成后,您现在可以重新启动计算机,并在启动过程中欣赏自定义的猫动画。

制作自定义启动动画

虽然猫的动画肯定做得很好,但你可能想制作自己的自定义动画。尝试自己制作的最简单的方法是查看普利茅斯猫的来源。注意,源文件包含 111 个连续的 PNG 文件,从progress-0.png开始,到progress-111.png结束。按顺序观看,这些图像创建动画。

如果您想创建自己的映像,最好的方法是用您自己的相同尺寸的 PNG 文件替换这些映像,然后重新运行用于安装 Plymouth Cat 的步骤。这将产生一个基于您提供的图像的动画。

一旦您对结果满意,您可以更新PlymouthTheme-Cat.plymouth中的值并重命名文件夹。

我们不会深入讨论如何生成图像文件的细节,但是 GIMP 和 Photoshop 等应用都支持将动画导出为多个 PNG 文件。

摘要

在这一章中,我们看了一些实用程序,它们使得在不打开庞大的编辑器的情况下处理图像和视频成为可能。这对于常见的快速任务非常有用,如转换文件类型、添加水印或修剪视频和音频内容。在某些情况下,就像 gnuplot 一样,我们使用数据创建新的图像,同样不需要打开图像编辑器。

最后,我们看到启动过程中显示的闪屏实际上是由一个名为 Plymouth 的程序控制的。我们下载了一个简单的动画,并将其设置为我们的启动动画。这是一个有趣的修改,在设置定制硬件时非常有用。例如,通过添加自定义动画,可以使自动启动视频游戏模拟器或连接到电视的多媒体盒的 Linux 系统看起来像一个独特的创作。

十七、额外服务

在本书中,我们已经研究了所有类型的命令和实用程序。然而,有几个方便的命令无视任何类别。在这最后一章,我们将看看有趣或有用的命令和工具,不一定适合一个类别。

大卡

另一个简单但有用的命令行程序是cal,它通过命令行提供了一个简单的日历。关于cal的一个很棒的事情是,它作为标准安装在几乎所有的 Linux 发行版上,因为它出现在第一版 Unix 中,并且是 POSIX 标准的一部分。cal最简单的用法是不带任何标志或参数运行它,它只产生一个当月的视觉效果,突出显示当天,如图 17-1 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-1

cal命令的输出

为了可视化一整年,您可以添加-y标志,这将产生一个类似的图形,但会以月份块的形式显示当前年份中的所有月份,如图所示。

在很大程度上,这就是我使用cal的程度,一个我经常使用的小程序。但是,它也提供查看特定年份或月份的能力,例如:

cal 2000      # display the year of 2000
cal june 2009 # display June of 2009

回头看看关于.bashrc的部分,你可能还会考虑添加一行简单的cal来显示一个日历,当你打开你的终端时,突出显示当天——尽管我个人不喜欢这增加的混乱。

电子语

如果你是一个喜欢听文本而不是阅读文本的人,你会非常想了解espeakespeak获取文本输入,并将其作为音频读取或将该音频输出到音频文件。这个包可以在 Ubuntu 包管理器中找到。

sudo apt-get install espeak

安装后,你可以做的最简单的事情就是把一些文本输入到espeak中,然后直接在你的机器上听音频。

echo Hello World | espeak

如果不使用管道,而是希望提供一个包含文本的文件,可以使用如下所示的-f标志:

echo Hello World > text.txt
espeak -f text.txt

默认的声音有点单调,但这是我们在下一节要改进的地方。一些内置的标志包括改变速度之类的东西。速度由代表“每分钟字数”(默认 175 )的-s标志和以毫秒为单位设置字数间隔的-g标志控制(默认 10 )。下面是 100 wpm 慢速和 250 wpm 快速的例子:

echo hello world | espeak -s 100 -g 20 # slow
echo hello world | espeak -s 250 -g 5 # fast

改善说话声音

通过安装来自开源语音引擎 MBROLA 的语音,espeak 使用的语音可以得到大幅改善。不幸的是,MBROLA 的网站不再在线;然而,它仍然可以使用 Wayback 机器与语音文件一起访问。要查看非常过时的网站上的信息,请查看以下链接:

https://web.archive.org/web/20180625050250/http://www.tcts.fpms.ac.be/synthesis/mbrola/

要下载并安装 MBROLA,请运行以下命令:

cd /tmp
wget \
https://web.archive.org/web/20180627172600/http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip
unzip mbr301h.zip
sudo cp mbrola-linux-i386 /usr/bin/mbrola

接下来我们将下载英语语音文件。如果你想要另一种语言,你必须使用存档的 MBROLA 网站找到合适的文件。要安装英语语音,请运行以下命令:

cd /tmp
wget \
https://web.archive.org/web/20160706052143/http://www.tcts.fpms.ac.be/synthesis/mbrola/dba/en1/en1-980910.zip
unzip en1-980910.zip
sudo cp en1/en1 /usr/share/mbrola/en1

安装了 MBROLA 和英语语音后,您现在可以使用如下所示的-v标志选择语音(建议将速度减慢到每分钟 120 个单词):

echo Hello World | espeak -v mb-en1 -s 120

将语音输出到音频文件

如果您最终使用 espeak 来转换大量文本,您可能希望将其输出为音频文件,而不是直接播放。这让您可以随意暂停、播放和倒带,更不用说将文件移动到其他设备或共享了。如何做到这一点的例子如下(我们假设在同一个目录中有一个名为 text.txt 的文件中有文本;如果没有,从网页上复制一些文本并粘贴到文本文件中):

espeak -f text.txt -w audio.wav

不幸的是,espeak只有输出为 wav 文件的选项,所以如果你想要 mp3 或其他类型,你需要运行一个额外的命令来使用ffmpeg进行转换。

ffmpeg -i audio.wav -vn -ar 44100 -ac 2 -b:a 192k audio.mp3

命令行上的数学

在过去的几章中,我们已经使用了bc,但是它值得一提,因为它经常被忽略。首字母代表基本计算器。它安装在大多数类 Unix 操作系统上,因为它是 POSIX 标准。它提供了在命令行上进行数学运算或编写特定于bc的脚本的能力。

在命令行中,bc由另一个命令的管道输出使用,例如:

echo 1 + 1 | bc

运行前面的脚本将返回输出 2。它支持你在任何计算器上期望的加、减、乘、除的基本运算。此外,您还有一些特殊的命令,例如,获取一个数的平方根:

echo "sqrt(169)" |  bc

注意,当使用任何带括号的bc符号时,我们需要用引号将它括起来;这是为了避免 bash 将其解释为 subshell。bc中另一个可用的特殊命令是 length,它返回一个数的位数:

echo "length(169)" |  bc

前面的脚本返回 3。类似地,有一个函数scale计算小数点右边的位数,例如,下面的函数返回 3:

echo "scale(169.777)" |  bc

除了使用管道,还可以在交互模式下启动bc。为此,使用-l标志运行它:

bc -l

除了作为一个命令行实用程序,bc实际上可以用作一个完整的脚本语言,它支持 C 语法进行数字操作和创建代码重用函数。

另一个命令expr也可以在许多系统中找到,它在没有管道的情况下计算数学语句。然而,不推荐使用expr,因为它已经过时了:

expr 1 + 1

同样,你还会在许多系统上发现dc,它也是一个先于 C 语言的反向波兰符号计算器。

平铺窗口管理器

超级用户应该关注的另一类应用是平铺窗口管理器。平铺窗口管理器取代了 Linux 操作系统的 GUI 界面。)并提供了一种将你的工作空间分割成小块的方法。

平铺窗口管理器被吹捧为帮助操作系统使用一个完全无鼠标的过程。当使用平铺窗口管理器时,任何可以用鼠标完成的事情都可以用键盘更好地完成。由于这个原因,平铺窗口管理器经常被作为提高命令行界面使用效率的一种方式。

就我个人而言,我发现平铺窗口管理器的有用性取决于手头的任务。如果我的工作流涉及到同时运行的十几个不同的终端会话,我几乎总是选择平铺窗口管理器。然而,如果我的工作流涉及 web 浏览器、word 编辑器和一些终端会话,我会选择普通的桌面体验,在tmux中使用终端会话。

在过去,有几个不同的竞争平铺窗口管理器,但目前i3wm似乎是最流行的。在寻找流行的替代品时,我发现i3wm是过去 12 个月中唯一一个稳定发布的 Linux 平铺窗口管理器。出于这个原因,我们将把重点放在i3wm作为最好的和最常见的平铺窗口管理器。如果您对研究其他窗口管理器感兴趣,一些备选方案包括“Awesome window manager”、xmonad、dwm 和 ratpoison。

i3wm 擅长能够在终端会话和终端会话组之间快速切换。例如,我可能有一个用各种工具监视系统的终端页面,创建一种仪表板。然后在另一个窗口中,我可能有一些到不同被测设备的 SSH 会话。

如果你不熟悉平铺窗口管理器,我建议你把它安装在传统桌面旁边,而不是作为你唯一安装的桌面界面。如果你忘记如何做某事,或者在 i3wm 中做某件事情有困难,这将使事情变得更容易。如果是这样的话,你可以随时切换回 Ubuntu 桌面(或者你选择的界面),以后再回到 i3wm。

i3wm可以简单地安装在大多数 Linux 发行版上,只需在您的软件包管理器上运行以下等效程序:

sudo apt-get install i3

安装i3wm后,注销或重启电脑。如果你在 Ubuntu 或 Fedora 上,在登录界面上,你应该会看到一个设置图标,如图 17-2 所示。单击设置图标后,应该会出现一个可能的桌面界面列表。选择标有i3的那个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-2

在登录屏幕上选择 i3

第一次启用 i3wm 登录时,系统会询问您是否要创建配置文件,如图 17-3 所示。我们建议使用默认设置,将 Windows 键设置为用于键盘快捷键的 i3wm 修饰键。然而,在撰写本文时,我们发现在生成配置时按下<enter>然后选择默认选项比选择<esc>效果更好,而此时选择<esc>似乎会导致问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-3

i3 第一个配置对话框

安装后,您可以在大多数平台上通过注销并在登录屏幕上从下拉列表中选择 i3wm 来切换到 i3wm。起初,像使用 Vim 一样使用i3wm可能会令人望而生畏。你遇到了一个空白的黑屏,没有明显的方法打开一个应用。像 Vim 一样,i3wm 是通过键盘快捷键和命令来导航和使用的。表 17-1 显示了i3wm的命令列表(用“win”或 Windows 键替换 alt,如果你已经选择了它)。

表 17-1

i3wm 键盘快捷键

|

捷径

|

描述

|
| — | — |
| win+enter | 打开新的终端互动程序 |
| win+d | 在屏幕顶部打开一个对话框,您可以在其中键入应用名称,然后按 enter 键打开它 |
| win+j | 将焦点向左移动一格 |
| win+k | 将焦点下移一格 |
| win+l | 将焦点上移一格 |
| win+; | 将焦点向右移动一格 |
| win+shift+j | 向左移动聚焦磁贴 |
| win+shift+k | 下移聚焦的磁贴 |
| win+shift+l | 向上移动聚焦的磁贴 |
| win+shift+; | 向右移动聚焦磁贴 |
| win+f | 在聚焦磁贴的全屏模式之间切换 |
| win+shift+q | 取消聚焦的磁贴 |
| win+ | 切换到一个工作空间,其中是 0 到 9 之间的任意值。每个数字都是一个单独的工作空间 |
| winktv | 下一个图块将垂直分割空间 |
| win+h | 下一个图块将水平分割空间 |
| win+r | 进入平铺的调整大小模式。从此处,箭头键可用于水平或垂直扩展或压缩图块 |
| win+shift+空格 | 切换磁贴的浮动模式。浮动模式允许你拖动一个窗口而不用考虑网格 |
| win+ | 用鼠标拖动浮动模式图块 |

创建切片

您首先要学习的最基本的命令是创建新的平铺窗口,这等同于打开应用,因为所有的应用都包含在窗口管理器网格的平铺窗口中。如果您正在打开终端,您可以使用win+enter。对于所有其他应用,按win+d;这将在左上方打开一个小对话框,如图 17-4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-4

i3 应用搜索

当您键入应用的名称时,对话框将显示自动完成的状态,如果在任何时候它显示您的目标程序,请按 open。这将打开你的应用作为一个瓷砖。图 17-5 显示了一个 Firefox 作为标签打开的例子,以及两个终端。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-5

打开多个图块的 i3

打开其他应用将会在您的工作空间中自动创建其他图块,这些图块将分布在网格上。因此,当您添加额外的图块时,程序图块将会调整大小。如果你的屏幕开始变得拥挤,你需要更多的空间,你可以使用工作区,我们稍后会解释。或者,如果您有不再需要的图块,您可以聚焦它们并按下win+shift+q

您的工作区将被编号并显示在屏幕底部的状态栏中。除了您的工作区,状态栏还显示有关时间、互联网连接和可用空间的基本信息。

默认情况下,当添加新标签时,您的磁贴将水平拆分当前聚焦的标签。要切换到垂直分割,请按win+v键,您的下一个创建的图块将垂直分割。要切换回水平分割,请按下win+h。尝试创建新的图块,在垂直和水平之间切换,并根据需要使用win+shift+q删除图块。

一旦你有一个工作空间,分割成多个单幅图块,你可能想要调整单幅图块的大小。如果您按下win+r,您将进入高亮显示区域的调整大小模式,您可以使用箭头键来扩展或缩小该区域。状态栏中还有一个指示器,它会告诉您调整大小模式何时激活。

更改焦点中的磁贴

现在你有多个程序在i3wm中作为图块运行,你可能想知道如何在图块之间切换。您当前在i3wm中使用的磁贴被称为焦点。如果你想在磁贴之间切换焦点,只需按住win键并使用箭头键来导航你的焦点。您应该会在当前聚焦的窗口周围看到一个细细的轮廓。或者,您可以使用字母——jkl;——每个字母对应一个方向。这些键类似于 Vim 中的方向键,但又不完全相同。如果您想修改这些键,使它们与 Vim 相同,请参阅“修改 i3wm 配置文件”一节

移动瓷砖

除了改变您的焦点之外,您可能还想在创建额外的图块时重新排列窗口,或者调整这些图块的大小以创建您的完美设置。移动磁贴的快捷键与移动焦点的快捷键几乎相同,除了你需要同时按住winshift键,而不仅仅是win。所以向右移动,你可以做win+shift+right arrow或者win+shift+;。如上所述,您还可以调整窗口的大小。要进入调整大小模式,请在聚焦于要调整大小的图块时按win+r。一旦进入调整大小模式,您可以使用箭头键来扩展或收缩单幅图块。

i3wm 中的工作区

当你第一次打开i3wm时,你会在左下角看到一个写着“1”的小方块。这个数字代表您当前的工作空间。i3wm上有 10 个工作空间,编号为 1-9,0 为第十个。您可以通过按下win+<number>在工作区之间切换,其中<number>是 0 到 9 之间的任意数字。切换到新的工作区时,您的屏幕将显示为一个新的i3wm实例,没有打开的磁贴。

因此,如果您在工作区 1 中打开四个不同的图块,然后切换到工作区 2,您可以在新的布局上创建新的图块,并随时切换回工作区 1。无论工作区是否在焦点上,工作区内的程序都将继续运行。

浮动瓷砖

虽然图块网格系统本质上是i3wm的核心实用程序,但是可以创建存在于它之外的图块,并且浮动在其他所有东西之上。要在浮动模式中切换图块,将其置于焦点并按下win+shift+space。一旦图块处于浮动模式,您可以按住win并用鼠标拖动它。如果您想将方块返回网格,再次按下win+shift+space

全屏模式

如果您使用的互动程序太小,您可以暂时将互动程序切换到全屏模式,完成后再切换回来。要切换到平铺的全屏模式,只需按下win+f。要切换回来,在全屏模式下按下win+f

修改 i3wm 配置文件

通过修改i3wm的配置文件,可以设置多种设置和配置。配置文件的默认位置是~/.config/i3/config

在 i3wm 配置中绑定键

i3wm中你最想修改的是哪个键负责哪个功能。习惯于 Vim 键绑定的人喜欢做的一个常见改变是重新映射用于聚焦磁贴的键。这是通过在配置文件中使用bindsym关键字来完成的,如下例所示:

bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right

如果您决定这样做,您还需要重新映射默认使用的$mod+h,它用于水平分割窗口。至于使用什么键进行水平分割,这取决于您,但是在本例中,我们将使用"-",如下所示:

bindsym $mod+minus split h

还可以使用相同的组合键在文件中搜索任何现有的绑定,例如“$ mod+k”;如果发现重复,您需要删除一个,因为每个组合键只能映射到一个功能。

对 i3 配置文件进行更改后,您需要重新加载它。要在不重新启动系统的情况下完成此操作,请运行以下命令:

i3-msg reload

在前面的例子中,我们映射了每个 Vim 移动键(加上默认的修饰键“win”)。您可能还想应用类似的更改来移动聚焦窗口,如下所示:

bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right

您还可以将自定义功能绑定到未使用的组合键。例如,假设我们想要一个特殊的组合键来打开一个新的 web 浏览器窗口。我们可以添加如下所示的行:

bindsym $mod+shift+z exec "firefox"

使用前面的模式,您可以将组合键映射到任何应用,甚至您自己的定制脚本。

在 i3wm 配置中更改颜色

正如我们在本书中看到的其他配置文件一样,i3wm配置文件允许修改界面的主题和颜色。我们不会查看每个可能的配置,但以下配置将帮助您入门;这是一个通过改变各种子元素的颜色来修改屏幕底部状态栏的例子(确保替换配置文件中现有的 bar 实例,否则你将得到两个状态栏)。

bar {
        colors {
        background #2f343f
        statusline #2f343f
        separator #4b5262
        focused_workspace       #2f343f #bf616a #d8dee8
        active_workspace        #2f343f #2f343f #d8dee8
        inactive_workspace      #2f343f #2f343f #d8dee8
        urgent_workspacei       #2f343f #ebcb8b #2f343f
    }
    status_command i3status
}

此外,我们可以改变客户端本身的颜色(五色十六进制代码应该包含在一行中)。

client.focused           #bf616a #2f343f #d8dee8 #bf616a #d8dee8
client.focused_inactive  #2f343f #2f343f #d8dee8 #2f343f #2f343f
client.unfocused         #2f343f #2f343f #d8dee8 #2f343f #2f343f
client.urgent            #2f343f #2f343f #d8dee8 #2f343f #2f343f
client.placeholder       #2f343f #2f343f #d8dee8 #2f343f #2f343f
client.background        #2f343f

i3 状态配置文件

虽然大多数对i3wm的定制都是在~/.config/i3/config文件中进行的,但是还有第二个配置文件专门处理状态栏。状态栏特定的配置文件可以在~/.config/i3status/config找到。它不仅允许你改变状态栏的颜色和样式,还允许你改变显示的内容。*注意这个文件默认不存在。*有关状态栏的其他信息,您可以运行以下命令来查看特定于状态栏的手册页:

man i3status

在这个手册页中,您将找到一个示例配置文件,它可以被复制并用作自定义状态栏的基础。注意,状态栏的所有子组件首先被添加到名为order的变量中,该变量跟踪显示哪些子组件以及显示顺序。

order += "cpu_temperature 0"
order += "load"
order += "tztime local"
order += "tztime berlin"

再往下,每个子组件都用花括号描述。例如,“tztime berlin”组件除了显示系统的本地时间外,还显示柏林时间,如下所示:

tztime berlin {
        format = "%Y-%m-%d %H:%M:%S %Z"
        timezone = "Europe/Berlin"
}

为了拥有一个完整的工作配置文件,您还必须添加“tztime local”组件,该组件的定义如下:

tztime local {
        format = "%Y-%m-%d %H:%M:%S %Z"
}

为了使状态栏更改生效,您需要完全重启 i3,而不是简单地运行 reload 命令。您可以通过运行以下命令来重新启动 i3

i3-msg restart

您可以在手册页中找到几个组件来帮助您入门。如果你正在寻找定制i3wm和作为配置文件基础的额外资源,我推荐你搜索“i3wm config github”

替代 Shell

在列出许多可用的替代 shellss 之前,我想说明一下为什么我不使用任何 shell。首先,我喜欢我默认的工作环境,以反映我可能在“野外”找到的环境也就是说,如果我 SSH 到一台机器或去一家公司并使用他们的服务器,假设他们使用的是标准的 bash,我会感觉很自在。如果我已经习惯了使用另一种 shell,我可能会发现自己在尝试使用默认情况下根本不存在的快捷方式和命令。

第二个主要原因是许多替代 shell 不兼容 POSIX,这意味着专门为这些 shell 之一编写的脚本不能与更广泛的社区共享。我更喜欢使用标准的 POSIX 兼容 bash,因为我知道几乎每个人都可以在自己的本地环境中使用我的计算机上编写的脚本。

也就是说,许多其他人确实更喜欢替代 Shell,因为它们可能提供可用性或其他好处。如果您对探索替代 Shell 感兴趣,这里有一些值得一试的:

  • z Shell

z Shell

最受欢迎的替代 shell 是 Z Shell 或“ZSH”Z Shell 是 bash 的扩展,专注于改善用户体验。Z Shell 的一些特性包括

  • 更智能的自动完成。

  • Git 集成( git 状态提示)。

  • 基于~/的智能 SSH 自动完成。ssh/config & ~/。ssh/已知主机。

  • 打错字时的文件名修正。

  • 各种各样的主题。

  • 所有的cd用的其实都是pushd;因此你可以一直使用popd

  • 其他智能自动完成。

  • 具有 POSIX 兼容模式(尽管默认情况下不兼容)。

这绝不是一个完整的功能列表。

哦,我的 ZSH

我们看了第十四章中的“哦,我的狂欢”;“哦,我的 ZSH”本质上是同样的事情,但 Z 壳。它包含几个专门针对 Z Shell 的预制主题和配置文件。

更多信息请访问 https://github.com/ohmyzsh/ohmyzsh

第二种最受欢迎的替代贝壳是鱼。和 ZSH 一样,Fish 的重点是改善终端用户体验。一些功能包括

  • 自动完成你的类型(考虑你的命令历史

  • 改进的默认颜色主题

  • 更具互动性的自动完成功能

  • 基于 GUI 的配置菜单,可在 web 浏览器中访问

当比较 Fish 和 ZSH 时,一个突出的区别是,ZSH 需要配置来启用它的许多关键功能,而 Fish 是一个更开箱即用的体验。这种对“易用性”的关注也可以在基于 web 浏览器的配置菜单中看到,该菜单允许您交互式地更改颜色主题等内容。

重新映射键

随着您开始越来越多地定制您的 Linux 系统,您可能真的想要改变某些键的行为。例如,由于不经常使用,将 Caps Lock 的用法重新映射到其他用法是很常见的。

进行任何类型的重新映射的第一步都是获取有问题的按钮的键码。最好的方法是运行xev,这将启动一个交互模式,你按下一个按钮,作为回报,会收到一个键码;示例如图 17-6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-6

使用xev查找键码

在这个例子中,我们将重新映射 Caps Lock 键( keycode 66 )。要编辑映射,打开~/.Xmodmap。这个配置文件负责修改键盘绑定。添加以下代码行,将 Caps Lock 键映射到 hyperkey。

清除大写锁定

keycode 66 = Hyper_L

前面的配置删除了 Caps Lock 键的正常用法,使用其 keycode 将其设置为 hyperkey,并使 hyperkey 成为修饰按钮。

超级键是一个存在于被称为太空学员键盘的旧键盘上的键,如图 17-7 所示。space-cadet 键盘允许用户使用组合键,如“希腊”键,键入 8000 多个不同的字符。键盘对 Lisp 和 Emacs 的设计有很大的影响,尽管没有出现在大多数键盘上,但“超级键”仍然在今天的许多地方被引用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17-7

历史悠久的太空学员键盘上的特殊按键。戴夫·费希尔,罗德岛逆向计算协会,维基共享,知识共享署名-共享 3.0 未经许可

在大多数系统上,修改~/.Xmodmap文件就足以将 Caps Lock 重新映射到 hyperkey。做出更改后,您需要重新启动系统或手动重新加载配置。要手动重新加载,请运行以下命令:

xmodmap ~/.Xmodmap

现在,如果您不带参数地独立运行xmodmap,您应该会得到关于系统上特殊键的信息。“lock”行的第二列中应该没有任何内容,对于标记为“mod4”的行,您应该在末尾看到一个包含“Hyper_L”的键列表。

这里的“mod”代表修饰键,这意味着它可以与其他键结合使用来创建输出,与“alt”和“ctrl”键非常相似。这对下一节很重要,因为它允许我们将 Caps Lock 和其他一些键与自定义命令或脚本相关联。

使用 Xbindkeys 自定义快捷键

既然您已经将 Caps Lock 映射到 hyperkey,您可能想知道您可以用它做什么。将 Caps Lock 换成 hyperkey 的主要用途是获得一个额外的修饰键,类似于 alt 或 ctrl。我们可以将组合键与程序、任务和脚本联系起来。

在 i3 一节中,我们创建了一个用win+shift+z打开 Firefox 的自定义命令。这基本上是相同的想法,除了我们使用大写字母,不需要使用 i3。

要制作键盘快捷键,我们首先需要安装xbindkeys:

sudo apt-get install xbindkeys

接下来,通过运行以下命令,基于默认值创建一个xbindkeys配置文件:

xbindkeys --defaults > ~/.xbindkeysrc

接下来打开~/.xbindkeysrc文件,并在文件末尾添加以下一行:

"firefox"
      Mod4 + f

这里的Mod4代表我们的超级键,因为我们在上一节中将超级键(通过大写字母)与 mod4 相关联。所以我们绑定caps+f来打开 Firefox 浏览器。在我们前进的道路上,我们可以用任何其他程序取代firefox。例如,尝试将以下代码添加到您的~/.xbindkeysrc;运行之后,检查你的/tmp文件夹,你应该会看到一个名为hello的文件。您可以用任何命令替换引号,并将其与下面您想要的任何键盘快捷键相关联:

"touch /tmp/hello"
      Mod4 + t

随着 Caps Lock 键被释放出来用于自定义快捷键,您可以使用几十种可能的组合键,这还没有利用 Caps Lock 键与 shift 或 alt 等其他修饰符的组合。

额外资源

我发现在探索 Linux 终端时有用的其他资源包括

摘要

在这一章中,我们看了一些可以让你的终端使用更进一步的程序。我们查看了内置的cal命令,它几乎可以在任何 Linux 系统上找到,并允许您快速浏览来年。我们看到了如何使用espeak将文本转换成音频文件。

之后,我们看了平铺窗口管理器i3wm、可选的 shells,以及如何修改键盘输入来创建许多映射到程序或自定义脚本的自定义键盘快捷键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值