कई प्लेटफार्मों पर सही tmp dir ढूँढना


46

मेरे पास एक स्क्रिप्ट है जिसे अपने काम के लिए अस्थायी फ़ाइलों को बनाने की आवश्यकता है, और खुद के बाद सफाई करें। मेरा प्रश्न अस्थायी फ़ाइलों के लिए सही आधार निर्देशिका खोजने के बारे में है।

स्क्रिप्ट को कई प्लेटफार्मों पर काम करने की आवश्यकता है: गिट बैश (विंडोज), सोलारिस, लिनक्स, ओएसएक्स। प्रत्येक प्लेटफ़ॉर्म पर, पसंदीदा अस्थायी निर्देशिका अलग तरीके से व्यक्त की जाती है:

  • विंडोज: %TMP%(और संभवतः %TEMP%)
  • OSX: $TMPDIR
  • लिनक्स, यूनिक्स: माना जाता है, $TMPDIRलेकिन मेरे द्वारा आजमाए गए कई सिस्टम पर परेशान नहीं होता है

इसलिए मेरी स्क्रिप्ट में मैंने यह बॉयलरप्लेट जोड़ा है:

if test -d "$TMPDIR"; then
    :
elif test -d "$TMP"; then
    TMPDIR=$TMP
elif test -d /var/tmp; then
    TMPDIR=/var/tmp
else
    TMPDIR=/tmp
fi

यह बहुत थकाऊ लगता है। क्या कोई बेहतर तरीका है?


6
बस ${TMPDIR-/tmp}यूनिक्स-पसंद पर उपयोग करें । अस्थायी फ़ाइलों के TMPDIRलिए उपयोग नहीं करने के लिए आपको बताने के लिए (सिस्टम या व्यवस्थापक या उपयोगकर्ता द्वारा) है /tmp
स्टीफन चेजालस

जवाबों:


72

अस्थायी फ़ाइलों को संभालने के लिए थोड़ा अधिक पोर्टेबल तरीका उपयोग करना है mktemp। यह अस्थायी फाइलें बनाएगा और आपके लिए उनके रास्ते लौटाएगा। उदाहरण के लिए:

$ mktemp
/tmp/tmp.zVNygt4o7P
$ ls /tmp/tmp.zVNygt4o7P
/tmp/tmp.zVNygt4o7P

आप इसे स्क्रिप्ट में काफी आसानी से उपयोग कर सकते हैं:

tmpfile=$(mktemp)
echo "Some temp. data..." > $tmpfile
rm $tmpfile

मैन पेज को पढ़ना, आपको अपनी आवश्यकताओं के अनुसार विकल्प निर्धारित करने में सक्षम होना चाहिए। उदाहरण के लिए:

  • -d एक फ़ाइल के बजाय एक निर्देशिका बनाता है।
  • -u एक नाम उत्पन्न करता है, लेकिन कुछ भी नहीं बनाता है।

का उपयोग करके -uआप अस्थायी निर्देशिका को आसानी से प्राप्त कर सकते हैं ...

$ tmpdir=$(dirname $(mktemp -u))

के बारे mktempमें अधिक जानकारी यहाँ उपलब्ध है

मैक ओएस एक्स के बारे में संपादित करें: मैंने कभी मैक ओएसएक्स सिस्टम का उपयोग नहीं किया है, लेकिन नीचे टिलो की एक टिप्पणी के अनुसार, ऐसा लगता है कि मैक ओएसएक्स mktempआपको एक टेम्पलेट प्रदान करने की आवश्यकता है (जो कि लिनक्स पर एक वैकल्पिक तर्क है)। का हवाला देते हुए:

टेम्पलेट उदाहरण के लिए, इसमें "एक्स" की कुछ संख्या के साथ कोई फ़ाइल नाम हो सकता है /tmp/temp.XXXX। अनुगामी "Xs" को वर्तमान प्रक्रिया संख्या और / या एक अद्वितीय पत्र संयोजन के साथ बदल दिया जाता है। अद्वितीय फ़ाइल नाम mktemp की वापसी कर सकते हैं प्रदान की संख्या "Xs" पर निर्भर करता है; छह "Xs" के परिणामस्वरूप 56800235584 (62 ** 6) संभव फ़ाइल नामों में से 1 का चयन किया जाएगा।

मैन पेज यह भी कहता है कि यह कार्यान्वयन OpenBSD मैन पेज के लिए प्रेरित है mktemp। इसी तरह का एक विचलन ओपनबीडी और फ्रीबीएसडी उपयोगकर्ताओं द्वारा भी देखा जा सकता है ( इतिहास अनुभाग देखें )।

अब, जैसा कि आपने शायद देखा था, इसके लिए आपको एक पूर्ण फ़ाइल पथ निर्दिष्ट करना होगा, जिसमें आपके द्वारा खोजे जा रहे अस्थायी निर्देशिका भी शामिल है। इस छोटी सी समस्या को -tस्विच का उपयोग करके नियंत्रित किया जा सकता है । हालांकि इस विकल्प के लिए एक तर्क ( prefix) की आवश्यकता होती है , ऐसा प्रतीत होता है कि आवश्यक होने mktempपर निर्भर करता $TMPDIRहै।

सब सब में, आप का उपयोग करने के रूप में एक ही परिणाम प्राप्त करने में सक्षम होना चाहिए ...

