ฉันเคยเห็นในหลาย ๆ ที่ที่ใช้install -dในการสร้างไดเรกทอรีและinstall -cคัดลอกไฟล์ ทำไมไม่ใช้mkdirและcp? มีข้อได้เปรียบในการใช้งานinstallหรือไม่?
ฉันเคยเห็นในหลาย ๆ ที่ที่ใช้install -dในการสร้างไดเรกทอรีและinstall -cคัดลอกไฟล์ ทำไมไม่ใช้mkdirและcp? มีข้อได้เปรียบในการใช้งานinstallหรือไม่?
คำตอบ:
ขึ้นอยู่กับสิ่งที่คุณทำ
โดยinstallปกติคำสั่งจะใช้ในสคริปต์การติดตั้งที่มาพร้อมกับแพ็กเกจและซอร์สโค้ดสำหรับการติดตั้งไบนารีไปยังระบบของคุณ นอกจากนี้ยังสามารถใช้เพื่อติดตั้งไฟล์หรือไดเรกทอรีอื่น ๆ นอกเหนือจาก-dและ-cตัวเลือกที่คุณมี-mสำหรับการระบุสิทธิ์ใหม่ของไฟล์ที่จะติดตั้งดังนั้นคุณไม่ต้องทำcpและ a chmodเพื่อให้ได้ผลลัพธ์เดียวกัน ตัวอย่างเช่น
install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
นอกจากนี้คุณยังมีตัวเลือก-gและ-oสำหรับการตั้งกลุ่มเป้าหมายและเจ้าของตามลำดับ chownนี้หลีกเลี่ยงการโทรที่แยกต่างหากเพื่อ โดยทั่วไปแล้วการใช้installสคริปต์ของคุณจะสั้นลงและทำให้รัดกุมยิ่งขึ้นด้วยการสร้างไฟล์คัดลอกการตั้งค่าโหมดและสิ่งต่าง ๆ ที่เกี่ยวข้องในคำสั่งเดียวแทนคำสั่งจำนวนมาก
man installสำหรับการอ้างอิงให้ดู สำหรับการใช้งานเพียงแค่ใช้เวลาดูที่สคริปต์การติดตั้งมาพร้อมกับแพคเกจบางรหัสที่มา
"ติดตั้ง" โดยทั่วไปจะรวมการกระทำต่อไปนี้:
ดังนั้นจึงเป็นไปตามวิธี Unix ที่เครื่องมือจะต้องทำสำหรับการดำเนินการเดียว แต่เสร็จสมบูรณ์ของการติดตั้งไฟล์ที่สร้างโดยเครื่องมือสร้างบางอย่างไปยังสถานที่ทำงานของมัน
แนวคิดที่สมบูรณ์ตามที่ฉันอธิบายถูกนำมาใช้ในระบบ BSD (ในรุ่นที่เรียกว่า "xinstall"); ฉันใช้โหมด "คัดลอกอย่างปลอดภัย" ที่นี่ (เวอร์ชันใหม่ที่มีการเปลี่ยนชื่ออะตอม) เป็นสิ่งสำคัญสำหรับสิ่งนี้ ระบบ Linux (จาก coreutils) คิดถึงส่วนที่สำคัญนี้และมีแนวโน้มที่จะแข่งขันกันระหว่างการลบและเปิดใหม่โดยกระบวนการใกล้เคียง แต่สิ่งนี้อาจได้รับการคุ้มครองโดยผู้จัดการแพคเกจ
นอกเหนือจากคำอธิบายก่อนหน้านี้ที่นี่เกี่ยวกับการใช้งานมีความแตกต่างระดับต่ำระหว่างcpและinstallอย่างน้อยบน Linux หากคัดลอกไฟล์ที่มีอยู่ให้cpเขียนทับ inode ที่มีอยู่ของไฟล์ในขณะที่installสร้าง inode ใหม่สำหรับชื่อไฟล์เดียวกัน
สิ่งนี้สร้างความแตกต่างเมื่อทำการติดตั้งไบนารีใหม่ที่กำลังทำงานอยู่ การใช้cpทำให้เกิดข้อผิดพลาด EBUSY ในขณะที่installจะประสบความสำเร็จ ไบนารีที่ทำงานอยู่จะยังคงใช้เวอร์ชันเก่า แต่จะใช้เวอร์ชันใหม่หากโปรแกรมเริ่มต้นใหม่
หากไดเรกทอรีดังกล่าวมีอยู่แล้ว:
mkdir -p จะพยายามตั้งค่าความเป็นเจ้าของและบิตโหมดไฟล์install -d จะไม่พยายามตั้งค่าบิตความเป็นเจ้าของและบิตโหมดไฟล์นี้สำหรับmkdirและinstallจากcoreutils GNU พวกเขาทั้งสองใช้make_dir_parentsฟังก์ชันเดียวกันแต่มีการตั้งpreserve_existingค่าพารามิเตอร์เป็นfalseหรือtrueตามลำดับ
installหรือ$(INSTALL)ใน makefiles ยังทำเครื่องหมายขั้นตอนเหล่านั้นว่าเป็นขั้นตอนการคัดลอกการติดตั้งและไม่ใช่ขั้นตอนการคัดลอกธรรมดาบางอย่าง นั่นอาจเป็นประโยชน์