ओह, लेकिन sponge
एकमात्र विकल्प नहीं है; इसे moreutils
ठीक से काम करने के लिए आपको प्राप्त करने की आवश्यकता नहीं है । कोई भी तंत्र तब तक काम करेगा जब तक वह निम्नलिखित दो आवश्यकताओं को पूरा नहीं करता है:
- यह आउटपुट फाइल के नाम को एक पैरामीटर के रूप में स्वीकार करता है।
- सभी इनपुट संसाधित होने के बाद यह केवल आउटपुट फ़ाइल बनाता है।
आप देखिए, ओपी की जिस सुप्रसिद्ध समस्या का जिक्र है, वह यह है कि शेल उन सभी फाइलों को बनाएगा जो पाइप के लिए काम करने के लिए आवश्यक हैं, यहां तक कि पाइप लाइन में कमांड को निष्पादित करने के लिए शुरुआत से पहले, इसलिए यह वह शेल है जो वास्तव में छोटा हो जाता है आउटपुट फ़ाइल (जो दुर्भाग्य से इनपुट फ़ाइल भी है) कमांड से पहले किसी को भी निष्पादित करने का मौका मिला है।
tee
आदेश काम नहीं करता, यहां तक कि यह संतुष्ट पहली आवश्यकता हालांकि, क्योंकि यह दूसरी आवश्यकता को पूरा नहीं करता है: यह हमेशा से शुरू होने के तुरंत बाद ही आउटपुट फ़ाइल बन जाएगा, ताकि यह सीधे आउटपुट फ़ाइल में एक पाइप बनाने के रूप में बुरा के रूप में अनिवार्य रूप से है। (यह वास्तव में बदतर है, क्योंकि इसका उपयोग आउटपुट फ़ाइल के टुकड़े-टुकड़े होने से पहले एक गैर-निर्धारक यादृच्छिक विलंब का परिचय देता है, इसलिए आप सोच सकते हैं कि यह काम करता है, जबकि वास्तव में यह नहीं करता है।)
इसलिए, इस समस्या को हल करने के लिए हम सभी को कुछ कमांड चाहिए जो किसी भी आउटपुट को बनाने से पहले उसके सभी इनपुट को बफर कर देगी, और जो आउटपुट फाइलनाम को एक पैरामीटर के रूप में स्वीकार करने में सक्षम है, ताकि हमें इसके आउटपुट को पाइप करने की आवश्यकता न हो आउटपुट फ़ाइल। ऐसा ही एक आदेश है shuf
। तो, निम्नलिखित वही काम पूरा करेगा जो sponge
:
shuf --output=file --random-source=/dev/zero
यह --random-source=/dev/zero
भाग shuf
बिना किसी फेरबदल के अपना काम करने की कोशिश करता है, इसलिए यह आपके इनपुट को बिना बदले ही बदल देगा।