为什么在安装新软件之前使用echo?


25

我是计算机世界的新手。在安装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命令sh -c?我也看到在其他安装过程中也使用了echo命令。

注意- 使用sh命令ROS Indigo安装Wiki


Answers:


43

通常,echo命令的功能是在控制台上显示一个字符串(文本)。但是这次,>echo命令之后添加了一个字符,将其输出重定向到文本文件/etc/apt/sources.list.d/ros-latest.list

因此,基本上,整个命令将一条文本写入文本文件。现在,这是棘手的部分:

每台计算机写入文件的字符串可能不同。$(lsb_release -sc)echo命令运行时,零件已解析(更改为其他内容)。

您可以/etc/apt/sources.list.d/ros-latest.list在命令之前和之后在文本编辑器中打开以亲自查看更改。(此命令之前该文件可能不存在。)


19
实际上,>覆盖文本文件,>>追加到末尾。
dirkt

3
@dirkt谢谢。我的错!;)这是学习几种脚本语言的结果。冲突的行为最终会困扰您。即使在DOS中,也将覆盖。

10
echo写入标准输出,而不是控制台。
迈克尔·汉普顿

4
“除非重定向,否则标准输出是启动程序的文本终端。” 因此,是的,echo写入控制台。

2

软件包管理和软件存储库

基于Debian的Linux发行版依赖于存储库(应用程序安装软件包和升级软件包的数据库)来保持操作系统的更新,并易于获取和安装新软件包。这些存储库的位置存储在中/etc/apt/sources.list,但是,通常对于特定应用程序而言唯一的其他源也可以存储在/etc/apt/sources.list.d目录中。

当执行package index update命令时apt-get update,您的操作系统将检查这些软件包存储库中是否有可用软件包,并将可用软件注册为操作系统可用,然后您可以继续使用传统apt-get install <package>命令进行安装。

这些软件来源之一的示例是:

deb http://us-west-2.ec2.archive.ubuntu.com/ubuntu/ trusty main restricted

对于这些资源,重要的是要参考linux发行版的特定版本。一个值得信赖的例子是Ubuntu 14.04的代号。您可以使用lsb_release -alsb_release -sc表示shortcodename来查询操作系统(基于debian)以获取完整的详细信息。

在您的问题中,将对该零件$(lsb_release -sc)进行解释,并将操作系统的结果打印到自定义源文件ros-latest.list中,该文件将在执行时创建。


命令语言解释器

sh命令是伯恩壳。这是几种外壳中的一种,但被认为是旧标准,通常可以肯定存在。bash在许多shell脚本中也很常见。该声明指定要使用的shell,因为不同的shell使用不同的语法。

关于-c旗帜,引用man bash

如果存在-c选项,则从字符串读取命令。如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始。

内的所有内容都''读为字符串,您无需弄清楚如何转义各种引号,也不必担心shell用错误的方式解释某些内容。


tl; dr

该命令将打印deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main到自定义源文件,替换$(lsb_release -sc)为解释后的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.