ฉันเคยเห็นในหลาย ๆ ที่ที่ใช้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 ยังทำเครื่องหมายขั้นตอนเหล่านั้นว่าเป็นขั้นตอนการคัดลอกการติดตั้งและไม่ใช่ขั้นตอนการคัดลอกธรรมดาบางอย่าง นั่นอาจเป็นประโยชน์