শেলের মধ্যে $$ এর অর্থ কী?


143

আমি একবার পড়লাম যে টেম্প ফাইলগুলির জন্য শেলের একটি অনন্য ফাইল নাম পাওয়ার এক উপায় হ'ল ডাবল ডলার চিহ্ন ( $$) ব্যবহার করা। এটি এমন একটি সংখ্যা তৈরি করে যা সময়ে সময়ে পরিবর্তিত হয় ... তবে আপনি যদি বার বার এটি কল করেন তবে এটি একই নম্বরটি দেয়। (সমাধানটি কেবলমাত্র সময়টি ব্যবহার করা))

আমি $$আসলে কী তা জানতে আগ্রহী এবং কেন এটি অনন্য ফাইলের নাম তৈরির উপায় হিসাবে প্রস্তাবিত হবে।

উত্তর:


102

বাশ- $$এ প্রক্রিয়া আইডি রয়েছে, মন্তব্যে উল্লিখিত হিসাবে বিভিন্ন কারণে টেম্প ফাইল ফাইল হিসাবে ব্যবহার করা নিরাপদ নয়।

অস্থায়ী ফাইলের নামের জন্য, mktempকমান্ডটি ব্যবহার করুন ।


35
কেবলমাত্র শীর্ষ উত্তরের দিকে নজর দেওয়া লোকদের জন্য, publicly সর্বজনীন-লিখনযোগ্য ডিরেক্টরিতে (যেমন, / টিএমপি) লিখলে একটি ফাইলের জন্যও ভাল নয়। সিমলিঙ্কগুলি সহ লিটার / টিএমপি করা সহজ যা আপনার স্ক্রিপ্টটিকে কোথাও অনাকাঙ্ক্ষিতভাবে লিখতে বাধ্য করে। এমকেটেম্প আরও ভাল।
ক্রিস জেস্টার-ইয়াং

4
হ্যাঁ, using ব্যবহারের কারণে একটি দুষ্টু সুরক্ষা গর্ত হবে। এটা করবেন না।
emk

7
অথবা যে ব্যক্তি প্রশ্নটি জিজ্ঞাসা করেছে তার নীচে উচ্চতর রেট দেওয়া উত্তর গ্রহণযোগ্য উত্তর হিসাবে সেট করা উচিত ...
jtimberman

6
আমি SEO এর জন্য "ডলার ডলার" যুক্ত করি।
এন্টোইন

1
যদি $$ স্রেফ পিড আউটপুট করে দেয় তবে কীভাবে এটি "নিরাপদ নয়" হতে পারে? সুরক্ষা ছিদ্র টিএমপি ফাইলের নামগুলিতে পিআইডি ব্যবহার না করার কারণে তৈরি করা হয়েছে ... আপনি যদি আউটপুটটির এতটাই ট্যাম্পে যায় তার সততার বিষয়ে যদি আপনি যত্নশীল হন, তবে আপনি এটি সেখানে প্রথম স্থানটিতে রাখবেন না? security সুরক্ষা গর্ত সৃষ্টি করবে না, দূরদর্শিতার অভাব করবে না
নিকান

113

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

পরিবর্তে, ব্যবহার করুন mktempMktemp জন্য লিনাক্স man পৃষ্ঠা চমৎকার। এটি থেকে কিছু উদাহরণ কোড এখানে:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE

3
ধন্যবাদ। mktempবিকল্প -tবর্তমানে অবচিত হয়েছে (আমি কারণ গৃহস্থালির কাজ সঙ্গে সমস্যা মনে -)। এই দিন ব্যবহার করুনmktemp ${tempfoo}.XXXXXX । আমি আপনার পোস্ট আপডেট করার জন্য স্বাধীনতা গ্রহণ।
সেবাস্তিয়ান

1
দয়া করে নোট করুন, যে ব্যাকটিকটি অবচিত ছিল , সুতরাং TMPFILE=$(mktemp)পরিবর্তে ব্যবহার করুন।
মাইকেল Kopp


7

অপারেটিং সিস্টেমের মতো ইউএনআইএক্সের প্রতিটি প্রক্রিয়াটির একটি (অস্থায়ীভাবে) স্বতন্ত্র সনাক্তকারী, পিআইডি থাকে। একই সময়ে চলমান কোনও দুটি প্রক্রিয়াতে একই পিআইডি থাকতে পারে না, এবং the স্ক্রিপ্টটি চালাচ্ছে এমন ব্যাশের উদাহরণের পিআইডি বোঝায়।

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

এই হিসাবে, এটি বলা সত্যিই বুদ্ধিমান হয় যে "a এমন একটি ফাইল নাম দেয় যাতে অন্য কেউ যদি একই স্ক্রিপ্ট চালায় তবে আমার উদাহরণটি এখনও চলছে, তারা আলাদা নাম পাবে"।


