হার্ডকডিং ছাড়াই $TMPDIRবা লিনাক্স এবং ডারউইন উভয় (ম্যাক ওএস এক্স 10.11 এর পূর্বে সমস্ত সংস্করণ) কাজ করে এমন একটি অস্থায়ী ডিরেক্টরি তৈরি করতে আমি নিম্নলিখিতটি ব্যবহার করে শেষ করেছি /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
পটভূমি:
GNU mktemp কমান্ডের জন্য কোনও আর্গুমেন্টের প্রয়োজন নেই। সরল mktempকাজ করবে এবং সিস্টেমের অস্থায়ী ডিরেক্টরিতে একটি অস্থায়ী ফাইল তৈরি করবে।
সরল mktemp -dকোনও ফাইলের পরিবর্তে একটি ডিরেক্টরি তৈরি করবে যা আপনি লিনাক্সে ব্যবহার করতে চান।
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
ডিফল্টরূপে, GNU mktemp tmp.XXXXXXXXXXসাব ডিরেক্টরি (বা ফাইল) এর নামের জন্য টেমপ্লেট ব্যবহার করে। এই টেমপ্লেটটি কাস্টমাইজ -tকরতে , বিকল্পটি ব্যবহার করা যেতে পারে।
ওএসএক্সের এমকেটেম্পের কোনও ডিফল্ট টেম্পলেট নেই এবং নির্দিষ্ট করার জন্য একটি টেম্পলেট প্রয়োজন। দুর্ভাগ্যক্রমে, যেখানে জিএনইউ এমকেটেম্প টেমপ্লেটটিকে -tবিকল্প হিসাবে গ্রহণ করে, ওএসএক্সে এটি অবস্থানগত আর্গুমেন্ট হিসাবে পাস করা হয়। পরিবর্তে, ওএসএক্সের এমকেটেম্পে একটি -tবিকল্প রয়েছে যার অর্থ অন্য কিছু। -tওএসএক্স- এ বিকল্পটি টেমপ্লেটের জন্য "উপসর্গ" হিসাবে নথিভুক্ত করা হয়েছে। এটি প্রসারিত হয় {prefix}.XXXXXXXX, সুতরাং এটি এতে স্বয়ংক্রিয়ভাবে এক্স যুক্ত করে (যেমন টেম্প ডিরেক্টরিতে mktemp -d -t exampleতৈরি করতে পারে example.zEJZWCTQ)।
আমি অবাক হয়ে দেখেছি যে অনেকগুলি লিনাক্স পরিবেশে, ডিফল্টরূপে সেট করা $TMPDIRহয় না । অনেকগুলি সিএলআই প্রোগ্রাম সেট করার সময় এটি সমর্থন করে তবে এর জন্য একটি ডিফল্ট প্রয়োজন /tmp। এর অর্থ $TMPDIR/example.XXXXXXXXএমকেটেম্প বা এমকেডিরের কাছে যাওয়া বিপজ্জনক কারণ এটি /example.XXXXXXXXস্থানীয় ডিস্কের মূল ডিরেক্টরিতে তৈরি হতে পারে ($ টিএমপিডিআইআর আনসেট না হওয়া এবং খালি স্ট্রিং হয়ে যাওয়ার কারণে)।
ওএসএক্স- $TMPDIRএ সর্বদা সেট করা থাকে এবং (কমপক্ষে ডিফল্ট শেলটিতে) এটি সেট করা থাকে না /tmp(যা এতে একটি সিমলিংক /private/tmp) তবে /var/folders/dx/*****_*************/T। সুতরাং আমরা ওএসএক্সের জন্য যা কিছু করি না কেন, সেই ডিফল্ট আচরণকে সম্মান করা উচিত।
উপসংহার, নিম্নলিখিত কি আমি ব্যবহার শেষ পর্যন্ত হয় নির্ভরযোগ্যভাবে অস্থায়ী ডাইরেক্টরি উভয় লিনাক্স এবং ডারউইন উপর কাজ করে তৈরি (Mac OS X এর), hardcoding পারেন ছাড়া $TMPDIRবা /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
প্রথম অংশটি লিনাক্সের জন্য। এই আদেশটি 1"ব্যবহার: ..." এর সাথে প্রতিক্রিয়া জানিয়ে ত্রুটি স্থিতির কোড সহ ডারউইনে (ম্যাক ওএস এক্স) ব্যর্থ হবে । এজন্যই আমরা স্ট্ডারকে উপেক্ষা করি এবং তারপরে ম্যাক ভেরিয়েন্টটি কার্যকর করি। mytmpdirউপসর্গ শুধুমাত্র ম্যাক (যেখানে বিকল্প নির্ধারণ করা প্রয়োজন বোধ করা হয়) এ ব্যবহার করা হয়।