ต่อไปนี้เป็นสิ่งที่ฉันใช้เพื่อสร้างไดเรกทอรีชั่วคราวที่ทำงานได้ทั้ง Linux และ Darwin (ทุกรุ่นก่อน Mac OS X 10.11) โดยไม่ต้องใช้ hardcoding $TMPDIRหรือ/tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
พื้นหลัง:
คำสั่ง GNU mktemp ไม่จำเป็นต้องมีอาร์กิวเมนต์ ธรรมดาmktempจะทำงานและสร้างไฟล์ชั่วคราวในไดเรกทอรีชั่วคราวของระบบ
ธรรมดาmktemp -dจะสร้างไดเรกทอรีแทนไฟล์ซึ่งเป็นสิ่งที่คุณต้องการใช้บน Linux
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
โดยค่าเริ่มต้น GNU mktemp จะใช้แม่แบบtmp.XXXXXXXXXXสำหรับชื่อของไดเรกทอรีย่อย (หรือไฟล์) ในการปรับแต่งเทมเพลตนี้-tสามารถใช้ตัวเลือกได้
mktemp ของ OSX ไม่มีเทมเพลตเริ่มต้นและต้องระบุเทมเพลต น่าเสียดายที่ GNU mktemp ใช้เทมเพลตเป็น-tตัวเลือกใน OSX สิ่งนี้จะถูกส่งเป็นอาร์กิวเมนต์ตำแหน่ง mktemp ของ OSX นั้นมี-tตัวเลือกที่หมายถึงอย่างอื่นแทน -tตัวเลือกใน OSX เป็นเอกสารที่เป็น "คำนำหน้า" สำหรับแม่แบบ มันถูกขยายเป็น{prefix}.XXXXXXXXดังนั้นจึงเพิ่ม Xs ลงไปโดยอัตโนมัติ (เช่นmktemp -d -t exampleสามารถสร้างexample.zEJZWCTQในไดเรกทอรีชั่วคราว)
ฉันรู้สึกประหลาดใจที่จะพบว่าในสภาพแวดล้อมลินุกซ์จำนวนมาก$TMPDIRจะไม่ได้ตั้งค่าเริ่มต้น โปรแกรม CLI หลายคนจะสนับสนุนมันเมื่อตั้ง /tmpแต่ยังคงต้องเริ่มต้นสำหรับ ซึ่งหมายความว่าการส่งผ่าน$TMPDIR/example.XXXXXXXXไปยัง mktemp หรือ mkdir นั้นอันตราย   เพราะอาจสร้าง/example.XXXXXXXXในไดเรกทอรีรากของโลคัลดิสก์ (เนื่องจาก $ TMPDIR ถูกยกเลิกการตั้งค่าและกลายเป็นสตริงว่าง)
ใน OSX, $TMPDIRตั้งเสมอและ (อย่างน้อยในเปลือกเริ่มต้น) มันไม่ได้ถูกกำหนด/tmp(ซึ่งเป็น symlink ไป/private/tmp) /var/folders/dx/*****_*************/Tแต่เพื่อ ดังนั้นสิ่งที่เราทำเพื่อ OSX ควรเคารพพฤติกรรมเริ่มต้นนั้น
โดยสรุปสิ่งต่อไปนี้คือสิ่งที่ฉันใช้เพื่อสร้างไดเรกทอรีชั่วคราวที่ทำงานได้ทั้ง Linux และ Darwin (Mac OS X) โดยไม่ต้องใช้ hardcoding $TMPDIRหรือ/tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
ส่วนแรกคือสำหรับ Linux คำสั่งนี้จะล้มเหลวในดาร์วิน (Mac OS X) ด้วยรหัสสถานะข้อผิดพลาด1ตอบสนองด้วย "การใช้งาน: ... " นั่นเป็นเหตุผลที่เราไม่สนใจ stderr และดำเนินการแทนตัวแปร Mac mytmpdirคำนำหน้าจะใช้เฉพาะบน Mac (ที่ตัวเลือกที่จะต้องได้รับการตั้งค่า)