¿Por qué usar echo antes de instalar un nuevo software?

25

Soy nuevo en el mundo de la informática. Al instalar ROS Indigo, el primer paso me indica que use el siguiente código:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

¿Por qué usamos el echocomando junto con sh -cen este contexto? También he visto el uso del comando echo en otros procesos de instalación.

Nota - Uso del comando sh , Wiki de instalación de ROS Indigo

Pallav Bakshi
fuente

Respuestas:

43

Por lo general, la función del echocomando es mostrar una cadena (texto) en la consola. Pero esta vez, una >se añade carácter después del echocomando, la reorientación de su salida a un archivo de texto, /etc/apt/sources.list.d/ros-latest.list.

Básicamente, todo este comando escribe un fragmento de texto en un archivo de texto. Ahora, aquí viene la parte difícil:

La cadena escrita en el archivo puede ser diferente para cada computadora. La parte $(lsb_release -sc)se resuelve (cambia a otra cosa) cuando se echoejecuta el comando.

Puede abrir /etc/apt/sources.list.d/ros-latest.listen un editor de texto antes y después del comando para ver el cambio por sí mismo. (Es posible que el archivo no exista antes de este comando).


fuente
19
En realidad, >sobrescribe el archivo de texto, se >>agrega al final.
dirkt
3
@dirkt Gracias. ¡Mi error! ;) Esa es la consecuencia de aprender varios lenguajes de secuencias de comandos. El comportamiento conflictivo eventualmente te persigue. Incluso en DOS,> sobrescribe.
10
echoescribe en la salida estándar, no en la consola.
Michael Hampton
44
"A menos que se redirija, la salida estándar es el terminal de texto que inició el programa". Entonces, sí, echoescribe en la consola.
2

Gestión de paquetes y repositorios de software

Las distribuciones de Linux basadas en Debian se basan en repositorios (bases de datos de paquetes de instalación de aplicaciones y paquetes de actualización) para mantener actualizados los sistemas operativos y también para buscar e instalar fácilmente nuevos paquetes de software. La ubicación de estos repositorios se almacena /etc/apt/sources.list, sin embargo, se pueden almacenar en el /etc/apt/sources.list.ddirectorio fuentes adicionales, generalmente exclusivas de aplicaciones específicas .

Cuando apt-get updatese ejecuta el comando de actualización del índice del paquete , su sistema operativo verifica con estos repositorios de paquetes los paquetes disponibles y registra los softwares disponibles como disponibles para su sistema operativo que puede instalar con el apt-get install <package>comando tradicional .

Un ejemplo de una de estas fuentes de software es:

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

Es importante que estas fuentes hagan referencia a versiones específicas de distribuciones de Linux. Un ejemplo es de confianza, que es el nombre en clave de Ubuntu 14.04. Puede consultar su sistema operativo (basado en Debian) para obtener detalles completos con lsb_release -ao lo lsb_release -scque significa abreviatura y nombre en clave .

En su pregunta, la parte $(lsb_release -sc)se interpreta y el resultado de su sistema operativo se imprime en el archivo fuente personalizado ros-latest.list que el comando creará al ejecutarse.


Intérprete de lenguaje de comando

El shcomando es el shell bourne . Este es uno, entre varios shells, pero se considera el antiguo estándar y, en general, uno puede estar seguro de que existe. También es común ver bashen muchos scripts de shell. Esa declaración especifica el shell para usar, ya que los diferentes shells usan una sintaxis diferente.

En cuanto a la -cbandera, citando man bash:

Si la opción -c está presente, los comandos se leen de la cadena. Si hay argumentos después de la cadena, se asignan a los parámetros posicionales, comenzando con $ 0.

Todo lo que está dentro ''se lee como una cadena, no necesitaría descubrir cómo escapar de varias comillas o preocuparse de que el intérprete interprete algo de manera incorrecta.


tl; dr

El comando imprime deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainen un archivo fuente personalizado, reemplazando $(lsb_release -sc)con el valor interpretado.

Ralph
fuente