Perché usare l'eco prima di installare un nuovo software?


25

Sono nuovo nel mondo dell'informatica. Durante l'installazione di ROS Indigo, il primo passo mi indica di utilizzare il seguente codice:

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

Perché usiamo il echocomando insieme sh -cin questo contesto? Ho visto l'uso del comando echo anche in altri processi di installazione.

Nota - Uso del comando sh , Wiki installazione ROS Indigo


Risposte:


43

Normalmente la funzione di echocomando è di visualizzare una stringa (pezzo di testo) sulla console. Ma questa volta, una >si aggiunge carattere dopo il echocomando, reindirizzando il suo output in un file di testo, /etc/apt/sources.list.d/ros-latest.list.

Quindi, sostanzialmente, l'intero comando scrive un pezzo di testo in un file di testo. Ora, ecco la parte difficile:

La stringa scritta nel file potrebbe essere diversa per ciascun computer. La parte $(lsb_release -sc)viene risolta (modificata in qualcos'altro) quando echoviene eseguito il comando.

Puoi aprire /etc/apt/sources.list.d/ros-latest.listun editor di testo prima e dopo il comando per vedere tu stesso la modifica. (Il file potrebbe non esistere prima di questo comando.)


19
In realtà, >sovrascrive il file di testo, si >>aggiunge alla fine.
Dirkt

3
@dirkt Grazie. Colpa mia! ;) Questa è la conseguenza dell'apprendimento di diversi linguaggi di scripting. Il comportamento conflittuale alla fine arriva a perseguitarti. Anche in DOS,> sovrascrive.

10
echoscrive sullo standard output, non sulla console.
Michael Hampton,

4
"A meno che non venga reindirizzato, l'output standard è il terminale di testo che ha avviato il programma." Quindi sì, echoscrive sulla console.

2

Gestione dei pacchetti e repository software

Le distribuzioni Linux basate su Debian si basano su repository (database dei pacchetti di installazione dell'applicazione e pacchetti di aggiornamento) per mantenere aggiornati i sistemi operativi e anche per recuperare e installare facilmente nuovi pacchetti software. La posizione di questi repository è archiviata /etc/apt/sources.list, tuttavia nella /etc/apt/sources.list.ddirectory è possibile archiviare fonti aggiuntive, in genere uniche per applicazioni specifiche .

Quando apt-get updateviene eseguito il comando di aggiornamento dell'indice dei pacchetti , il sistema operativo verifica con questi repository di pacchetti i pacchetti disponibili e registra i software disponibili come disponibili nel sistema operativo che è possibile continuare a installare utilizzando il apt-get install <package>comando tradizionale .

Un esempio di una di queste fonti software è:

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

È importante che queste fonti facciano riferimento a versioni specifiche delle distribuzioni di Linux. Un esempio è affidabile, che è il nome in codice di Ubuntu 14.04. È possibile eseguire una query sul sistema operativo (basato su debian) per dettagli completi con lsb_release -ao lsb_release -scche significa short e nome in codice .

Nella tua domanda, la parte $(lsb_release -sc)viene interpretata e il risultato dal tuo sistema operativo viene stampato nel file sorgente personalizzato ros-latest.list che il comando creerà al momento dell'esecuzione.


Interprete del linguaggio di comando

Il shcomando è la shell bourne . Questo è uno, tra diverse shell, ma è considerato il vecchio standard e generalmente si può essere certi di esistere. È anche comune vedere bashin molti script di shell. Tale dichiarazione specifica che la shell deve essere utilizzata poiché shell diverse usano sintassi diverse.

Per quanto riguarda la -cbandiera, citando man bash:

Se l'opzione -c è presente, i comandi vengono letti dalla stringa. Se ci sono argomenti dopo la stringa, vengono assegnati ai parametri posizionali, a partire da $ 0.

Tutto all'interno del file ''viene letto come una stringa, non è necessario capire come sfuggire alle varie virgolette o preoccuparsi che la shell interpreti qualcosa nel modo sbagliato.


tl; dr

Il comando stampa deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainsu un file di origine personalizzato, sostituendolo $(lsb_release -sc)con il valore interpretato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.