Warum sollte echo vor der Installation neuer Software verwendet werden?

25

Ich bin neu in der Computerwelt. Bei der Installation von ROS Indigo werde ich im ersten Schritt aufgefordert, den folgenden Code zu verwenden:

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

Warum verwenden wir den echoBefehl sh -cin diesem Zusammenhang zusammen mit ? Ich habe die Verwendung des Befehls echo auch in anderen Installationsprozessen gesehen.

Hinweis - Verwendung des Befehls sh im ROS Indigo-Installations-Wiki

Pallav Bakshi
quelle

Antworten:

43

Normalerweise besteht die echoBefehlsfunktion darin, eine Zeichenfolge (Text) auf der Konsole anzuzeigen. Diesmal >wird jedoch nach dem echoBefehl ein Zeichen hinzugefügt , das seine Ausgabe in eine Textdatei umleitet /etc/apt/sources.list.d/ros-latest.list.

Im Grunde schreibt dieser ganze Befehl einen Text in eine Textdatei. Nun kommt hier der schwierige Teil:

Die in die Datei geschriebene Zeichenfolge kann für jeden Computer unterschiedlich sein. Das Teil $(lsb_release -sc)wird aufgelöst (in etwas anderes geändert), wenn der echoBefehl ausgeführt wird.

Sie können /etc/apt/sources.list.d/ros-latest.listvor und nach dem Befehl in einem Texteditor öffnen , um die Änderung selbst zu sehen. (Die Datei existiert möglicherweise nicht vor diesem Befehl.)


quelle
19
Eigentlich >überschreibt die Textdatei, >>hängt an das Ende.
Dirkt
3
@dirkt Danke. Mein Fehler! ;) Das ist die Folge des Lernens mehrerer Skriptsprachen. Das widersprüchliche Verhalten verfolgt Sie schließlich. Auch unter DOS> überschreibt.
10
echoSchreibt auf die Standardausgabe, nicht auf die Konsole.
Michael Hampton
4
"Sofern nicht umgeleitet, ist die Standardausgabe das Textterminal, das das Programm initiiert hat." Also, ja, echoschreibt an die Konsole.
2

Paketverwaltung und Software-Repositorys

Debian-basierte Linux-Distributionen verlassen sich auf Repositorys (Datenbanken mit Anwendungsinstallationspaketen und Aktualisierungspaketen), um die Betriebssysteme auf dem neuesten Stand zu halten und neue Softwarepakete einfach abzurufen und zu installieren. Der Speicherort dieser Repositorys wird gespeichert /etc/apt/sources.list, es können jedoch zusätzliche Quellen, die normalerweise nur für bestimmte Anwendungen gelten, im /etc/apt/sources.list.dVerzeichnis gespeichert werden .

Wenn der Befehl zum Aktualisieren des Paketindex apt-get updateausgeführt wird, sucht Ihr Betriebssystem in diesen Paket-Repositorys nach verfügbaren Paketen und registriert die verfügbaren Softwares als verfügbar für Ihr Betriebssystem, das Sie mit dem herkömmlichen apt-get install <package>Befehl installieren können .

Ein Beispiel für eine dieser Softwarequellen ist:

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

Es ist wichtig, dass diese Quellen auf bestimmte Versionen von Linux-Distributionen verweisen. Ein vertrauenswürdiges Beispiel ist der Codename für Ubuntu 14.04. Sie können Ihr Betriebssystem (debian-basiert) nach vollständigen Details abfragen, mit lsb_release -aoder lsb_release -scwas Kurz- und Codenamen bedeutet .

In Ihrer Frage, der Teil $(lsb_release -sc)interpretiert und das Ergebnis von Ihrem Betriebssystem gedruckt in die benutzerdefinierten Quelldatei ros-latest.list , die der Befehl bei der Ausführung schaffen.


Befehlssprachen-Interpreter

Der shBefehl ist die Borowski-Shell . Dies ist eine von mehreren Shells, wird jedoch als der alte Standard angesehen, und im Allgemeinen kann man sicher sein, dass es einen gibt. Es ist auch üblich, bashin vielen Shell-Skripten zu sehen. Diese Deklaration gibt die zu verwendende Shell an, da unterschiedliche Shells unterschiedliche Syntax verwenden.

In Bezug auf die -cFlagge zitiert man bash:

Wenn die Option -c vorhanden ist, werden Befehle aus der Zeichenfolge gelesen. Befinden sich nach der Zeichenfolge Argumente, werden diese den Positionsparametern zugewiesen, beginnend mit $ 0.

Alles in der ''Datei wird als Zeichenfolge gelesen. Sie müssen also nicht herausfinden, wie Sie verschiedenen Anführungszeichen entgehen können, oder sich Sorgen machen, dass die Shell etwas falsch interpretiert.


tl; dr

Der Befehl wird deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainin eine benutzerdefinierte Quelldatei gedruckt und $(lsb_release -sc)durch den interpretierten Wert ersetzt.

Ralph
quelle