একাধিক প্ল্যাটফর্মে সঠিক টিএমপি ডির সন্ধান করা


46

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা এর কাজের জন্য অস্থায়ী ফাইল তৈরি করতে হবে এবং নিজের পরে পরিষ্কার করতে হবে। আমার প্রশ্নটি অস্থায়ী ফাইলগুলির জন্য সঠিক বেস ডিরেক্টরিটি সম্পর্কে।

স্ক্রিপ্টটির একাধিক প্ল্যাটফর্মগুলিতে কাজ করা দরকার: গিট ব্যাশ (উইন্ডোজ), সোলারিস, লিনাক্স, ওএসএক্স। প্রতিটি প্ল্যাটফর্মে, পছন্দের টেম্প ডিরেক্টরিটি আলাদাভাবে প্রকাশ করা হয়:

  • উইন্ডোজ: %TMP%(এবং সম্ভবত %TEMP%)
  • ওএসএক্স: $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 ওএসএক্সের জন্য আপনাকে একটি টেমপ্লেট সরবরাহ করতে হবে (এটি লিনাক্সের উপর একটি optionচ্ছিক যুক্তি)। বরাত দিয়ে:

উদাহরণস্বরূপ, টেমপ্লেটটি কয়েকটি সংখ্যক "এক্স" যুক্ত যুক্ত ফাইলের নাম হতে পারে /tmp/temp.XXXX। চলমান "Xs" বর্তমান প্রক্রিয়া নম্বর এবং / অথবা একটি অনন্য বর্ণের সংমিশ্রণ দ্বারা প্রতিস্থাপিত হয়। এমকেটেম্প ফিরিয়ে আনতে পারে এমন অনন্য ফাইলের নাম সরবরাহ করা "এক্স" এর সংখ্যার উপর নির্ভর করে; ছয় "এক্সস" এর ফলে এমকেটেম্প 56800235584 (62 ** 6) সম্ভাব্য ফাইলের নাম নির্বাচন করবে।

ম্যান পৃষ্ঠাটি আরও বলেছে যে এই প্রয়োগটি ওপেনবিএসডি ম্যান পৃষ্ঠাটির জন্য অনুপ্রাণিত mktemp। অনুরূপ একটি বিকিরণ অতএব পাশাপাশি OpenBSD ও FreeBSD ব্যবহারকারীদের দ্বারা পালিত হতে পারে (দেখুন ইতিহাস অধ্যায়)।

এখন, আপনি সম্ভবত লক্ষ্য করেছেন, এর জন্য আপনাকে আপনার প্রশ্নের মধ্যে যে অস্থায়ী ডিরেক্টরিটি সন্ধান করছেন সেগুলি সহ একটি সম্পূর্ণ ফাইলের পথ নির্দিষ্ট করতে হবে। এই সামান্য সমস্যাটি -tস্যুইচ ব্যবহার করে পরিচালনা করা যায় । এই বিকল্পটির জন্য একটি আর্গুমেন্ট ( prefix) লাগবে বলে মনে হচ্ছে , এটি উপস্থিত হবে যখন প্রয়োজনের mktempউপর নির্ভর করে $TMPDIR

সব মিলিয়ে, আপনি ব্যবহার করে উপরের মত একই ফলাফল পেতে সক্ষম হওয়া উচিত ...

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

ম্যাক ওএস এক্স ব্যবহারকারীদের যে কোনও প্রতিক্রিয়া প্রশংসিত হবে, কারণ আমি নিজেই এই সমাধানটি পরীক্ষা করতে অক্ষম।


ওপি এই বিষয়টিকে এখন মুছে ফেলা মন্তব্যে সম্বোধন করেছে; আমি আশঙ্কা করছি যে সিস্টেমগুলির জন্য gitbashশেল ইন্টারফেস পাওয়া দরকার তার জন্য আমি উত্তর সরবরাহ করতে পারি না , সুতরাং আমার "সামান্য"। উইন্ডোজ সিস্টেমে টেম্প ফাইলগুলি কোথায় সংরক্ষিত আছে তা আমি বলতে অক্ষম হব ...
জন ডাব্লুএইচ স্মিথ

1
এই যে। কিছু পাগল c:\User\Name\..............\stuff। এবং তাদের মধ্যে সম্ভবত 100 রয়েছে। তবুও কিছু লিনাক্স ডিস্ট্রোগুলি একই স্তরের পাগলামির দিকে এগিয়ে চলেছে /var। আমি শুধু কৌতুহলী ছিলাম. এটিকে আমার কাছে রাখার এক বিজোড় উপায় হিসাবে এটি আঘাত করেছিল - আমার অভিজ্ঞতায় হতাশা খুব বহনযোগ্য, এবং সুবিধাও কম। যাইহোক খুব ভাল উত্তর।
মাইকজার্ভ

