स्पर्श नई फ़ाइलें क्यों बनाता है?


13

मुझे पता है कि touchकमांड का उपयोग किसी फाइल पर अंतिम संशोधन की तारीख को अपडेट करने के लिए किया जाता है। यदि फ़ाइल फ़ाइल सिस्टम पर मौजूद नहीं है, तो एक नई फ़ाइल बनाने के लिए भी इसका उपयोग किया जाता है।

स्पर्श के बाद से (जैसा कि यह नाम का तात्पर्य है), बस अंतिम तिथि को अद्यतन करना चाहिए, यह एक नई फ़ाइल बनाने की कोशिश भी क्यों करता है?

क्या यह केवल टच कोड में लिखा गया चेक है, या यह कुछ और है जो फ़ाइल बनाने का कारण बनता है?


उपयोग के मामले के रूप में, मैं अगले रिबूट पर त्रुटियों के लिए जाँच करने के लिए फ़ाइल सिस्टम को मजबूर touch /forcefsckकरने के लिए एक खाली फ़ाइल बनाने के लिए उपयोग करता हूं /forcefsck। फ़ाइल को स्वयं कुछ भी शामिल करने की आवश्यकता नहीं है, इसे बस मौजूद रहने की आवश्यकता है। इसके बिना touch, मुझे खाली फ़ाइल को उपयोग करने viया nanoसहेजने की आवश्यकता होगी । बहुत जल्दी उपयोग करने के लिए touch
टिम

@ यह कोई वास्तविक कारण नहीं है जिसका आप उपयोग नहीं कर सकते हैं >/forcefsckया printf '' >>/forcefsck(बाद वाला किसी भी मौजूदा सामग्री को संरक्षित करेगा)। आप जो वर्णन करते हैं वह एक उपयोगिता का उपयोग करने का एक तरीका है जो एक निश्चित तरीके से काम करता है, लेकिन इसका कोई वास्तविक असर नहीं है कि यह उस तरह से काम करने के लिए क्यों लिखा गया है।
बजे एक CVn

अगर यह सवाल touchकाम करने के तरीके के डिज़ाइन के बारे में है , तो मुझे लगता है touchकि फ़ाइल निर्माण साइड इफेक्ट के साथ सिंगल रिस्पांसिबिलिटी सिद्धांत का उल्लंघन करता है। इसलिए, "क्यों" बस शुरुआती डिजाइन विकल्पों के कारण है जो लोकप्रियता और प्रचलन / उपयोग में आसानी के कारण फंस गए।
जॉर्ज पेंटाज़

जवाबों:


15

strace touch tपैदावार का उपयोग :

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

यह touchकोड में है और मैं इसे चेक नहीं कहूंगा । लिखने के लिए फाइल खोलकर टाइमस्टैम्प को अपडेट किया जाता है और फिर इसे बंद कर दिया जाता है।


14

touchयदि फ़ाइल मौजूद नहीं है, तो एक नई, खाली फ़ाइल बनाता है क्योंकि यही वह करने के लिए डिज़ाइन किया गया था। उपयोगिता में उस मामले को विशेष रूप से संभालने के लिए कोड शामिल होता है। यूनिक्स V7 में उपयोगिता दिखाई दी ; इसके मैनुअल ने इसे इस प्रकार वर्णित किया:

स्पर्श - अद्यतन तिथि एक फ़ाइल के अंतिम रूप से संशोधित

touchप्रत्येक फ़ाइल की संशोधित तिथि निर्धारित करने का प्रयास । यह फ़ाइल से एक चरित्र को पढ़ने और इसे वापस लिखने के द्वारा किया जाता है। यदि ** फ़ाइल मौजूद नहीं है, तो -cविकल्प के निर्दिष्ट होने तक इसे बनाने का प्रयास किया जाएगा ।

(मुझे नहीं पता कि touchफ़ाइल खाली होने पर क्या किया गया था। अंतर्निहित सिस्टम कॉल बाद में आया था।)

मुझे यकीन नहीं है कि touchफाइल को बनाने के लिए क्यों बनाया गया था, लेकिन मुझे संदेह है कि इसकी वजह है make। आप वर्तमान समय में फ़ाइल का संशोधन समय क्यों सेट करना चाहते हैं? ऐसे मामले हैं जहां एक विशेष समय के लिए संशोधन समय निर्धारित करना उपयोगी हो सकता है, लेकिन यह क्षमता बाद में आई, मूल touchकेवल वर्तमान समय में संशोधन समय निर्धारित कर सकता है। ऐसा करने का एक कारण एक makeनियम को फिर से चलाना है जो फ़ाइल पर निर्भर करता है।

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

लेकिन क्या होगा अगर उत्पन्न करने के नियम barबदल गए हैं? फिर आपके पास दो विकल्प हैं:

  • rm bar; make bar
  • touch foo; make bar

आपको fooउत्पन्न करने के लिए मौजूद रहने की आवश्यकता होगी bar, अन्यथा कमांड आमतौर पर काम नहीं करेगा।

"टच" शब्दावली भी makeउपयोगिता में मौजूद थी : make -t barकेवल कमांड चलाने का दिखावा करेगा, अर्थात यह barवर्तमान समय के संशोधन समय को वास्तव में उत्पन्न करने के लिए कमांड को चलाने के बिना सेट करेगा bar(यदि आप सोचते हैं तो आप ऐसा करेंगे। परिवर्तन को fooप्रभावित नहीं करना चाहिए bar)। touchउपयोगिता इसलिए की एक स्टैंडअलोन संस्करण था make -tसुविधा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.