Как автоматически обновить /etc/apt/sources.list с исходными URI в Ubuntu 16.04?

Следующая команда работала нормально в Ubuntu 15.10:

sudo apt-get build-dep emacs24

Однако в Ubuntu 16.04 я получаю следующую ошибку при ее запуске:

Reading package lists... Done
E: You must put some 'source' URIs in your sources.list

В 15.10 все строки (около 10 в числе) с deb-src в /etc/apt/sources.list, где не закомментировано, тогда как в 16.04 соответствующие строки, где закомментировано. Например, вот 4 строки из моего текущего sources.list:

## Major bug fix updates produced after the final release of the
## distribution.
deb http://no.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://no.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

В чем причина этого изменения?

Далее, я хотел бы избегать ручного редактирования /etc/apt/sources.list каждый раз, когда делаю переустановку Ubuntu. Как это можно сделать (раскомментировав deb-src строки) автоматически?

10
задан 23 April 2016 в 20:11

5 ответов

Откройте Software & Обновления и включают "Исходный код".

10
ответ дан 24 April 2016 в 06:11
  • 1
    @Redbob - Да, Вы правы. Но it' s еще лучше, чем " отформатируйте каждую ячейку manually" поскольку он пишет. Это может отформатировать целый документ. – BlueManCZ 15 September 2017 в 05:54

У меня была эта та же проблема об установке сервера Ubuntu 16.04, таким образом, никакой GUI. Все, в чем я нуждался, было несколькими sed команды.

sudo sed -i -- 's/#deb-src/deb-src/g' /etc/apt/sources.list && sudo sed -i -- 's/# deb-src/deb-src/g' /etc/apt/sources.list

Затем sudo apt-get update и продвигаются.

10
ответ дан 24 April 2016 в 06:11
  • 1
    Используя sudo apt-get purge ".*:arm64" также удалит мой инструментарий CUDA 8.0, поскольку он говорит, что некоторые файлы не имеют " arm64" назовите к нему и таким образом, они обращаются к исходному программному обеспечению, которое я хочу сохранить. Сохраняет arm64 источником проблемы? К сожалению, после близкий снятия выделения со всем внешним программным обеспечением, та же ошибка все еще подходит – lee kwot sin 15 September 2017 в 07:21

Вот (в настоящее время не тестируется) сценарий Bash, который мог привыкнуть к строкам некомментария deb-src в sources.list:

tempdir=$(mktemp -d)
cd "$tempdir"
source_file=/etc/apt/sources.list
new_file=sources.list.new
perl -pE 's/^#\s+(deb-src)/$1/' "$source_file" > "$new_file"
sudo cp "$new_file" "$source_file"
sudo apt-get update
2
ответ дан 24 April 2016 в 06:11
  • 1
    I' ll обновляют ответ приблизительно за 20 минут (готовящий некоторый джамбалайя – Charles Green 15 September 2017 в 11:10

более простое решение, которое делает то, что другие писали более кратко:

sudo perl -p -i -n -e "s/# *deb-src/deb-src/"  /etc/apt/sources.list

Ключевые отличия: Perl имеет параметр -i inplace, который изменяет файлы на месте; Я не добавил суффикс для файлов резервных копий, потому что не хотел, чтобы файлы резервных копий случайно обрабатывались как файлы данных. А «*» имеет дело с необязательными пробелами. «perl -p -n -e» в основном то же самое, что «sed -e», хотя следите за жадным сопоставлением регулярных выражений.

Он имеет те же ограничения, что и другие: он включает источники, даже если исходный не был включен (т.е. партнеры), и он не работает с /etc/apt/sources.list.d. Следующий файл также обработает /etc/apt/sources.list.d*, но сначала сделает резервную копию.

(cd /etc/apt/; sudo tar cvf sources.list.tar sources.list sources.list.d);  for i in /etc/apt/sources.list /etc/apt/sources.list.d/*; do sudo perl -p -i -n -e "s/# *deb-src/deb-src/" $i; done
1
ответ дан 30 March 2020 в 05:59

Вот упрощенный результат @Tobi, который делает это при одном вызове sed:

sed -i -- 's/#\s\?deb-src/deb-src/g' /etc/apt/sources.list

Это добавляет \s\?, который является необязательным пробелом ( обратите внимание, что ? нужно экранировать).

0
ответ дан 10 May 2020 в 19:22

Другие вопросы по тегам:

Похожие вопросы: