ฉันเริ่มเขียนสคริปต์ทุบตีบางอย่างสำหรับโครงการของฉันและพวกเขาต้องการไฟล์กลางหรือตัวแปรที่จะเขียน
ฉันต้องการทราบว่าโฟลเดอร์ใดที่ฉันสามารถมั่นใจได้ว่ามีสิทธิ์เข้าถึงเมื่อมีคนรันสคริปต์ของฉัน เป็นการใช้งานทั่วไป/tmp/หรือไม่? หรือฉันควรใช้อย่างอื่น?
ฉันเริ่มเขียนสคริปต์ทุบตีบางอย่างสำหรับโครงการของฉันและพวกเขาต้องการไฟล์กลางหรือตัวแปรที่จะเขียน
ฉันต้องการทราบว่าโฟลเดอร์ใดที่ฉันสามารถมั่นใจได้ว่ามีสิทธิ์เข้าถึงเมื่อมีคนรันสคริปต์ของฉัน เป็นการใช้งานทั่วไป/tmp/หรือไม่? หรือฉันควรใช้อย่างอื่น?
คำตอบ:
ฉันค้นหาเอกสารFilesystem Hierarchy Standard ที่มีค่าเมื่อค้นหาสิ่งนี้
มีตัวเลือกน้อย
ขึ้นอยู่กับประเภทของข้อมูลที่คุณจัดเก็บ
หากคุณต้องการที่จะเขียนไฟล์ชั่วคราวบางส่วนเท่านั้นที่ผ่านมาเป็นเวลานานเป็นสคริปต์หรือโปรแกรมของคุณทำงานใช้ไดเรกทอรีที่ระบุโดยตัวแปรสภาพแวดล้อมหรือถ้าตัวแปรที่ไม่ได้ถูกกำหนดTMPDIR/tmp
/tmpถูกล้างเมื่อเวลาบูตในบางระบบ (บางครั้งก็เป็นแม้กระทั่งใน RAM เช่นโดยค่าเริ่มต้นใน Solaris และในการติดตั้ง Linux บางตัว) ดังนั้นจึงไม่สามารถใช้ไฟล์ที่ต้องรอดจากไฟดับหรือการรีบูต /var/tmpสามารถใช้สำหรับไฟล์ที่ต้องรอดจากการรีบูต แต่อาจได้รับการทำความสะอาดโดยผู้ดูแลระบบเป็นครั้งคราว หากความต้องการใช้ของคุณเพื่อบันทึกไฟล์บนพื้นฐานถาวรเขียนพวกเขาอยู่ที่ไหนสักแห่งในไดเรกทอรีบ้านของผู้ใช้ (ใน~/.programmingnoobsappหรือ~/.cache/programmingnoobsapp) หรือใต้หรือ/var/lib/programmingnoobsapp/var/cache/programmingnoobsapp
โปรดทราบว่า/tmpมีการแชร์ระหว่างผู้ใช้ทั้งหมดดังนั้นคุณต้องใช้ความระมัดระวังเมื่อสร้างไฟล์ที่นั่น คุณต้องเลือกชื่อไฟล์ที่ยังไม่มีอยู่และคุณต้องระวังอย่าให้สภาพการแข่งขันที่กระบวนการอื่นสร้างไฟล์ไว้ข้างหน้าคุณด้วยการอนุญาตที่แตกต่างกันซึ่งอาจเป็นช่องโหว่ความปลอดภัย (ถ้ากระบวนการอื่น กำลังทำงานในฐานะผู้ใช้อื่นจากนั้นสามารถเข้าถึงและแก้ไขข้อมูลกระบวนการของคุณได้) ใช้mktempคำสั่งในการสร้างไฟล์ในหรือ/tmp /var/tmpโดยค่าเริ่มต้นmktempสร้างไฟล์ใน$TMPDIRหรือ/tmpถ้าTMPDIRไม่ได้ตั้งค่าซึ่งมักจะเป็นสถานที่ที่เหมาะสม หากคุณต้องการใช้ไฟล์ชั่วคราวหลายไฟล์หรือแม้ว่าคุณต้องการไฟล์เดียวฉันขอแนะนำให้สร้างไดเรกทอรีสำหรับไฟล์ชั่วคราวทั้งหมดของคุณด้วยmktemp -d และลบออกเมื่อสิ้นสุดสคริปต์ของคุณ
#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…
mktempสำหรับ สำหรับฉันนี่คือคำตอบที่ถูกต้อง: มอบหมายงานการสร้างไฟล์ชั่วคราวให้อย่างปลอดภัยmktemp(ดูบทความนี้ ) แม้ว่าคำตอบเดียวที่กล่าวถึงนั้นFHSมีค่ามากเช่นกัน
tmp_rootก่อนกำหนด? มันจะไม่เป็นธรรมชาติมากกว่าunsetนี้เหรอ?
set -uแต่เป็นเรื่องแปลก) จำเป็นต้องตั้งค่า (un) เป็นค่าที่ปลอดภัยก่อนที่จะตั้งค่ากับดักในกรณีที่สคริปต์ถูกฆ่าหลังจากตั้งค่ากับดัก
set -o errexitเพื่อว่าถ้าtmp_rootมีการตั้งค่าแบบอ่านอย่างเดียวแล้วในสภาพแวดล้อมมันจะไม่ทำลายไดเรกทอรีที่ผิด ...
เพียงเติมเต็มคำตอบที่โพสต์ไปแล้ว
นอกจากนี้ยัง/dev/shmมีการกระจาย Linux บางอย่างซึ่งสามารถใช้สำหรับการจัดเก็บชั่วคราว ที่เก็บข้อมูลนี้ควรใช้ต่อเมื่อประสิทธิภาพของไฟล์ I / O เป็นปัจจัยสำคัญที่กำหนดให้/dev/shmใช้tmpfsระบบไฟล์ นอกจากนี้ควรใช้สำหรับไฟล์และข้อมูลที่มีขนาดพอสมควร tmpfsทำให้ระบบแฟ้มใช้ของแรมระบบการจัดเก็บจึงไม่ถาวรจากบูตบูต
มีภาพรวมที่ดีของตัวเลือกทั้งหมดที่กล่าวถึงที่นี่ใน StackOverflow และในคำถาม & คำตอบนี้: / tmp vs. / dev / shm สำหรับที่เก็บไฟล์ temp บน Linux? . ครอบคลุมอยู่ในคำถามและคำตอบของ SuperUser นี้: ฉันควรใช้ / dev / shm / เมื่อใดและควรใช้ / tmp เมื่อใด .
ใช่/tmpเป็นส่วนใหญ่สำหรับไฟล์ที่ต้องการชั่วคราว กระบวนการ / tmp มีบิตเหนียวซึ่งหมายถึงเฉพาะเจ้าของรายการเจ้าของไดเรกทอรีหรือ superuser สามารถเปลี่ยนชื่อหรือลบไฟล์ หลายโปรแกรมใช้สิ่งนี้เพื่อสร้างไฟล์ล็อคและสำหรับการจัดเก็บข้อมูลชั่วคราว ในการกระจายบางส่วนไดเรกทอรีนี้จะถูกล้างออกเมื่อบูตหรือปิด