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