จะอัพเดท /etc/apt/sources.list โดยอัตโนมัติด้วย source URIs บน Ubuntu 16.04 อย่างไร


10

คำสั่งต่อไปนี้ทำงานได้ดีบน 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ที่ uncommented ในขณะที่ในสาย 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บรรทัด) สามารถทำได้โดยอัตโนมัติ?


เหตุผลที่อาจเป็นไปได้ว่าสำหรับผู้ใช้ส่วนใหญ่มันเป็นเวลาที่ไร้ประโยชน์ / เสียแบนด์วิดธ์ในการอัพเดทฐานข้อมูลของแพ็กเกจแหล่งข้อมูลที่มีอยู่ทุกครั้ง จาก GUI ที่คุณกำหนดค่าที่เก็บข้อมูลที่ใช้คุณสามารถปิด / เปิดใช้งาน (ความคิดเห็น / ไม่แสดงความคิดเห็น) บรรทัดเหล่านั้นได้อย่างง่ายดาย นอกจากนี้ยังมีsedสคริปต์บางส่วนที่อยู่รอบ ๆ
JanC

python3-software-propertiesแพคเกจอาจจะมีประโยชน์ในการเขียนสคริปต์ Python เกินไป
JanC

@JANC ขอบคุณฉันเขียนสคริปต์ของตัวเอง ดูคำตอบด้านล่าง
HåkonHægland

คำตอบ:


9

เปิดซอฟต์แวร์ & อัปเดตแล้วเปิดใช้งาน "ซอร์สโค้ด"


14
ไร้ประโยชน์หากอูบุนตูของคุณเป็นเซิร์ฟเวอร์ที่มีเพียงเปลือก
วอย Zylinski

12

ฉันมีปัญหาเดียวกันนี้ในการติดตั้งเซิร์ฟเวอร์ของ 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และดำเนินการต่อ


2

นี่คือสคริปต์ 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

ไม่จำเป็นต้องใช้สคริปต์ โปรดดูคำตอบของฉัน
Gunnar Hjalmarsson

1

วิธีแก้ปัญหาที่ง่ายกว่าซึ่งทำในสิ่งที่ผู้อื่นโพสต์ไว้อย่างรัดกุมมากขึ้น:

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

ความแตกต่างที่สำคัญ: Perl มีตัวเลือก -i inplace ซึ่งแก้ไขไฟล์ในสถานที่; ฉันไม่ได้เพิ่มคำต่อท้ายสำหรับไฟล์สำรองข้อมูลเพราะฉันไม่ต้องการให้ไฟล์สำรองข้อมูลนั้นเป็นไฟล์ข้อมูลโดยไม่ตั้งใจ และ "*" เกี่ยวข้องกับช่องว่างที่เป็นตัวเลือก "perl -p -n -e" ส่วนใหญ่เหมือนกับ "sed -e" แต่ระวังการจับคู่ regex โลภ

มันมีข้อ จำกัด แบบเดียวกันกับที่คนอื่นทำ: มันเปิดใช้งานแหล่งที่มาแม้ว่าจะไม่ได้เปิดใช้งานต้นฉบับ (เช่นคู่ค้า) และมันไม่สามารถใช้ได้กับ /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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.