2010-06-16 14 views
29

पर विचार की तरह कुछ:क्या एक ही इनपुट फ़ाइल का उपयोग एक पाइप कमांड के आउटपुट के रूप में करना ठीक है?

cat file | command > file 

इस अच्छा अभ्यास है? क्या यह इनपुट फ़ाइल को उसी समय के रूप में ओवरराइट कर सकता है जैसा कि हम इसे पढ़ रहे हैं, या क्या यह हमेशा स्मृति में पहले पढ़ा जाता है और फिर दूसरी कमांड पर पाइप किया जाता है?

जाहिर है, मैं मध्यस्थ कदम के रूप में अस्थायी फ़ाइलों का उपयोग कर सकते हैं, लेकिन मैं बस सोच रहा हूँ ..

t=$(mktemp) 
cat file | command > ${t} && mv ${t} file 

उत्तर

44

नहीं, यह ठीक नहीं है। पाइपलाइन में सभी आदेश एक ही समय में निष्पादित होते हैं, और खोल कमांड को निष्पादित करने से पहले पुनर्निर्देशन तैयार करता है। तो, यह संभव है कि बिल्ली इसे पढ़ने से पहले फ़ाइल को ओवरराइट कर देगी।

आपको अधिक से अधिक sponge(1) की आवश्यकता है।

+0

धन्यवाद, moreutils बहुत उपयोगी लग रहा है! क्या यह पुनर्निर्देशन पर लागू होता है: 'आदेश < file > फ़ाइल' या यहां तक ​​कि प्रक्रिया प्रतिस्थापन:' कमांड <(cat file) > फ़ाइल'? – Amro

+2

हां, यह दोनों मामलों में भी लागू होता है। ध्यान रखें कि खोल किसी भी क्रम में पुनर्निर्देशन को सेट करने के लिए स्वतंत्र है, इसलिए आपको एक ही कमांड या पाइपलाइन में दो बार एक ही फ़ाइल तक पहुंचने के लिए अपरिभाषित व्यवहार पर विचार करना चाहिए। यहां तक ​​कि यह कभी-कभी काम करता है, इसकी गारंटी नहीं है। – Juliano

3

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

{ rm file && your_command > file; } < file 
0

न केवल आप नहीं आपके इनपुट के लिए अपने उत्पादन लिखना चाहिए, लेकिन यह भी आप पाशन से बचना चाहिए अपने अपने इनपुट में वापस आउटपुट।

जब बड़ी फ़ाइलों के साथ काम कर, मैं

cat *allfastq30 > Sample_All_allfastq30 

की कोशिश की और यह त्रुटि संदेश उत्पन्न:

cat: Sample_All_allfastq30: input file is output file 
संबंधित मुद्दे

 संबंधित मुद्दे