Pourquoi utiliser echo avant d'installer un nouveau logiciel?

25

Je suis nouveau dans le monde informatique. Lors de l'installation de ROS Indigo, la première étape m'indique d'utiliser le code suivant:

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

Pourquoi utilisons-nous la echocommande avec sh -cdans ce contexte? J'ai également vu l'utilisation de la commande echo dans d'autres processus d'installation.

Remarque - Utilisation de la commande sh , Wiki d'installation de ROS Indigo

Pallav Bakshi
la source

Réponses:

43

Normalement, la fonction de la echocommande est d'afficher une chaîne (morceau de texte) sur la console. Mais cette fois -ci , un >caractère est ajouté après la echocommande, rediriger sa sortie vers un fichier texte, /etc/apt/sources.list.d/ros-latest.list.

Donc, fondamentalement, toute cette commande écrit un morceau de texte dans un fichier texte. Maintenant, voici la partie délicate:

La chaîne écrite dans le fichier peut être différente pour chaque ordinateur. La partie $(lsb_release -sc)est résolue (changée en autre chose) lors de l' echoexécution de la commande.

Vous pouvez ouvrir /etc/apt/sources.list.d/ros-latest.listdans un éditeur de texte avant et après la commande pour voir le changement par vous-même. (Le fichier peut ne pas exister avant cette commande.)


la source
19
En fait, >remplace le fichier texte, >>ajoute à la fin.
dirkt
3
@dirkt Merci. Ma faute! ;) C'est la conséquence de l'apprentissage de plusieurs langages de script. Le comportement conflictuel finit par vous hanter. Même sous DOS,> remplace.
10
echoécrit sur la sortie standard, pas sur la console.
Michael Hampton
4
"À moins d'être redirigée, la sortie standard est le terminal texte qui a lancé le programme." Alors, oui, echoécrit sur la console.
2

Gestion des packages et référentiels de logiciels

Les distributions Linux basées sur Debian s'appuient sur des référentiels (bases de données de packages d'installation d'applications et de packages de mise à niveau) pour maintenir les systèmes d'exploitation à jour et également pour récupérer et installer facilement de nouveaux packages logiciels. L'emplacement de ces référentiels est stocké dans /etc/apt/sources.list, cependant des sources supplémentaires, généralement uniques à des applications spécifiques, peuvent être stockées dans le /etc/apt/sources.list.drépertoire.

Lorsque la commande de mise à jour de l'index de package apt-get updateest exécutée, votre système d'exploitation vérifie auprès de ces référentiels de packages les packages disponibles et enregistre les logiciels disponibles comme disponibles pour votre système d'exploitation que vous pouvez continuer à installer à l'aide de la apt-get install <package>commande traditionnelle .

Un exemple d'une de ces sources logicielles est:

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

Il est important que ces sources référencent des versions spécifiques des distributions Linux. Un exemple est trusty qui est le nom de code pour Ubuntu 14.04. Vous pouvez interroger votre système d'exploitation (basé sur Debian) pour des détails complets avec lsb_release -aou lsb_release -scce qui signifie court et nom de code .

Dans votre question, la pièce $(lsb_release -sc)est interprétée et le résultat de votre système d'exploitation est imprimé dans le fichier source personnalisé ros-latest.list que la commande créera lors de l'exécution.


Interprète de langage de commande

La shcommande est le bourne shell . C'est un, parmi plusieurs coquilles, mais il est considéré comme l'ancien standard et généralement vous pouvez en être certain. Il est également courant de le voir bashdans de nombreux scripts shell. Cette déclaration spécifie le shell à utiliser car différents shells utilisent une syntaxe différente.

En ce qui concerne le -cdrapeau, citant man bash:

Si l'option -c est présente, les commandes sont lues à partir de la chaîne. S'il y a des arguments après la chaîne, ils sont affectés aux paramètres positionnels, en commençant par $ 0.

Tout ce qui se trouve dans le ''est lu comme une chaîne, vous n'aurez pas besoin de comprendre comment échapper aux différents guillemets ou vous inquiéter que le shell interprète quelque chose dans le mauvais sens.


tl; dr

La commande s'imprime deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) maindans un fichier source personnalisé, en la remplaçant $(lsb_release -sc)par la valeur interprétée.

Ralph
la source