$ tmpdir=$(dirname $(mktemp tmp.XXXXXXXXXX -ut))

मैक ओएस एक्स उपयोगकर्ताओं से किसी भी प्रतिक्रिया की बहुत सराहना की जाएगी, क्योंकि मैं खुद इस समाधान का परीक्षण करने में असमर्थ हूं।


ओपी ने इस मुद्दे को अब हटाए गए टिप्पणी में संबोधित किया; मुझे डर है कि मैं उन प्रणालियों के लिए एक उत्तर प्रदान नहीं कर सकता, जिन्हें gitbashशेल इंटरफ़ेस प्राप्त करने की आवश्यकता है, इसलिए मेरा "थोड़ा"। मैं वास्तव में यह बताने में असमर्थ रहूंगा कि अस्थायी फाइलें विंडोज सिस्टम पर कहां संग्रहीत की जाती हैं ...
जॉन डब्ल्यूएच स्मिथ

1
डिट्टो कि कुछ पागल c:\User\Name\..............\stuff। और उनमें से शायद 100 हैं। फिर भी, कुछ linux distros पागलपन के समान स्तर पर आ रहे हैं /var। मैं बिलकुल उत्सुक था। इसने मुझे ऐसा करने के लिए एक अजीब तरीके के रूप में मारा - मेरे अनुभव में हताशा बहुत पोर्टेबल है, और सुविधा कम है। वैसे भी बहुत अच्छा जवाब।
15

1
एक साल पहले या तो मैंने Windows पुनर्स्थापना बिंदु फ़ाइलों में हेरफेर करने के लिए एक बैश स्क्रिप्ट लिखी थी जो WinXP के माध्यम से Win2K पर काम करती है (बाद के संस्करण उस सामान को अलग तरीके से संभालते हैं)। मेरे स्क्रिप्ट का उपयोग करता है WINDOWS/Tempया Windows/Tempअपने अस्थायी फ़ाइलों के लिए डिफ़ॉल्ट निर्देशिका के रूप में; यह निर्देशिका विंडोज 7 मशीनों पर भी मौजूद है। लेकिन मेरी स्क्रिप्ट उपयोगकर्ता को कमांड लाइन पर एक वैकल्पिक अस्थायी डीआईआर की आपूर्ति करने की अनुमति देती है।
PM 2Ring

यह OS X पर काम नहीं करेगा, क्योंकि आपको एक टेम्प्लेट की आपूर्ति करनी है mktemp
टिलो

1
एल कैपिटन के बाद से, mktempबस काम करता है: सरल mktempएक फाइल लौटाता है, और mktemp -dएक निर्देशिका देता है; कोई टेम्पलेट की आवश्यकता है। हालांकि मैनुअल अपडेट नहीं किया गया है।
फ्रैंकलिन यू

9

यदि आप कम लाइनों में एक ही बात के लिए देख रहे हैं ...

for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
    test -d "$TMPDIR" && break
done

आप इसे एक में लिख सकते हैं।


यदि यह योग्य है तो आपको शायद परीक्षण भी करना चाहिए।
फ्रॉस्ट्सचुट्ज़

@ भजन: और यदि अन्य सभी विफल होते हैं, तो उपयोगकर्ता को अस्थायी फ़ाइलों के लिए एक पथ की आपूर्ति करने के लिए कहें, या उन्हें कमांड लाइन पर एक निर्दिष्ट करने की अनुमति दें।
PM 2Ring

6

आप ऐसा कर सकते हैं:

: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit

शेल को या तो 4 विकल्पों में से एक में एक निष्पादन योग्य निर्देशिका मिलनी चाहिए या एक सार्थक त्रुटि के साथ बाहर निकलना चाहिए। फिर भी, POSIX $TMPDIRचर को परिभाषित करता है (XCU सिस्टम के लिए) :

TMPDIR यह चर उन प्रोग्रामों के लिए उपलब्ध कराई गई निर्देशिका के पथनाम का प्रतिनिधित्व करेगा जिन्हें अस्थायी फ़ाइलों को बनाने के लिए जगह की आवश्यकता होती है।

इसके लिए भी /tmpमार्ग की आवश्यकता है ।


1
यह केवल सही उत्तर है यहाँ IMO। डनो यह क्या कर रहा है नीचे कोई वोट के साथ नीचे बैठे ...
ग्रीम

2
@ ग्रेमी: हो सकता है क्योंकि यह पूरी तरह से अपठनीय है?
ssc

मैंने उत्थान किया, लेकिन फिर उसे वापस ले लिया - हाँ, यह उत्तर एक गड़बड़ है, यह एक उपयोगी ट्रैक पर लगता है, लेकिन यह बिल्कुल स्पष्ट नहीं है कि कोड स्निपिट क्या करने की कोशिश कर रहा है - पहली पंक्ति एक टिप्पणी है और दूसरी एक त्रुटि है (वैसे भी, में)। कुछ काम कर सकते थे।
डॉन हैच

ओह मैं देख रहा हूं, उत्तर का पहला संस्करण स्पष्ट था (अभी भी 2 लाइन पर एक त्रुटि है अगर आप वास्तव में इसे चलाने की कोशिश करते हैं) ... और फिर संपादन की एक श्रृंखला ने कोड नमूने को पूरी तरह से रौंद दिया ताकि यह अब बकवास हो। एक और पास या दो का उपयोग कर सकता है :-)
डॉन हैच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.