Linux 上的 Zsh shell 安装和配置
Z-shell (zsh) 是一种现代且非常强大的 shell:它合并并扩展了其他 shell(例如 Bash)的许多功能。虽然它可以用作强大的脚本语言,但它主要针对交互使用,因为其更突出的功能之一是高级选项卡完成系统。在本教程中,我们将了解如何在最常用的 Linux 发行版中安装 zsh,了解其启动和关闭文件是什么以及如何执行基本配置。
在本教程中您将学习:
如何在最常用的 Linux 发行版上安装 Zsh
交互式、非交互式、登录和非登录 shell 之间有什么区别
Z-shell 启动和关闭文件是什么以及在什么上下文中调用它们
如何执行基本的 shell 配置
使用 zsh 时如何设置 PATH
如何将 zsh 设置为默认 shell
使用的软件要求和约定
安装 Zsh
执行 Zsh 的安装是一项非常简单的任务,因为它可以在最常用的 Linux 发行版的官方存储库中找到。要在 Debian 或基于它的众多系统之一上安装该软件包,我们应该运行:
$ sudo apt-get update && sudo apt-get install zsh
要在 Fedora 上执行安装,我们将使用 dnf 包管理器:
$ sudo dnf install zsh
在 Archlinux 上,我们使用 pacman 来安装软件包:
$ sudo pacman -Sy zsh
几秒钟后 zsh 就应该安装完毕。在开始讨论如何配置之前,让我们花点时间回顾一下我们可以使用的不同“类型”的 shell 之间的区别;这将有助于我们理解zsh启动文件的作用。
贝壳类型
我们基本上可以区分以下几种shell类型:
交互的
非交互式
登录
未登录
顾名思义,交互式 shell 是我们启动终端仿真器时通常使用的:它的输入和错误输出连接到所述终端。相反,非交互式 shell 不接受用户输入。例如,当从脚本内部启动命令时,将使用非交互式 shell。
我们进一步区分的是登录 shell 和非登录 shell。当我们通过 TTY 或 ssh 登录系统时,将调用登录 shell。在这种情况下,我们正在交互式登录外壳中工作。相反,非登录 shell 是我们登录系统后使用的任何其他类型的 shell(除非显式调用登录 shell)。
掌握上述区别将有助于我们更好地理解 zsh 启动文件是在什么上下文中使用的。让我们看看它们是什么。
Zsh 启动和关闭文件
系统范围的zsh启动文件如下:
/etc/zshenv
/etc/zprofile
/etc/zlogin
/etc/zshrc
/etc/zlogout
上述每个文件都有其针对每个用户的等效文件。用户级配置文件位于设置为 ZDOTDIR
变量值的目录路径中。如果此变量的值为空字符串,则假定文件位于用户 HOME 目录中。每个用户配置文件名以 .
开头,因此它们是隐藏的(点文件):
.zshenv
.z配置文件
.zlogin
.zshrc
.zlogout
/etc/zshenv
和 .zshenv
配置文件用于定义环境变量。每次启动 zsh 会话时总是调用它们,因此它们应该包含尽可能少的内容。只有不产生输出的命令才应写入这些文件中。
/etc/zprofile
和 .zprofile
启动文件在登录 shell 会话启动时被读取,可用于运行命令进行设置那个特定的上下文。使用交互式 shell 时,它们在 /etc/zshrc
和 .zshrc
之前执行。
/etc/zlogin
和 .zlogin
文件也会在 login shell 会话启动时调用。然而,当使用交互式 shell 时,它们在 /etc/zshrc
和 /.zshrc
之后执行。虽然它们可以与“配置文件”文件一起使用,但应将其视为它们的替代方案。
/etc/zshrc
和 .zshrc
文件在交互式 shell 会话启动时被调用。它们基本上是 BASH shell 的 /etc/bashrc
和 ~/.bashrc
文件的对应部分。
最后,/etc/zlogout
和 .zlogout
文件在登录 shell 会话关闭时运行。后者在前者之前运行。
系统范围的配置文件先于用户专用的对应文件读取,因此以下是读取配置文件的全局顺序。使用交互式非登录 shell 会话时:
/etc/zshenv
〜/.zshenv
/etc/zshrc
〜/.zshrc
使用交互式登录 shell 会话时:
/etc/zshenv
〜/.zshenv
/etc/zprofile
〜/.zprofile
/etc/zshrc
〜/.zshrc
/etc/zlogin
〜/.zlogin
〜/.zlgout
/etc/zlogout
使用非交互式、非登录 shell 会话时(例如,从脚本启动命令时):
/etc/zshenv
〜/.zshenv
首先zsh配置
第一次启动交互式 zsh shell 会话(例如在终端中运行 zsh
)时,如果我们的用户不存在配置文件,则 zsh-newuser-install
脚本已启动。它旨在帮助我们创建第一个设置:
正如我们所看到的,要继续,我们只需按 (1)
即可。如果我们决定这样做,系统将提示我们选择要配置 shell 的哪个方面:
我的建议是继续进行基本设置,而不是检查启动文件中生成的内容,以便更好地了解底层的工作原理。完成此操作后,我们可以随时进一步调整,例如查看存储在 github 或类似网站上的其他用户配置文件。
配置历史记录
要配置如何处理历史记录,我们将在显示上述菜单时按(1)
。这将引导我们进入以下屏幕:
显示三个环境变量的值。我们在之前的教程中讨论了如何配置 bash 历史记录,因此这些变量对我们来说应该很熟悉。第一个HISTSIZE
包含内存中保存的历史行数,第二个HISTFILE
用于在中定义> shell 会话关闭时保存哪些文件历史记录。最后,第三个值SAVEHIST
是历史文件中要保留的行数。
要编辑这些值之一,我们所要做的就是按相应的键。例如,要更改 HISTSIZE
,我们可以按 (1)
。系统将提示我们插入所需的值:
设置不会永久保存,直到我们返回主菜单(0)
并选择(0)退出,保存新设置...
再次。
配置路径
众所周知,PATH
环境变量包含默认搜索程序和可执行文件的目录列表,因此无需指定绝对路径即可启动它们。使用 Bash 时将目录添加到 PATH
的方法是在 ~/.bash_profile
文件中列出它们,并用 :
字符分隔。例如,要将 ~/.local/bin
目录添加到我们的 PATH 中,我们将编写:
export PATH="$HOME/.local/bin:$PATH"
使用 zsh 时,我们以不同的方式定义 PATH
。应包含的目录是使用 ~/.zshenv
文件中的数组指定的。要执行与上一个示例中相同的操作,我们将编写:
path=("$HOME/.local/bin" $path)
使用上述配置会出现问题,因为每次调用 .zshenv
文件 $ {HOME}/.local/bin
都会添加到数组中,其中将包含许多重复项。为了解决这个问题,我们必须在数组声明之前使用以下行:
typeset -U path
typeset -U path 行的作用只是避免数组内出现重复项。如果另一个元素已经存在,则最左边元素将保留在数组中。想象一下该数组包含以下目录(当我们使用 zsh 时,请注意提示中的 %
符号):
% echo $path
/home/egdoc/.local/bin /home/egdoc/bin /usr/local/bin
如果我们再次将 /usr/local/bin
元素添加到数组的开头,则old 出现的位置将被删除:
% typeset -U path
% path=(/usr/local/bin $path)
% echo $path
/usr/local/bin /home/egdoc/.local/bin /home/egdoc/bin
使用 zsh 作为默认 shell
要更改用户的默认登录 shell,我们使用 chsh 命令。我们使用 -s
(--shell
) 选项调用它,并传递我们想要用作参数的 shell 的路径。在我们的例子中,我们希望将 /bin/zsh
设置为默认 shell,因此我们运行:
$ chsh -s /usr/bin/zsh
结论
在本教程中,我们学习了 zsh 的基础知识,这是一种现代 shell,具有许多功能,例如高级制表符补全。我们了解了如何在最常用的 Linux 发行版上安装它、zsh 启动文件是什么以及在什么上下文中调用它们、如何执行基本的 shell 配置、如何使用 zsh 设置 PATH,以及最后如何设置 zsh作为默认登录 shell。