Зачем использовать echo перед установкой нового программного обеспечения?

5259
Pallav Bakshi

Я новичок в вычислительном мире. При установке 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, WOS Установка Rig Indigo

25
См. Также: [При использовании sudo с перенаправлением я получаю сообщение «Отказано в доступе» - спросите Ubuntu] (http://askubuntu.com/q/230476/158442) muru 7 лет назад 0

2 ответа на вопрос

43

Обычно функцией echoкоманды является отображение строки (фрагмента текста) на консоли. Но это время, >символ добавляется после echoкоманды, перенаправляя ее вывод в текстовый файл, /etc/apt/sources.list.d/ros-latest.list.

В общем, вся эта команда записывает фрагмент текста в текстовый файл. Теперь, здесь начинается сложная часть:

Строка, записанная в файл, может отличаться для каждого компьютера. Часть $(lsb_release -sc)разрешается (превращается во что-то другое) при выполнении echoкоманды.

Вы можете открыть /etc/apt/sources.list.d/ros-latest.listв текстовом редакторе до и после команды, чтобы увидеть изменения для себя. (Файл может не существовать до этой команды.)

На самом деле, `>` перезаписывает текстовый файл, `>>` добавляет в конец. dirkt 7 лет назад 19
@dirkt Спасибо. Виноват! ;) Это следствие изучения нескольких языков сценариев. Конфликтующее поведение в конечном итоге преследует вас. Даже в DOS> перезаписывает. 7 лет назад 3
`echo` пишет в стандартный вывод, а не в консоль. Michael Hampton 7 лет назад 10
«Если не перенаправлено, стандартный вывод - текстовый терминал, который инициировал программу». Итак, да, `echo` пишет в консоль. 7 лет назад 4
2
Ralph

Управление пакетами и хранилища программного обеспечения

В дистрибутивах Linux на основе Debian используются репозитории (базы данных пакетов установки приложений и пакетов обновлений) для обновления операционных систем, а также для простого извлечения и установки новых пакетов программного обеспечения. Расположение этих репозиториев хранится в /etc/apt/sources.list, однако в /etc/apt/sources.list.dкаталоге могут храниться дополнительные источники, обычно уникальные для конкретных приложений .

Когда выполняется команда обновления индекса пакета apt-get update, ваша операционная система проверяет эти хранилища пакетов на наличие доступных пакетов и регистрирует доступные программные продукты как доступные для вашей операционной системы, которые вы можете продолжить устанавливать с помощью традиционной apt-get install <package>команды.

Пример одного из этих источников программного обеспечения:

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

Для этих источников важно ссылаться на конкретные версии дистрибутивов Linux. В качестве примера можно привести верное кодовое имя для Ubuntu 14.04. Вы можете запросить ОСА (Debian на основе) для получения полной информации с lsb_release -aили lsb_release -scчто означает короткие и Кодовый .

В вашем вопросе, часть $(lsb_release -sc)интерпретируются и результат от операционной системы печататься в пользовательском источнике файлы РОС-latest.list котором команда будет создавать при исполнении.


Переводчик командного языка

Команда sh- оболочка Борна . Это одна из нескольких оболочек, но она считается старым стандартом, и, как правило, вы можете быть уверены, что она существует. Это также часто встречается bashво многих сценариях оболочки. В этом объявлении указывается оболочка для использования, так как разные оболочки используют разный синтаксис.

Что касается -cфлага, цитирую man bash:

Если присутствует опция -c, то команды читаются из строки. Если после строки есть аргументы, они присваиваются позиционным параметрам, начиная с $ 0.

Все, что внутри, ''читается как строка, вам не нужно разбираться в том, как избежать различных кавычек или беспокоиться о том, что оболочка интерпретирует что-то неправильно.


ТЛ; др

Команда печатает deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainв пользовательский исходный файл, заменяя $(lsb_release -sc)его интерпретированным значением.