ওএস এক্সে এমকেটেম্পের জন্য সমাধান বা বিকল্প


72

আমি বাশ স্ক্রিপ্টটি দেখছি অন্য কেউ লিখেছেন যে এটি ব্যবহার করে mktemp:

TEMP=`mktemp --directory`

তবে এই লাইনটি আমার মেশিনে কাজ করে না (ওএস এক্স 10.6)।

আমি এই লাইনটি কীভাবে ঠিক করব যাতে এটি ক্রস-আন * এক্স-লাইক-প্ল্যাটফর্মের সাথে সামঞ্জস্যপূর্ণ? সম্পাদনা: একটি বিকল্প কমান্ডও যথেষ্ট হবে।

উত্তর:


108

হার্ডকডিং ছাড়াই $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উপসর্গ শুধুমাত্র ম্যাক (যেখানে বিকল্প নির্ধারণ করা প্রয়োজন বোধ করা হয়) এ ব্যবহার করা হয়।


12
সত্যিই ঠাণ্ডা. কখনও কখনও ওএস এক্স ভিন্ন আচরণ বিরক্তিকর হয়।
Therealmarv

6
পছন্দ করুন
নিকিতা ভোলকভ

10
আমি কেবল mktemp -dওএস এক্স 10.11.5 এল ক্যাপিটেনে দৌড়েছি এবং এটি প্রত্যাশার মতো কাজ করেছে file $(mktemp -d): /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
হিথ সীমানা

2
হাঁ। আমি যেমন অবাক হয়েছি আপনি যেমন সবেমাত্র কাজ করেছেন ™
সীমানা

1
এছাড়াও যদি আপনি চালাতে mktemp -d -t 'mytmpdir'লিনাক্স (সাথে পরীক্ষিত mktempথেকে coreutils 8.26), আশা হিসাবে কাজ করে।

15

আপনাকে একটি টেম্পলেট সরবরাহ করতে হবে। mktemp -d /tmp/foo.XXXXকাজ করা উচিত. আমি কখনও দেখিনি --directory--দাড়ায় যে এটি একটি গনুহ এক্সটেনশান।


6
আপনি যদি $TMPDIRউপলভ্য ব্যবহার করতে চান তবে করুন mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX। এটি ম্যাকের উপর ব্যাশ এবং দেবিয়ানকে ড্যাশ করে কাজ করে, সুতরাং এটি বহনযোগ্য বলে মনে হয়।
টম অ্যান্ডারসন

9

পরিবর্তন --directoryকরুন -d। পূর্ববর্তীটি জিএনইউ-ইস্ম, তবে mktempকোর্টিলস থেকে প্রাপ্ত জিএনইউ সমর্থন করে -dmktempOS X এর মধ্যে বাসদ থেকে হিসাবে একই, তাই -dসিস্টেম যে আসলে একটি জাহাজ মধ্যে চমত্কার পোর্টেবল হওয়া উচিত mktempপ্রোগ্রাম।


আমি কেবল চেষ্টা করেছি mktemp -d, এবং এটিও কাজ করে না।
মনন।

1
কাইলের পুরো উত্তর আছে। mktempOS X এর উপর একটি টেমপ্লেট প্রয়োজন। আপনি যে স্ক্রিপ্টটি ব্যবহার করছেন তা জিএনইউ কনভেনশনগুলি ধরে নেয়, যা কোনও সরবরাহ না করা থাকলে একটি ডিফল্ট টেম্পলেট ব্যবহার করে।
জেমস স্নেরিংগার

সমস্যাটি হ'ল ইউনিক্স XXXXXটেমপ্লেটে সরবরাহ করার আশা করে যেখানে ওএস এক্স হিসাবে নিশ্চিত হয় না যে কোনও সামঞ্জস্যপূর্ণ টেম্পলেট পতাকা রয়েছে কিনা?
ব্যবহারকারী 3467349

2
mktempওএস এক্স 10.11.5-এ এল ক্যাপিটান আমার পক্ষে কাজ করে file $(mktemp -d)::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
সীমানা

4
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
  • mktempBSD এর জন্য ( ওএসএক্স সহ ) একটি টেম্পলেট প্রয়োজন, তবে এটি টেমপ্লেটে যে কোনও সংখ্যক Xগুলিকে মঞ্জুরি দেয় ।
  • mktempলিনাক্সের জন্য (জিএনইউ) কোনও টেমপ্লেটের প্রয়োজন হয় না, তবে যদি কোনও টেম্পলেট নির্দিষ্ট করা থাকে তবে এর সংখ্যা Xঅবশ্যই be হতে হবে must

নোট যেটি জিএনইউ-র-t জন্য অবহেলিতmktemp , তাই আরও ভবিষ্যতের-প্রমাণ কোড হবে

temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.