निम्नलिखित वह है जो मैंने अस्थायी रूप से एक अस्थायी निर्देशिका बनाने के लिए उपयोग किया था जो लिनक्स और डार्विन (मैक ओएस एक्स 10.11 से पहले सभी संस्करण) पर काम करता है, बिना हार्डकोड $TMPDIRया /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
पृष्ठभूमि:
GNU मैकटैम्प कमांड को किसी तर्क की आवश्यकता नहीं है। सादा mktempकाम करेगा और सिस्टम की अस्थायी निर्देशिका में एक अस्थायी फ़ाइल बनाता है।
सादा mktemp -dफ़ाइल के बजाय एक निर्देशिका बनाएगा, जो आप लिनक्स पर उपयोग करना चाहते हैं।
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
डिफ़ॉल्ट रूप से, GNU mktemp tmp.XXXXXXXXXXउप निर्देशिका (या फ़ाइल) के नाम के लिए टेम्पलेट का उपयोग करता है । इस टेम्पलेट को कस्टमाइज़ करने के लिए, -tविकल्प का उपयोग किया जा सकता है।
OSX के mktemp का कोई डिफ़ॉल्ट टेम्पलेट नहीं है और इसे निर्दिष्ट करने के लिए टेम्पलेट की आवश्यकता होती है। दुर्भाग्य से, जहां GNU mktemp टेम्पलेट के रूप में -tविकल्प लेता है , OSX पर यह स्थितिगत तर्क के रूप में पारित किया जाता है। इसके बजाय, OSX के mktemp में एक -tविकल्प है जिसका अर्थ कुछ और है। -tपर OSX विकल्प टेम्पलेट के लिए एक "उपसर्ग" के रूप में दर्ज है। इसका विस्तार किया जाता है {prefix}.XXXXXXXX, इसलिए यह X को अपने आप जोड़ता है (उदाहरण के लिए अस्थायी निर्देशिका में mktemp -d -t exampleबना सकता है example.zEJZWCTQ)।
मैं खोजने के लिए कई लिनक्स वातावरण में, कि आश्चर्य हुआ $TMPDIRहै नहीं डिफ़ॉल्ट रूप से निर्धारित किया है। कई CLI प्रोग्राम सेट होने पर इसका समर्थन करते हैं, लेकिन फिर भी इसके लिए डिफ़ॉल्ट की आवश्यकता होती है /tmp। इसका मतलब है $TMPDIR/example.XXXXXXXXकि mktemp या mkdir को पारित करना खतरनाक है क्योंकि यह /example.XXXXXXXXस्थानीय डिस्क की रूट डायरेक्टरी में उत्पन्न हो सकता है ($ TMPDIR के बिना परेशान होने और खाली स्ट्रिंग बनने के कारण)।
OSX पर, $TMPDIRहमेशा सेट किया जाता है और (कम से कम डिफ़ॉल्ट शेल में) यह सेट नहीं किया जाता है /tmp(जो कि एक सिम्लिंक है /private/tmp) लेकिन करने के लिए /var/folders/dx/*****_*************/T। इसलिए हम OSX के लिए जो कुछ भी करते हैं, उस डिफ़ॉल्ट व्यवहार का सम्मान करना चाहिए।
अंत में, निम्नलिखित वह है जो मैंने अस्थायी रूप से एक अस्थायी निर्देशिका बनाने के लिए उपयोग किया था जो लिनक्स या डार्विन (मैक ओएस एक्स) दोनों पर काम करता है , बिना हार्डकॉडिंग $TMPDIRया /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
पहला भाग लिनक्स के लिए है। यह कमांड डार्विन (Mac OS X) पर 1" स्टेटस : ..." के साथ एरर स्टेटस कोड के साथ फेल होगा । इसलिए हम stderr को नजरअंदाज करते हैं और इसके बजाय Mac वेरिएंट को निष्पादित करते हैं। mytmpdirउपसर्ग केवल मैक (जहां उस विकल्प को सेट करने के लिए आवश्यक है) पर प्रयोग किया जाता है।