我正在 Ubuntu PC 上安装 Ros2,想确保安装步骤不会影响我的 PC。具体来说,这个命令实际上起什么作用?
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
请帮我分解一下。
总体命令
echo "..." | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
将一些内容写入/etc/apt/sources.list.d/ros2.list
文件。它使用这种结构是因为通常您需要以 root 身份创建或修改 中的文件/etc/apt/sources.list.d
,并且echo ... | sudo tee ...
这是避免 中出现的权限错误的常用方法sudo echo ... > ...
。现在开始写内容:
这使用了
$(…)
两次命令替换,其中的全部内容$(…)
都被替换为其内部命令的输出。dpkg --print-architecture
,它打印 Ubuntu 安装的默认体系结构。因此,这部分将被替换为amd64
、arm64
等内容。. /etc/os-release && echo $UBUNTU_CODENAME
。这是打印与 Ubuntu 版本关联的代号的方法(focal
、jammy
、noble
等)。/etc/os-release
包含各种变量,采用 shell 友好格式,包含操作系统的详细信息,如操作系统系列、版本、代号等。总而言之,内容将减少到如下形式:
这是一个
sources.list
仅限于默认架构的条目(因此,如果您在amd64
并且还添加了i386
,则此 repo 将仅用于amd64
),并使用特定的签名密钥。这是一个相当正常的
sources.list
输入。但该命令的重点是它会影响您的 PC。添加软件源是一个重大变化。如果明天这个 repo 添加了类似bash
或的软件包gnome-shell
,这些软件包很可能会覆盖 Ubuntu repos 中的相应软件包并安装在您的系统上。不太可能,但确实会发生。当你运行时
apt update
,你会看到类似这样的输出:在此阶段,apt 只是从存储库(不要与Git 存储库混淆——您不会在 GitHub 上找到这些存储库)下载有关可用软件包的信息。然后,当您运行 时
apt install foo
,apt 会从每个存储库中搜索具有最新版本软件包的信息foo
,然后从那里配置的源下载它。总之,您配置了多个存储库,每个存储库都提供任意数量的软件包。Apt 会在所有这些存储库中搜索您请求的最新版本的软件包。通过运行您显示的命令,您将在
/etc/apt/sources.list.d
apt 查找可访问的存储库的位置创建一个新文件,以将http://packages.ros.org/ros2/ubuntu添加为受信任的存储库。这意味着您将在输出中看到另一行提及该 URL 的内容apt update
。现在,您已信任该存储库提供的软件包,这些软件包由密钥加密签名,并
/usr/share/keyrings/ros-archive-keyring.gpg
安装在您的系统上(这就是为什么使用 HTTP 而不是 HTTPS 并不重要的原因——验证是单独提供的)。此存储库的目的是提供 Ubuntu 自身不提供的软件包——所有 ROS2 中的软件包。但是,该密钥的恶意持有者也可能发布恶意软件包,可能伪装成真正的 Ubuntu 软件包。您相信OSRF 基础设施团队不会这样做。如果您不信任它们,请考虑在虚拟机或Docker环境中安装。