The overall command echo "..." | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
writes some content into the /etc/apt/sources.list.d/ros2.list
file. It uses this structure because typically you need to be root to create or modify files in /etc/apt/sources.list.d
, and echo ... | sudo tee ...
is a common way to do avoid permission errors that arise with sudo echo ... > ...
.
Now for the content being written:
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
This uses command substitution $(…)
twice, where the entirety of $(…)
is replaced with output of the commands inside it.
- The first use is for
dpkg --print-architecture
, which prints the default architecture of your Ubuntu installation. So this part will be replaced with something like amd64
, arm64
, etc.
- The second use is
. /etc/os-release && echo $UBUNTU_CODENAME
. This is a way to print the codename associated with an Ubuntu release (focal
, jammy
, noble
, etc.). The /etc/os-release
contains various variables in a shell-friendly format with details of the OS, like OS family, version, code name, etc.
All told, the content will reduce to something like:
deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main
This is a sources.list
entry which is restricted to the default architecture (so if you're on amd64
and also added i386
, this repo will only be used for amd64
), and uses a specific signing key.
It's a fairly normal sources.list
entry. But the whole point of the command is that it will affect your PC. Adding a software source is a significant change. If tomorrow this repo adds packages like bash
or gnome-shell
, those might well end up overriding the corresponding packages in the Ubuntu repos and getting installed on your system. Not likely, but it could happen.