เหตุผลที่noclobber
ไม่ได้ตั้งไว้โดยค่าเริ่มต้นเป็นประเพณี เป็นเรื่องของการออกแบบส่วนต่อประสานกับผู้ใช้มันเป็นความคิดที่ดีที่จะทำให้ "สร้างไฟล์ใหม่นี้" เป็นการกระทำที่ง่ายและทำให้การกระทำที่อันตรายเป็นพิเศษยิ่งขึ้น "สร้างไฟล์ใหม่หรือเขียนทับไฟล์ที่มีอยู่" ดังนั้นจึงnoclobber
เป็นความคิดที่ดี ( >
ในการสร้างไฟล์ใหม่>|
เพื่อเขียนทับไฟล์ที่มีอยู่) และน่าจะเป็นค่าเริ่มต้นหากเชลล์ได้รับการออกแบบในอีกไม่กี่ทศวรรษต่อมา
ฉันขอแนะนำให้ใช้สิ่งต่อไปนี้ในไฟล์เริ่มต้นเชลล์แบบโต้ตอบ ( .bashrc
หรือ.zshrc
):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
ในแต่ละกรณี (การเปลี่ยนเส้นทางการคัดลอกการย้าย) เป้าหมายคือการเพิ่มอุปสรรค์พิเศษเมื่อการดำเนินการอาจมีผลข้างเคียงของการลบข้อมูลที่มีอยู่บางอย่างแม้ว่าการลบข้อมูลที่มีอยู่ไม่ใช่เป้าหมายหลักของการดำเนินการ ผมไม่ได้ใส่ในรายการนี้เนื่องจากการลบข้อมูลเป็นเป้าหมายหลักของrm -i
rm
ทราบว่าจะทำnoclobber
และ-i
มีตาข่ายความปลอดภัย หากพวกเขาเรียก, คุณได้ทำอะไรผิด ดังนั้นอย่าใช้มันเป็นข้ออ้างที่จะไม่ตรวจสอบสิ่งที่คุณเขียนทับ! ประเด็นก็คือคุณควรตรวจสอบว่าไฟล์เอาต์พุตไม่มีอยู่ หากคุณได้รับการบอกกล่าวfile exists: foo
หรือoverwrite 'foo'?
หมายความว่าคุณทำผิดพลาดและคุณควรรู้สึกไม่ดีและระมัดระวังมากขึ้น โดยเฉพาะอย่างยิ่งอย่าเข้าสู่นิสัยว่าy
ถ้าได้รับพร้อมท์ให้เขียนทับ (arguably, นามแฝงควรalias cp='yes n | cp -i' mv='yes n | mv -i'
แต่กดCtrl+ Cทำให้ผลลัพธ์ดูดีกว่า): ถ้าคุณหมายถึงการเขียนทับ, ยกเลิกคำสั่ง, ย้ายหรือลบเอาท์พุท ไฟล์และเรียกใช้คำสั่งอีกครั้ง
สิ่งสำคัญคือไม่ให้มีนิสัยในการกระตุ้นความปลอดภัยเหล่านั้นเพราะถ้าคุณทำวันหนึ่งคุณจะอยู่ในเครื่องที่ไม่มีการกำหนดค่าของคุณและคุณจะสูญเสียข้อมูลเพราะการปกป้องที่คุณคาดหวังไว้ ทีนั่น
noclobber
จะถูกตั้งค่าสำหรับเชลล์แบบโต้ตอบเท่านั้นเนื่องจาก.bashrc
หรือ.zshrc
ถูกอ่านโดยเชลล์แบบโต้ตอบเท่านั้น แน่นอนคุณไม่ควรเปลี่ยนตัวเลือกเชลล์ในวิธีที่จะส่งผลต่อสคริปต์เนื่องจากอาจทำให้สคริปต์เหล่านั้นแตก
rm *
...