Pranav Krishna 发布的文章

揭开 Linux 中退出码的神秘面纱。了解什么是退出码,以及为什么和如何使用它们。

退出码(退出状态)可以告诉我们最后一次执行的命令的状态。在命令结束以后,我们可以知道命令是成功完成的还是以错误结束的。

其基本思想是,程序返回退出代码 0 时表示执行成功,没有问题。代码 10 以外的任何代码都被视为不成功。

退出码除了 0 和 1 外还有很多值,我将在本文介绍它们。

Linux Shell 中的各种退出码

我们来快速了解一下 Linux Shell 中的主要退出码:

退出码解释
0命令成功执行
1通用错误代码
2命令(或参数)使用不当
126权限被拒绝(或)无法执行
127未找到命令,或 PATH 错误
128+n命令被信号从外部终止,或遇到致命错误
130通过 Ctrl+CSIGINT 终止(终止代码 2 或键盘中断
143通过 SIGTERM 终止(默认终止
255/*退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模)
? 130SIGINT^C)和 143SIGTERM)等终止信号是非常典型的,它们属于 128+n 信号,其中 n 代表终止码。

在简单了解了退出码之后,我们来看看它们的用法。

获取退出码

前一个命令执行的退出码存储在 特殊变量 $? 中。你可以通过运行以下命令来获取:

echo $?

我们在所有演示中都将使用它来获取退出代码。

请注意,exit 命令支持以带着前一条命令相同的退出码退出。

退出码 0

退出码 0 表示命令执行无误,这是完成命令的理想状态。

例如,我们运行这样一条基本命令

neofetch 

echo $?

这个退出码 0 表示特定命令已成功执行,仅此而已。让我们再演示几个例子。

你可以尝试 终止一个进程;它也会返回代码 0

pkill lxappearance

查看文件内容也会返回退出码 0,这意味着 cat 命令执行成功。

退出码 1

退出码 1 也很常见。它通常表示命令以一般错误结束。

例如,在没有 sudo 权限的情况下使用 软件包管理器,就会返回代码 1。在 Arch Linux 中,如果我运行下面的命令:

pacman -Sy

它会返回 1, 表示上一条命令运行出错。

exit code 1 (impermissible operation resulted in this code)

? 如果你在基于 Ubuntu 的发行版中尝试这样做(不使用 sudo 执行 apt update),运行后会得到错误码 100,表示你是在没有权限的情况下运行 apt100 不是标准错误码,而是 apt 特有的错误码。

虽然这是一般的理解,但我们也可以将其解释为 “不被允许的操作”。

除以 0 等操作也会返回错误码 1

Division by zero results in code 1

退出码 2

这个退出码出现在当执行的命令有语法错误时。滥用命令参数也会导致此错误。

一般来说,它表示由于使用不当,命令无法执行。

例如,我在一个本应只有一个连字符的选项上添加了两个连字符,那么此时会出现退出码 2。

grep --z file.txt

Invalid argument resulted in exit code 2

当权限被拒绝时,比如访问 /root 文件夹,就会出现错误码 2

Permission denied gives out code 2

退出码 126

126 是一个特殊的退出码,它用于表示命令或脚本因权限错误而未被执行。

当你尝试执行没有执行权限的 Shell 脚本时,就会出现这个错误。

请注意,该退出码只出现在没有足够权限的脚本或命令的“执行”中,这与一般的权限被拒绝错误不同。

因此,不要把它与你之前看到的退出码为 2 的示例混淆。在那个示例中,运行的是 ls 命令,权限问题出自它试图执行的目录。而本例中权限问题来自脚本本身。

退出码 127

这是另一个常见的退出码。退出码 127 指的是“未找到命令”。它通常发生在执行的命令有错别字或所需的可执行文件不在 $PATH 变量中时。

例如,当我尝试执行一个不带路径的脚本时,经常会看到这个错误。

Script executed without the path gives "command not found" or code 127

当你想运行的可执行文件不在 $PATH 变量中时,也会出现退出码 127。你可以通过 在 PATH 变量中添加命令的目录 来纠正这种情况。

当你输入不存在的命令时,也会得到这样的退出码。

Unmount is not a command, and Screenfetch is not installed, which resulted in code 127

退出码 128+n 系列

当应用程序或命令因致命错误而终止或执行失败时,将产生 128 系列退出码(128+n),其中 n 为信号编号。

n 包括所有类型的终止代码,如 SIGTERMSIGKILL 等。

退出码 130 或 SIGINT

在通过终止信号 2 或按下 Ctrl+C 中断进程时,会发出 SIGINT(键盘中断信号)。

因为终止信号是 2,所以我们得到的退出码是 130(128+2)。下面的视频演示了 lxappearance 的中断信号。

退出码 137 或 SIGKILL

SIGKILL(立即终止信号)表示终止信号 9。这是终止应用程序时最不应该使用的方法。

因为终止信号为 9,因此我们得到的退出代码为 137(128+9)。

退出码 143 或 SIGTERM

SIGTERM 是进程在未指定参数的情况下被杀死时的默认行为。

SIGTERM 的终止信号为 15,因此该信号的退出码为 143(128+15)。

还有一些你以前可能不知道的终止信号,它们也有自己类似的退出码。你可以在这里查看它们:

? 请注意,如果进程在启动它的同一会话中终止,这些信号可能不会出现。如果要重现这些信号,请从不同的 shell 终止。

就个人而言,信号 128 是无法重现的。

当退出码超过了 255 会怎样?

最新版本的 Bash 甚至保留了超过 255 的原始退出码的值,但一般来说,如果代码超过 255,就会被重新计算。

也就是说,代码 256 会变成 0257 会变成 1383 会变成 127,以此类推。为确保更好的兼容性,请将退出码保持在 0255 之间。

结语

希望你对 Linux Shell 中的退出码有所了解。在排查各种问题时,使用它们会非常方便。

如果你要在 Shell 脚本中使用这些代码,请确保你了解每个代码的含义,以便更容易地排除故障。

这就是本文的全部内容。如有遗漏,请在评论区告诉我。

(题图:MJ/719ff711-1b9f-4aa9-a82e-980704acbdd8)


via: https://itsfoss.com/linux-exit-codes/

作者:Pranav Krishna 选题:lkxed 译者:lxbwolf 校对:wxy

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

Snap 是由 Ubuntu 的母公司 Canonical 设计的通用包格式。有些人不喜欢 Snap,但它有一些优势。

通常,某些应用仅以 Snap 格式提供。这为你提供了在 Arch Linux 中启用 Snap 的充分理由。

我知道 AUR 拥有大量应用,但 Snap 应用通常直接来自开发人员。

如果你希望能够在 Arch Linux 中安装 Snap 应用,你需要先启用 Snap 支持。

有两种方法可以做到:

  • 使用 AUR 助手启用 Snap 支持(更简单)
  • 通过从 AUR 获取包,手动启用 Snap 支持

让我们看看怎么做。

方法 1、使用 AUR 助手启用 Snap

Snap 支持在 Arch 用户仓库中以 snapd 包的形式提供。你可以使用 AUR 助手轻松安装它。

许多 AUR 助手,但 yay 是我更喜欢的,因为它的语法类似于 pacman 命令

如果你还没有安装 AUR,请使用以下命令安装 Yay(需要事先安装 git):

git clone https://aur.archlinux.org/yay

cd yay

makepkg -si

安装 yay

现在 yay 已安装,你可以通过以下方式安装 snapd

yay -Sy snapd

使用 yay 从 AUR 安装 snapd

每当你 更新 Arch Linux 系统时,yay 都会启用 snapd 的自动更新。

验证 Snap 支持是否有效

要测试 Snap 支持是否正常工作,请安装并运行 hello-world Snap 包。

sudo snap install hello-world

hello-world
(或者)
sudo snap run hello-world

hello-world Snap 包执行

如果它运行良好,那么你可以轻松安装其他 Snap 包。

方法 2、从 AUR 手动构建 snapd 包

如果你不想使用 AUR 助手,你仍然可以从 AUR 获取 snapd。让我展示详细的过程。

你需要先安装一些构建工具。

sudo pacman -Sy git go go-tools python-docutils

为 Snap 安装依赖项

完成依赖项安装后,现在可以克隆 snapd 的 AUR 目录,如下所示:

git clone https://aur.archlinux.org/snapd

cd snapd

克隆仓库

然后构建 snapd 包:

makepkg -si

当它要求安装其他依赖包时输入 yes

手动构建 snapd

你已安装 snapd 守护程序。但是,需要启用它以在启动时自动启动。

sudo systemctl enable snapd --now

sudo systemctl enable snapd.apparmor --now #start snap applications

sudo ln -s /var/lib/snapd/snap /snap #optional: classic snap support

启动时启用 Snap

手动构建包的主要缺点是每次新更新启动时你都必须手动构建。使用 AUR 助手为我们解决了这个问题。

总结

我更喜欢 Arch Linux 中的 pacman 和 AUR。很少能看到不在 AUR 中但以其他格式提供的应用。尽管如此,在某些你希望直接从源获取它的情况下,使用 Snap 可能是有利的,例如 在 Arch 上安装 Spotify

希望本教程对你有所帮助。如果你有任何问题,请告诉我。


via: https://itsfoss.com/install-snap-arch-linux/

作者:Pranav Krishna 选题:lkxed 译者:geekpi 校对:wxy

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

Discord 是一个流行的消息收发应用,可用于文字和语音信息传递。

它是一些社区的福音,可以帮助他们扩大项目,接触更多的人,并维持一个粉丝和关注者的社区。而 Discord 最初是为游戏玩家设计的,这很令人惊讶。

Discord 可用于各种平台,包括 Linux。在本教程中,我将引导你完成在 Fedora 中安装 Discord 的步骤。

  • 使用 DNF 和 RPM Fusion 仓库安装 Discord
  • 通过 Flatpak 安装Discord

Flatpak 软件包是沙盒的,因此需要更多的磁盘空间和时间来启动。然而,他们会相当快地更新到新的版本。

无论你想使用 Flatpak 还是 DNF,选择权在你手上。我将向你展示这两种方法。

非 FOSS 警报!

Discord 并不是开源的。但由于他们提供了一个 Linux 客户端,而且许多 Linux 用户都依赖它,所以我们会在这里介绍它。

方法 1:通过 RPM Fusion 仓库安装 Discord

Discord 可以通过添加非自由的 RPM Fusion 仓库来安装,这是大多数 Fedora 用户的首选方法,因为更新很容易,而且应用的启动速度比 Flatpak 版本快。

打开终端,使用下面的命令来添加 RPM-fusion 非自由仓库:

sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

完成后,更新仓库列表(应该不需要,但只是为了它):

sudo dnf update

然后通过 dnf 命令安装 Discord,像这样:

sudo dnf install discord

Installing Discord using DNF

如果被要求导入 GPG 密钥,只要按 Y 就可以授权了。

Authorize GPG key

这就完成了!现在你可以从应用菜单中启动 Discord。你的登录页面将看起来像这样:

Launch Discord application

通过 DNF 删除 Discord

如果你不想再使用 Discord,你可以从你的系统中删除它。要做到这一点,在终端运行以下命令:

sudo dnf remove discord

这真的很简单,不是吗?还有一种简单的安装 Discord 的方法,那就是使用 Flatpak 软件包。

方法 2:通过 Flatpak 安装 Discord

Discord 可以使用 Flatpak 轻松安装,因为它在 Fedora 中是默认可用的。

首先,你需要在 Fedora 中启用 Flatpak 仓库:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

接下来,通过这个命令安装 Discord:

flatpak install discord

Install Discord via Flatpak

如果你想删除 Discord,那么只需运行:

flatpak remove discord

这就超级简单了。如果你在 Fedora Linux 上安装 Discord 需要任何帮助,请告诉我。


via: https://itsfoss.com/install-discord-fedora/

作者:Pranav Krishna 选题:lujun9972 译者:geekpi 校对:wxy

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