5

your হ'ল আপনার পিআইডি। যদি আপনি সতর্ক হন এবং অন্য কেউ ঠিক একইভাবে না করে তবে এটি সত্যিই একটি অনন্য ফাইল নাম তৈরি করে না।

সাধারণত আপনি / tmp / myprogramname like এর মতো কিছু তৈরি করতে চান $$

এটি ভাঙার অনেকগুলি উপায় রয়েছে এবং আপনি যদি অন্য লোকেরা লোকেরা লিখতে পারেন তবে অনেক ওএসের কাছে আপনার পিআইডি কী হবে এবং ভবিষ্যতে কী ঘটবে তা অনুমান করা খুব কঠিন নয় - আপনি চালাচ্ছেন তা কল্পনা করুন রুট হিসাবে এবং আমি / tmp / yourprogname13395 / etc / passwd- এ ইঙ্গিত করে একটি সিমিলিংক হিসাবে তৈরি করি এবং আপনি এতে লিখেন।

এটি শেল স্ক্রিপ্টে করা খারাপ কাজ। যদি আপনি কোনও কিছুর জন্য অস্থায়ী ফাইল ব্যবহার করতে চলেছেন তবে আপনার আরও ভাল ভাষা ব্যবহার করা উচিত যা অন্তত ফাইলটি খোলার (তৈরি করার) জন্য "একচেটিয়া" পতাকা যুক্ত করতে দেবে। তারপরে আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি অন্য কিছু ক্লোবার্ব করছেন না।


3

$$ হ'ল বর্তমান শেল প্রক্রিয়াটির পিড। এটি অনন্য ফাইলের নাম উত্পাদন করার ভাল উপায় নয়।


3

হ'ল আপনার স্ক্রিপ্টটি চালিত শেল ইন্টারপ্রেটারের পিড (প্রসেস আইডি)। এই মুহুর্তে একটি সিস্টেমে চলমান প্রতিটি প্রক্রিয়াটির জন্য এটি আলাদা, তবে সময়ের সাথে সাথে পিডটি চারপাশে আবৃত হয় এবং আপনি প্রস্থান করার পরে অবশেষে একই পিডের সাথে আরও একটি প্রক্রিয়া আসবে s যতক্ষণ আপনি চালাচ্ছেন, পিডটি আপনার পক্ষে অনন্য।

উপরের সংজ্ঞাটি থেকে এটি সুস্পষ্ট হওয়া উচিত যে আপনি স্ক্রিপ্টে কতবার ব্যবহার করেন না it এটি একই সংখ্যায় ফিরে আসবে।

আপনি অত্যন্ত নির্ভরযোগ্য বা সুরক্ষিত হওয়া দরকার না এমন জিনিসগুলির জন্য আপনার টেম্পোর ফাইল হিসাবে উদাহরণস্বরূপ /tmp/myscript.scratch. use ব্যবহার করতে পারেন। উদাহরণস্বরূপ ট্র্যাপ কমান্ডটি ব্যবহার করে আপনার স্ক্রিপ্টের শেষে এই জাতীয় টেম্প ফাইলগুলি মুছে ফেলা ভাল অভ্যাস

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT

2

এটি ব্যাশ প্রক্রিয়াটির প্রক্রিয়া আইডি। কোনও সমবর্তী প্রক্রিয়াতে আর একই পিআইডি থাকবে না।


2

$$ হ'ল শেলটির প্রক্রিয়া আইডি যেখানে আপনার স্ক্রিপ্ট চলছে। আরও বিশদের জন্য শ বা বাশের জন্য ম্যান পৃষ্ঠাটি দেখুন। ম্যান পেজগুলি "man sh" কমান্ড লাইন ব্যবহার করে বা "শেল ম্যানপেজ" এর জন্য ওয়েবে অনুসন্ধান করে খুঁজে পাওয়া যাবে


2

আমাকে দ্বিতীয় ইমকের উত্তরটি দেওয়া যাক - একটি "অনন্য" কিছু হিসাবে নিজেই ব্যবহার করবেন না। ফাইলগুলির জন্য, mktemp ব্যবহার করুন। একই বাশ স্ক্রিপ্টের অন্যান্য আইডির জন্য , স্বতন্ত্রতার পক্ষে যুক্তিযুক্ত ভাল সুযোগের জন্য "$$$ (তারিখ +% s% N)" ব্যবহার করুন ।

 -k

0

এছাড়াও, আপনি এই কমান্ডের মাধ্যমে লগইন ব্যবহারকারীর নাম দখল করতে পারেন। যেমন।

echo $(</proc/$$/login id). After that, you need to use getent command.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.