निम्नलिखित वह है जो मैंने अस्थायी रूप से एक अस्थायी निर्देशिका बनाने के लिए उपयोग किया था जो लिनक्स और डार्विन (मैक ओएस एक्स 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
उपसर्ग केवल मैक (जहां उस विकल्प को सेट करने के लिए आवश्यक है) पर प्रयोग किया जाता है।