Làm cách nào để tự động cập nhật /etc/apt/source.list với các URI nguồn trên Ubuntu 16.04?


10

Lệnh sau hoạt động tốt trên Ubuntu 15.10:

sudo apt-get build-dep emacs24

Tuy nhiên, trên Ubuntu 16.04 tôi gặp lỗi sau khi chạy nó:

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

Trong 15.10, tất cả các dòng (khoảng 10 số) với deb-srctrong /etc/apt/sources.listđó không bị thiếu, trong khi ở 16.04, các dòng tương ứng có nhận xét. Ví dụ, đây là 4 dòng từ hiện tại của tôi 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

Lý do cho sự thay đổi này là gì?

Tiếp theo, tôi muốn tránh chỉnh sửa thủ công /etc/apt/sources.listmỗi lần tôi cài đặt lại Ubuntu. Làm thế nào điều này (không chú ý đến các deb-srcdòng) được thực hiện tự động?


Lý do có lẽ là đối với hầu hết người dùng, việc lãng phí thời gian / băng thông vô ích để cập nhật cơ sở dữ liệu của các gói nguồn có sẵn mỗi lần. Từ GUI nơi bạn định cấu hình các kho lưu trữ đã sử dụng, bạn có thể dễ dàng vô hiệu hóa / kích hoạt (bình luận / bỏ ghi chú) các dòng đó. Ngoài ra còn có một số sedkịch bản xung quanh.
JanC

Các python3-software-propertiesgói có thể có ích để viết một kịch bản Python quá.
JanC

@JanC Cảm ơn, tôi đã viết kịch bản của riêng mình. Xem câu trả lời dưới đây.
Håkon Hægland

Câu trả lời:



12

Tôi gặp vấn đề tương tự khi cài đặt máy chủ Ubuntu 16.04, vì vậy không có GUI. Tất cả những gì tôi cần là một vài sedlệnh.

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

Sau đó sudo apt-get updatevà tiếp tục.


2

Đây là một tập lệnh Bash (hiện chưa được kiểm tra) có thể được sử dụng cho deb-srccác dòng không ghi chú trong 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

Không cần một kịch bản. Xin vui lòng xem câu trả lời của tôi.
Gunnar Hjalmarsson

1

giải pháp đơn giản hơn làm những gì người khác đã đăng ngắn gọn hơn:

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

Phân biệt chính: Perl có tùy chọn -i inplace giúp sửa đổi các tệp tại chỗ; Tôi không thêm hậu tố cho các tệp sao lưu vì tôi không muốn các tệp sao lưu vô tình được coi là tệp dữ liệu. Và "*" giao dịch với khoảng trắng tùy chọn. "perl -p -n -e" hầu hết giống như "sed -e", mặc dù coi chừng phù hợp với regex tham lam.

Nó cũng có những hạn chế tương tự như những người khác làm: nó cho phép các nguồn ngay cả khi bản gốc không được bật (tức là đối tác) và nó không hoạt động trên /etc/apt/source.list.d. Sau đây cũng sẽ xử lý /etc/apt/source.list.d* nhưng tạo bản sao lưu trước.

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.