शेल में $ $ का क्या अर्थ है?


143

मैंने एक बार पढ़ा था कि अस्थायी फ़ाइलों के लिए शेल में एक अद्वितीय फ़ाइल नाम प्राप्त करने का एक तरीका डबल डॉलर साइन का उपयोग करना था ($$ ) । यह एक संख्या का उत्पादन करता है जो समय-समय पर बदलता रहता है ... लेकिन यदि आप इसे बार-बार कॉल करते हैं, तो यह उसी नंबर को वापस करता है। (समाधान सिर्फ समय का उपयोग करना है।)

मैं यह जानने के लिए उत्सुक हूं कि $$वास्तव में क्या है, और इसे अद्वितीय फ़ाइल नाम उत्पन्न करने के तरीके के रूप में क्यों सुझाया जाएगा।

जवाबों:


102

बैश $$में प्रक्रिया आईडी है, जैसा कि टिप्पणियों में उल्लेख किया गया है कि यह कई कारणों से अस्थायी फ़ाइल नाम के रूप में उपयोग करना सुरक्षित नहीं है।

अस्थायी फ़ाइल नामों के लिए, mktempकमांड का उपयोग करें ।


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

4
हाँ, $ $ का उपयोग करने से एक बुरा सुरक्षा छेद हो जाएगा। यह मत करो।
emk

7
या सवाल पूछने वाले को उच्च श्रेणी के उत्तर को नीचे दिए गए उत्तर के रूप में सेट करना चाहिए ...
jtimberman

6
मैं एसईओ के लिए "डॉलर डॉलर" जोड़ता हूं।
एंटोनी

1
यदि $ $ सिर्फ पीआईडी ​​आउटपुट करता है, तो यह "सुरक्षित नहीं" कैसे हो सकता है? सुरक्षा छेद खराब डिज़ाइन के आधार पर बनाया गया है जो tmp फ़ाइल नाम में PID का उपयोग नहीं करता है ... यदि आप आउटपुट की अखंडता के बारे में परवाह करते हैं जो tmp में इतना जाता है, तो शायद आपको इसे पहले स्थान पर भी नहीं रखना चाहिए? $ $ सुरक्षा छेद का कारण नहीं होगा, दूरदर्शिता की कमी
niken

113

$$बश में प्रक्रिया आईडी (पीआईडी) है। उपयोग करना $$एक बुरा विचार है, क्योंकि यह आमतौर पर एक दौड़ की स्थिति पैदा करेगा, और आपके शेल-स्क्रिप्ट को एक हमलावर द्वारा अवक्षेपित करने की अनुमति देगा। उदाहरण के लिए, ये सभी लोग, जिन्होंने असुरक्षित अस्थायी फाइलें बनाई थीं और उन्हें सुरक्षा सलाह जारी करनी पड़ी थी।

इसके बजाय, उपयोग करें mktempMktemp के लिए लिनक्स आदमी पेज उत्कृष्ट है। यहाँ से कुछ उदाहरण कोड है:

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

3
धन्यवाद। mktempविकल्प -tअब पदावनत किया गया है (मैं क्योंकि चार के साथ समस्याओं के बारे में सोच -)। इन दिनों का उपयोग करेंmktemp ${tempfoo}.XXXXXX । मैं आपकी पोस्ट को अपडेट करने के लिए स्वतंत्रता लेता हूं।
सेबेस्टियन

1
कृपया यह भी ध्यान दें, कि बैकटिक को हटा दिया गया था , इसलिए TMPFILE=$(mktemp)इसके बजाय उपयोग करें ।
माइकल कोप्प


7

UNIX में हर प्रक्रिया जैसे ऑपरेटिंग सिस्टम में एक (अस्थायी रूप से) विशिष्ट पहचानकर्ता, PID होता है। एक ही समय में चलने वाली कोई भी दो प्रक्रियाएँ एक ही PID नहीं हो सकती हैं, और $$ स्क्रिप्ट चलाने वाले bash उदाहरण के PID को संदर्भित करता है।

यह बहुत ज्यादा नहीं है समझ है कि यह पुनः उपयोग किया जा कभी नहीं होगा (वास्तव में, PIDs लगातार पुन: उपयोग किया जाता है) में एक अद्वितीय idenifier। जो आपको देता है वह एक संख्या है जैसे कि, यदि कोई अन्य व्यक्ति आपकी स्क्रिप्ट चलाता है, तो उन्हें एक अलग पहचानकर्ता मिलेगा, जबकि आपका अभी भी चल रहा है। एक बार जब आपकी मृत्यु हो जाती है, तो पीआईडी ​​को पुनर्नवीनीकरण किया जा सकता है और कोई और आपकी स्क्रिप्ट को चला सकता है, उसी पीआईडी ​​को प्राप्त कर सकता है, और इसलिए उसी फ़ाइल नाम को प्राप्त करें।

