ทำไมต้องใช้ echo ก่อนติดตั้งซอฟต์แวร์ใหม่


25

ฉันยังใหม่กับโลกแห่งการคำนวณ ขณะติดตั้ง 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 , ROS Indigo Installation Wiki


คำตอบ:


43

ตามปกติฟังก์ชั่นของechoคำสั่งคือการแสดงสตริง (ชิ้นส่วนของข้อความ) บนคอนโซล แต่คราวนี้มีการ>เพิ่มตัวอักษรหลังechoคำสั่งโดยเปลี่ยนเส้นทางไปยังไฟล์ข้อความ, /etc/apt/sources.list.d/ros-latest.list.

โดยพื้นฐานแล้วคำสั่งทั้งหมดนี้จะเขียนข้อความไปยังไฟล์ข้อความ ตอนนี้มาถึงส่วนที่ยุ่งยาก:

สตริงที่เขียนลงไฟล์อาจแตกต่างกันไปสำหรับคอมพิวเตอร์แต่ละเครื่อง ส่วน$(lsb_release -sc)ได้รับการแก้ไข (เปลี่ยนเป็นอย่างอื่น) เมื่อechoคำสั่งทำงาน

คุณสามารถเปิด/etc/apt/sources.list.d/ros-latest.listในโปรแกรมแก้ไขข้อความก่อนและหลังคำสั่งเพื่อดูการเปลี่ยนแปลงด้วยตัวคุณเอง (ไฟล์อาจไม่มีอยู่ก่อนคำสั่งนี้)


19
ที่จริงแล้ว>เขียนทับไฟล์ข้อความ>>ต่อท้าย
dirkt

3
@dirkt ขอบคุณ ความผิดฉันเอง! ;) นั่นเป็นผลของการเรียนรู้ภาษาสคริปต์หลาย ๆ ภาษา พฤติกรรมที่ขัดแย้งกันในที่สุดก็มาหลอกหลอนคุณ แม้แต่ใน DOS> เขียนทับ

10
echoเขียนไปยังเอาต์พุตมาตรฐานไม่ใช่คอนโซล
Michael Hampton

4
"ยกเว้นว่าจะถูกเปลี่ยนทิศทางเอาต์พุตมาตรฐานคือเทอร์มินัลข้อความที่เริ่มต้นโปรแกรม" ดังนั้นใช่echoเขียนไปยังคอนโซล

2

การจัดการแพ็กเกจและที่เก็บซอฟต์แวร์

การแจกแจงแบบอิงลินุกซ์ของ 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

เป็นสิ่งสำคัญสำหรับแหล่งข้อมูลเหล่านี้เพื่ออ้างอิงการแจกแจงลินุกซ์รุ่นที่เฉพาะเจาะจง ตัวอย่างคือความไว้วางใจซึ่งเป็นชื่อรหัสสำหรับ Ubuntu 14.04 คุณสามารถสอบถามระบบปฏิบัติการของคุณ (เดเบียน based) สำหรับรายละเอียดที่สมบูรณ์แบบด้วยlsb_release -aหรือlsb_release -scซึ่งหมายความว่าในระยะสั้นและสมญานาม

ในคำถามของคุณชิ้นส่วน$(lsb_release -sc)จะถูกตีความและผลลัพธ์จากระบบปฏิบัติการของคุณจะถูกพิมพ์ลงในไฟล์ต้นฉบับที่กำหนดเองros-latest.listซึ่งคำสั่งจะสร้างขึ้นเมื่อมีการดำเนินการ


ล่ามภาษาคำสั่ง

shคำสั่งเป็นบอร์นเชลล์ นี่คือหนึ่งในหลาย ๆ เชลล์ แต่ถือว่าเป็นมาตรฐานเก่าและโดยทั่วไปคุณจะมั่นใจได้ว่ามีอยู่จริง นอกจากนี้ยังเป็นเรื่องธรรมดาที่จะเห็นbashในเชลล์สคริปต์จำนวนมาก การประกาศนั้นระบุเชลล์เพื่อใช้เป็นเชลล์ที่ต่างกันใช้ไวยากรณ์ที่แตกต่างกัน

ในเรื่องเกี่ยวกับ-cธงการอ้างอิงman bash:

หากมีอ็อพชัน -c อยู่คำสั่งจะอ่านจากสตริง หากมีข้อโต้แย้งหลังจากสตริงพวกเขาจะถูกกำหนดให้กับพารามิเตอร์ตำแหน่งเริ่มต้นด้วย $ 0

ทุกสิ่งที่อยู่ภายในนั้น''ถูกอ่านเป็นสตริงคุณไม่จำเป็นต้องคิดออกว่าจะหนีจากเครื่องหมายอัญประกาศต่าง ๆ หรือกังวลเกี่ยวกับเปลือกตีความสิ่งผิดปกติ


TL; DR

คำสั่งพิมพ์deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainไปยังไฟล์ต้นฉบับที่กำหนดเองแทนที่$(lsb_release -sc)ด้วยค่าที่ตีความ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.