เหตุใดจึงต้องใช้การติดตั้งมากกว่า cp และ mkdir


67

ฉันเคยเห็นในหลาย ๆ ที่ที่ใช้install -dในการสร้างไดเรกทอรีและinstall -cคัดลอกไฟล์ ทำไมไม่ใช้mkdirและcp? มีข้อได้เปรียบในการใช้งานinstallหรือไม่?

คำตอบ:


58

ขึ้นอยู่กับสิ่งที่คุณทำ

โดยinstallปกติคำสั่งจะใช้ในสคริปต์การติดตั้งที่มาพร้อมกับแพ็กเกจและซอร์สโค้ดสำหรับการติดตั้งไบนารีไปยังระบบของคุณ นอกจากนี้ยังสามารถใช้เพื่อติดตั้งไฟล์หรือไดเรกทอรีอื่น ๆ นอกเหนือจาก-dและ-cตัวเลือกที่คุณมี-mสำหรับการระบุสิทธิ์ใหม่ของไฟล์ที่จะติดตั้งดังนั้นคุณไม่ต้องทำcpและ a chmodเพื่อให้ได้ผลลัพธ์เดียวกัน ตัวอย่างเช่น

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

นอกจากนี้คุณยังมีตัวเลือก-gและ-oสำหรับการตั้งกลุ่มเป้าหมายและเจ้าของตามลำดับ chownนี้หลีกเลี่ยงการโทรที่แยกต่างหากเพื่อ โดยทั่วไปแล้วการใช้installสคริปต์ของคุณจะสั้นลงและทำให้รัดกุมยิ่งขึ้นด้วยการสร้างไฟล์คัดลอกการตั้งค่าโหมดและสิ่งต่าง ๆ ที่เกี่ยวข้องในคำสั่งเดียวแทนคำสั่งจำนวนมาก

man installสำหรับการอ้างอิงให้ดู สำหรับการใช้งานเพียงแค่ใช้เวลาดูที่สคริปต์การติดตั้งมาพร้อมกับแพคเกจบางรหัสที่มา


22

"ติดตั้ง" โดยทั่วไปจะรวมการกระทำต่อไปนี้:

  • การคัดลอกไฟล์ที่ระบุไปยังสถานที่เป้าหมายซึ่งกำลังดำเนินการเกี่ยวกับกระบวนการที่ใช้การคัดลอกเก่า แตกต่างจาก "cp", "ติดตั้ง" ไม่ว่าลิงก์ไฟล์ก่อนการสร้างใหม่หรือ (ในระบบ BSD พร้อมสวิตช์ -S) จะสร้างขึ้นมาใหม่และเปลี่ยนชื่อเป็นชื่อเป้าหมายแบบ atom ซึ่งหลีกเลี่ยงสภาพการแข่งขันระหว่างการติดตั้งและเปิดใหม่ . หากไม่ใช้สิ่งนี้การคัดลอกอาจล้มเหลว (ด้วย ETXTBSY) สำหรับไฟล์ไบนารีที่กำลังทำงานอยู่หรือทำให้เกิดความผิดพลาดหากไฟล์ไลบรารีหรือข้อมูลถูกแทนที่
  • ตั้งค่าหนังสือรับรองที่เหมาะสมเป็นไฟล์ใหม่โดยไม่จำเป็นต้องใช้คำสั่งแยกกัน
  • ทำไดเรกทอรีระดับกลางหากมีการร้องขอ
  • หลีกเลี่ยงการแก้ไขไฟล์เป้าหมายหากไฟล์นั้นเหมือนกันกับเวอร์ชั่นใหม่ (-C switch)

ดังนั้นจึงเป็นไปตามวิธี Unix ที่เครื่องมือจะต้องทำสำหรับการดำเนินการเดียว แต่เสร็จสมบูรณ์ของการติดตั้งไฟล์ที่สร้างโดยเครื่องมือสร้างบางอย่างไปยังสถานที่ทำงานของมัน

