我是计算机领域的新手。在安装 ROS Indigo 时,第一步指示我使用以下代码:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
为什么在这种情况下我们要使用echo
命令 along with sh -c
?我在其他安装过程中也看到过 echo 命令的使用。
答案1
通常,命令的功能echo
是在控制台上显示一个字符串(一段文本)。但这次,在命令>
后面添加了一个字符echo
,将其输出重定向到文本文件/etc/apt/sources.list.d/ros-latest.list
。
基本上,整个命令将一段文本写入文本文件。现在,棘手的部分来了:
写入文件的字符串对于每台计算机可能不同。命令运行$(lsb_release -sc)
时,该部分将被解析(更改为其他内容)echo
。
您可以/etc/apt/sources.list.d/ros-latest.list
在命令之前和之后在文本编辑器中打开以亲自查看更改。(该文件可能在此命令之前不存在。)
答案2
包管理和软件存储库
基于 Debian 的 Linux 发行版依靠存储库(应用程序安装包和升级包的数据库)来保持操作系统更新,并轻松获取和安装新软件包。这些存储库的位置存储在 中/etc/apt/sources.list
,但是其他来源(通常特定于特定应用程序)可以存储在/etc/apt/sources.list.d
目录中。
当执行包索引更新命令时apt-get update
,您的操作系统会检查这些包存储库中可用的包,并将可用的软件注册为可供您的操作系统使用,您可以继续使用传统apt-get install <package>
命令进行安装。
这些软件源之一的示例是:
deb http://us-west-2.ec2.archive.ubuntu.com/ubuntu/ trusty main restricted
这些来源必须引用特定版本的 Linux 发行版。例如可靠lsb_release -a
这是 Ubuntu 14.04 的代号。您可以使用或查询操作系统(基于 Debian)的完整详细信息,lsb_release -sc
这意味着短的和代码名称。
在您的问题中,该部分$(lsb_release -sc)
被解释,并且操作系统的结果是打印进入自定义源文件ros-最新版该命令执行时将创建它。
命令语言解释器
该sh
命令是伯恩壳。这是几个 shell 中的一个,但被认为是旧标准,通常可以肯定存在。它bash
在许多 shell 脚本中也很常见。该声明指定要使用的 shell,因为不同的 shell 使用不同的语法。
关于-c
旗帜,引用man bash
:
如果存在 -c 选项,则命令将从字符串中读取。如果字符串后面有参数,则它们将分配给位置参数,从 $0 开始。
其中的所有内容''
都会被读作一个字符串,您不需要弄清楚如何转义各种引号,也不需要担心 shell 会以错误的方式解释某些内容。
总结
该命令打印deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main
到自定义源文件,并$(lsb_release -sc)
用解释的值替换。