ต่อไปนี้เป็นสิ่งที่ฉันใช้เพื่อสร้างไดเรกทอรีชั่วคราวที่ทำงานได้ทั้ง 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 (ที่ตัวเลือกที่จะต้องได้รับการตั้งค่า)