แนวคิดที่สมบูรณ์ตามที่ฉันอธิบายถูกนำมาใช้ในระบบ BSD (ในรุ่นที่เรียกว่า "xinstall"); ฉันใช้โหมด "คัดลอกอย่างปลอดภัย" ที่นี่ (เวอร์ชันใหม่ที่มีการเปลี่ยนชื่ออะตอม) เป็นสิ่งสำคัญสำหรับสิ่งนี้ ระบบ Linux (จาก coreutils) คิดถึงส่วนที่สำคัญนี้และมีแนวโน้มที่จะแข่งขันกันระหว่างการลบและเปิดใหม่โดยกระบวนการใกล้เคียง แต่สิ่งนี้อาจได้รับการคุ้มครองโดยผู้จัดการแพคเกจ


2
การใช้installหรือ$(INSTALL)ใน makefiles ยังทำเครื่องหมายขั้นตอนเหล่านั้นว่าเป็นขั้นตอนการคัดลอกการติดตั้งและไม่ใช่ขั้นตอนการคัดลอกธรรมดาบางอย่าง นั่นอาจเป็นประโยชน์
Kaz

ฉันกำลังเผชิญหน้ากับการแข่งขันใน coreutils ติดตั้ง ... มีการแก้ไขหรือมีทางเลือกอื่นที่ทำได้อย่างถูกต้องหรือไม่
เทรนต์

@trentw การแข่งขันแบบไหน?
Netch

8

นอกเหนือจากคำอธิบายก่อนหน้านี้ที่นี่เกี่ยวกับการใช้งานมีความแตกต่างระดับต่ำระหว่างcpและinstallอย่างน้อยบน Linux หากคัดลอกไฟล์ที่มีอยู่ให้cpเขียนทับ inode ที่มีอยู่ของไฟล์ในขณะที่installสร้าง inode ใหม่สำหรับชื่อไฟล์เดียวกัน

สิ่งนี้สร้างความแตกต่างเมื่อทำการติดตั้งไบนารีใหม่ที่กำลังทำงานอยู่ การใช้cpทำให้เกิดข้อผิดพลาด EBUSY ในขณะที่installจะประสบความสำเร็จ ไบนารีที่ทำงานอยู่จะยังคงใช้เวอร์ชันเก่า แต่จะใช้เวอร์ชันใหม่หากโปรแกรมเริ่มต้นใหม่


มันน่าสนใจ ... ดังนั้นมันสามารถสร้างไฟล์ที่มีชื่อเดียวกัน แต่มีไอโหนดที่แตกต่างกันได้หรือไม่?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabrielใช่ สำหรับผู้ใช้จะมีเพียงหนึ่งไฟล์เท่านั้นเนื่องจากโดยทั่วไปไฟล์จะค้นหาตามชื่อ แต่สำหรับระบบไฟล์มีสองไฟล์ตราบเท่าที่บางกระบวนการเก็บการอ้างอิงไปยังไฟล์เก่า สามารถทำได้เช่นเดียวกันหากคุณเปลี่ยนชื่อหรือลบไฟล์ที่เปิดโดยกระบวนการแล้วสร้างไฟล์ใหม่ด้วยชื่อไฟล์เดียวกัน
Tomas Skäre

4

หากไดเรกทอรีดังกล่าวมีอยู่แล้ว:

  • mkdir -p จะพยายามตั้งค่าความเป็นเจ้าของและบิตโหมดไฟล์
  • install -d จะไม่พยายามตั้งค่าบิตความเป็นเจ้าของและบิตโหมดไฟล์

นี้สำหรับmkdirและinstallจากcoreutils GNU พวกเขาทั้งสองใช้make_dir_parentsฟังก์ชันเดียวกันแต่มีการตั้งpreserve_existingค่าพารามิเตอร์เป็นfalseหรือtrueตามลำดับ


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