जैसे, यह वास्तव में केवल कहने के लिए समझदार है "$ $ एक फ़ाइलनाम देता है जैसे कि अगर कोई और एक ही स्क्रिप्ट चलाता है, जो मेरे उदाहरण अभी भी चल रहा है, तो उन्हें एक अलग नाम मिलेगा"।


5

$ $ आपका पीआईडी ​​है। यह वास्तव में एक अद्वितीय फ़ाइल नाम उत्पन्न नहीं करता है, जब तक कि आप सावधान न हों और कोई भी ठीक उसी तरह से न करे।

आमतौर पर आप कुछ ऐसा बनाते हैं जैसे / tmp / myprogramname $$

इसे तोड़ने के लिए बहुत सारे तरीके हैं, और यदि आप स्थानों को लिख रहे हैं तो अन्य लोग इसे लिख सकते हैं कि बहुत से OS पर यह अनुमान लगाना मुश्किल नहीं है कि आप जो PID करने जा रहे हैं और उसके चारों ओर पेंच है - कल्पना करें कि आप दौड़ रहे हैं रूट के रूप में और मैं / tmp / yourprogname13395 को सिम्लिंक के रूप में / etc / passwd को बनाता हूं - और आप इसमें लिखते हैं।

यह एक शेल स्क्रिप्ट में एक बुरी बात है। यदि आप किसी चीज़ के लिए एक अस्थायी फ़ाइल का उपयोग करने जा रहे हैं, तो आपको एक बेहतर भाषा का उपयोग करना चाहिए, जो कम से कम आपको फ़ाइल को खोलने (बनाने) के लिए "अनन्य" ध्वज जोड़ने देगा। तो फिर आप यह सुनिश्चित कर सकते हैं कि आप किसी और चीज़ को पसंद नहीं कर रहे हैं।


3

$$ वर्तमान शेल प्रक्रिया का पिड है। यह अद्वितीय फ़ाइल नाम उत्पन्न करने का एक अच्छा तरीका नहीं है।


3

$$ शेल इंटरप्रेटर की पिप (प्रोसेस आईडी) है जो आपकी स्क्रिप्ट को चला रहा है। यह इस समय एक सिस्टम पर चल रही प्रत्येक प्रक्रिया के लिए अलग है, लेकिन समय के साथ-साथ पीआईडी ​​चारों ओर घूमता है, और आपके बाहर निकलने के बाद अंततः उसी पिड के साथ एक और प्रक्रिया होगी। जब तक आप चल रहे हैं, तो पीआईडी ​​आपके लिए अद्वितीय है।

ऊपर की परिभाषा से यह स्पष्ट होना चाहिए कि आप किसी स्क्रिप्ट में कितनी बार $ $ का उपयोग करते हैं, यह एक ही नंबर वापस नहीं करेगा।

आप उन चीजों के लिए अपनी अस्थायी फ़ाइल के रूप में /tmp/myscript.scratch.$$ का उपयोग कर सकते हैं, जिनकी आवश्यकता अत्यंत विश्वसनीय या सुरक्षित नहीं है। अपनी स्क्रिप्ट के अंत में, उदाहरण के लिए, ट्रैप कमांड का उपयोग करके ऐसी अस्थायी फ़ाइलों को हटाना एक अच्छा अभ्यास है:

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

2

यह बैश प्रक्रिया की प्रक्रिया आईडी है। किसी भी समवर्ती प्रक्रियाओं में कभी भी समान पीआईडी ​​नहीं होगी।


2

$ $ शेल की प्रक्रिया आईडी है जिसमें आपकी स्क्रिप्ट चल रही है। अधिक जानकारी के लिए, श या बैश के लिए मैन पेज देखें। मैन पेज या तो कमांड लाइन "मैन श" का उपयोग कर सकते हैं, या "शेल मैनपेज" के लिए वेब पर खोज कर सकते हैं।


2

मुझे दूसरे ईमेक का उत्तर दें - $ $ का उपयोग स्वयं "अनोखा" कुछ भी न करें। फ़ाइलों के लिए, mktemp का उपयोग करें। एक ही बैश स्क्रिप्ट के भीतर अन्य आईडी के लिए, "$ $ $ (तारीख +% s% N)" का उपयोग एक विशिष्ट रूप से अच्छे अवसर के लिए किया जाता है।

 -k

0

इसके अलावा, आप इस आदेश के माध्यम से लॉगिन उपयोगकर्ता नाम ले सकते हैं। उदाहरण के लिए।

echo $(</proc/$$/login id). After that, you need to use getent command.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.