1
এক বছর বা তার আগে আমি উইন্ডোজ রিস্টোর পয়েন্ট ফাইলগুলি উইনএক্সপি-এর মাধ্যমে উইন 2 কে-তে কাজ করে তা পরিচালনা করতে বাশ স্ক্রিপ্ট লিখেছিলাম (পরবর্তী সংস্করণগুলি সেই স্টাফটিকে অন্যভাবে পরিচালনা করে)। আমার স্ক্রিপ্টটি এর অস্থায়ী ফাইলগুলির জন্য WINDOWS/Tempবা Windows/Tempডিফল্ট ডিরেক্টরি হিসাবে ব্যবহার করে; সেই ডিরেক্টরিটি উইন্ডোজ 7 মেশিনেও বিদ্যমান। তবে আমার স্ক্রিপ্টটি ব্যবহারকারীকে কমান্ড লাইনে একটি বিকল্প টেম্প ডির সরবরাহ করতে দেয়।
প্রধানমন্ত্রী 2 রিং

এটি ওএস এক্সে কাজ করবে না, কারণ আপনাকে কোনও টেমপ্লেট সরবরাহ করতে হবে mktemp
টাইলো

1
যেহেতু এল ক্যাপিটান, mktempকেবল কাজ করে: সাধারণ mktempএকটি ফাইল দেয় এবং mktemp -dডিরেক্টরিটি দেয়; কোন টেম্পলেট প্রয়োজন। ম্যানুয়াল যদিও আপডেট করা হয় না।
ফ্র্যাঙ্কলিন ইউ

9

আপনি যদি কম লাইনে একই জিনিসটি সন্ধান করছেন ...

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

আপনি এই এক লিখতে পারে।


এটি সম্ভবত লেখার যোগ্য কিনা তাও আপনার পরীক্ষা করা উচিত।
frostschutz

@ জ্যানোস: এবং যদি সমস্ত কিছু ব্যর্থ হয় তবে ব্যবহারকারীকে অস্থায়ী ফাইলগুলির জন্য একটি পাথ সরবরাহ করতে বলুন, বা কমান্ড লাইনে একটি নির্দিষ্ট করার অনুমতি দিন।
প্রধানমন্ত্রী 2 রিং

6

আপনি করতে পারেন:

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

শেলটি হয় 4 টি বিকল্পের একটিতে এক্সিকিউটেবল ডিরেক্টরি খুঁজে পাওয়া উচিত বা একটি অর্থবহ ত্রুটি সহ প্রস্থান করা উচিত। তবুও, পসিএক্স $TMPDIRভেরিয়েবলটি নির্ধারণ করে (এক্সসিইউ সিস্টেমের জন্য) :

TMPDIR এই পরিবর্তনশীলটি অস্থায়ী ফাইলগুলি তৈরি করার জন্য একটি স্থান প্রয়োজন এমন প্রোগ্রামগুলির জন্য উপলভ্য ডিরেক্টরিগুলির ডিরেক্টরিটির প্রতিনিধিত্ব করবে।

এটিরও /tmpপথ প্রয়োজন ।


1
এখানে আইএমওর একমাত্র সঠিক উত্তর। ডান্নো কোন ভোট না দিয়ে নীচে বসে এটি কি করছে ...
গ্রায়েম

2
@ গ্রামীম: সম্ভবত কারণ এটি একেবারে অপঠনযোগ্য?
এসএসসি

আমি upvated কিন্তু তারপর এটি প্রত্যাহার - হ্যাঁ, এই উত্তরটি একটি জগাখিচুড়ি মনে হচ্ছে, এটি একটি দরকারী ট্র্যাকের উপর রয়েছে বলে মনে হচ্ছে, তবে কোড স্নিপিত কী করার চেষ্টা করছে তা মোটেও পরিষ্কার নয় - প্রথম লাইনটি একটি মন্তব্য এবং দ্বিতীয়টি একটি ত্রুটি (বাশ, যাইহোক)। কিছু কাজ ব্যবহার করতে পারে।
ডন হ্যাচ

ওহ আমি দেখতে পাচ্ছি, উত্তরের প্রথম সংস্করণটি আরও পরিষ্কার ছিল (আপনি যদি এখনও এটি চালানোর চেষ্টা করেন তবে ২ য় লাইনে একটি ত্রুটি) ... এবং তারপরে কয়েকটি ধারাবাহিক সম্পাদনা কোড নমুনাকে সম্পূর্ণরূপে ট্র্যাশ করেছে যাতে এটি এখন বাজে কথা। আরেকটি পাস বা দুটি ব্যবহার করতে পারে :-)
ডন হ্যাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.