2010-08-11 13 views
6

में हमेशा के लिए एक फ़ाइल खोलें रखें, मुझे एक प्रक्रिया को एक निश्चित फ़ाइल हमेशा के लिए खोलने के लिए एक तरीका चाहिए। यहाँ मैं अब तक राशि का एक उदाहरण है:एक बैश स्क्रिप्ट

sleep 1000 > myfile &

यह एक हजार सेकंड के लिए काम करता है, लेकिन वास्तव में कुछ जटिल नींद/पाश बयान बनाने के लिए नहीं करना चाहती। This post ने सुझाव दिया कि cat असीमित के लिए sleep जैसा ही है। तो मैं इस कोशिश की:

cat > myfile &

यह लगभग यह एक गलती की तरह लग रहा है ना? यह कमांड लाइन से काम करना प्रतीत होता था, लेकिन एक स्क्रिप्ट में फ़ाइल कनेक्शन खुला नहीं रहा था। कोई अन्य विचार?

+0

काफी यकीन है कि तुम क्यों एक फ़ाइल खुला हमेशा के लिए है, लेकिन कुछ नहीं कर रखने की जरूरत है? क्या आप सिर्फ एक फ़ोल्डर को हटाने के लिए नहीं हैं? –

उत्तर

5

कारण cat>myfile& काम करता है क्योंकि यह फ़ाइल में मानक इनपुट को फिर से निर्देशित करता है।

यदि आप इसे एम्पर्सेंड (पृष्ठभूमि में) के साथ लॉन्च करते हैं, तो उसे फ़ाइल के अंत सहित कोई भी इनपुट नहीं मिलेगा, जिसका अर्थ है कि यह हमेशा के लिए प्रतीक्षा करेगा और आउटपुट फ़ाइल को कुछ भी प्रिंट नहीं करेगा। , एक पृष्ठभूमि प्रक्रिया का उपयोग करने से

tail -f /dev/null > myfile & 
+0

यह काम करता है! मुझे अभी भी समझ में नहीं आता कि क्यों 'बिल्ली' टर्मिनल पर काम करता था लेकिन एक स्क्रिप्ट में नहीं। टर्मिनल पर, मुझे "स्टॉप" की अधिसूचना मिलती है और लिपि मुझे यह नहीं देती है। यह कारण का हिस्सा होना चाहिए। – User1

+0

@ उपयोगकर्ता 1 - मैं अनुमान लगा सकता हूं कि बिल्ली क्यों काम नहीं करती लेकिन ईमानदार होने के लिए मुझे निश्चित रूप से 100% पता नहीं है। शायद कुछ अजीब एसडीटीआईएन और टीटीआई बातचीत, शायद। यह पूछने के लिए स्वतंत्र महसूस करें कि यदि आप वास्तव में रुचि रखते हैं तो एक अलग प्रश्न के रूप में, मुझे यकीन है कि किसी को निश्चित रूप से अनावश्यकता पता चलेगी और मैं भी उत्सुक हूं - mysefl की जांच करने का कोई समय नहीं। – DVK

0
tail -f myfile 

यह फ़ाइल का अनुसरण करता है, और फ़ाइल में किसी भी बदलाव को आउटपुट करता है। आप tail के उत्पादन को देखने के लिए नहीं करना चाहते हैं, /dev/null या कुछ और करने के लिए उत्पादन अनुप्रेषित:

tail -f myfile > /dev/null 

आप अपने विशेष मामले के आधार पर --retry विकल्प का उपयोग करने, कर सकते हैं। अधिक जानकारी के लिए man tail देखें।

+0

यह वह नहीं करेगा जो वह चाहता है, जो फाइल को लिखने के लिए खुला रखता है। यह केवल इससे पढ़ा जाएगा। – DVK

+0

@ डीवीके, उन्होंने कहा 'फ़ाइल को खोलें', 'लेखन के लिए नहीं'। – strager

+0

नहीं, लेकिन '> myfile' का तात्पर्य है कि उसका लेखन करना था। –

12

बल्कि आप:

आप मानक इनपुट पर निर्भरता के बिना छोड़कर, एक बराबर प्रभाव प्राप्त कर सकते हैं इस आदेश के साथ, (बाद में यह अपनी स्क्रिप्ट में काम नहीं करता है क्या है) यह भी सिर्फ अपनी फ़ाइल वर्णनकर्ता में से एक को खोलने के लिए पार्टी का उपयोग कर सकते हैं:

exec 5>myfile 

(exec का विशेष उपयोग यहाँ वर्तमान फ़ाइल वर्णनकर्ता पुनर्निर्देशन परिवर्तित करने देता है - man bash जानकारी के लिए देखें)। यह फ़ाइल माईस्क्रिप्टर 5 को "माईफाइल" में खोल देगा (अगर आप फ़ाइल को खाली नहीं करना चाहते हैं तो >> का उपयोग करें)।

आप बाद के साथ फिर से फ़ाइल को बंद कर सकते हैं:

exec 5>&- 

(इस का एक संभव नकारात्मक पक्ष यह है कि एफडी हर कार्यक्रम है कि इस बीच में खोल रन ज्यादातर यह हानिरहित है द्वारा विरासत में मिला हो जाता है - जैसे अपने। चल cat > myfile & मुद्दे पर, लेकिन यह कुछ मामलों में कष्टप्रद हो सकता है, खासकर यदि आप किसी भी प्रक्रियाओं है कि चारों ओर रहने अंडे (क्योंकि वे तो एफडी खुला रखेंगे)

+0

यह एक अद्भुत और वास्तव में अनुचित विशेषता है - धन्यवाद! –

+1

यह वास्तव में शानदार है। मैं 'exec 3 >>/home/me/myfile' चला सकता हूं और फिर कई फ़ाइलों से आउटपुट को fd 3 (जैसे' grep thing file >> 3') पर रीडायरेक्ट कर सकता हूं और पथ को टाइप किए बिना एक ही फाइल में कई चीजें जोड़ सकता हूं हर बार। जब मैं करूँगा तो मैं फाइल बंद कर सकता हूं। मुझे यह पसंद है। धन्यवाद दोस्त। – vastlysuperiorman

+1

@vastlysuperiorman: आपका स्वागत है! मुझे लगता है कि आपका grep 'grep चीज़ फ़ाइल> और 3' होना चाहता है, लेकिन हाँ, विचार ध्वनि है :) – psmears

1

- grep और sed रों आम तौर पर अतिरिक्त एफडी पर ध्यान नहीं देगा। टर्मिनल में एक स्क्रिप्ट के हिस्से के रूप में नहीं चल रहा है: एक गैर-संवादात्मक में वह पृष्ठभूमि command & के stdin को /dev/null से पूर्ण रूप से पुनर्निर्देशित किया जाएगा।

तो, एक स्क्रिप्ट में cat > myfile & वास्तव में cat </dev/null > myfile में अनुवादित हो जाता है, जो तुरंत cat को समाप्त करता है।

शेल कमांड भाषा & Asynchronous Lists पर POSIX मानक देखें:

The standard input for an asynchronous list, before any explicit redirections are 
performed, shall be considered to be assigned to a file that has the same 
properties as /dev/null. If it is an interactive shell, this need not happen. 
In all cases, explicit redirection of standard input shall override this activity. 

# some tests 
sh -c 'sleep 10 & lsof -p ${!}' 
sh -c 'sleep 10 0<&0 & lsof -p ${!}' 
sh -ic 'sleep 10 & lsof -p ${!}' 


# in a script 
- cat > myfile & 
+ cat 0<&0 > myfile & 
नहीं
संबंधित मुद्दे