एक कमांड को एक पाइप पास करें जो फ़ाइल नाम की अपेक्षा करता है


19

कहो कि मेरे पास एक आदेश है fooजो फ़ाइल नाम तर्क लेता है foo myfile.txt:। वार्षिक रूप से, fooमानक इनपुट से नहीं पढ़ा जाता है। एक वास्तविक फ़ाइल के बजाय, मैं इसे एक और कमांड का परिणाम देना चाहूंगा (वास्तव में pv, जो फ़ाइल को कैट करेगा और एक साइड इफेक्ट के रूप में प्रगति मीटर का उत्पादन करेगा)।

क्या ऐसा करने का कोई तरीका है? मेरे बैग में कुछ भी नहीं लगता है।

( fooइस मामले में एक PHP स्क्रिप्ट है जो मेरा मानना ​​है कि फ़ाइल को क्रमिक रूप से संसाधित करता है)।

मैं उबंटू और बैश का उपयोग कर रहा हूं

EDIT क्षमा करें थोड़ा अस्पष्ट समस्या वर्णन के लिए, लेकिन यहाँ उत्तर वही है जो मुझे चाहिए:

pv longfile.txt | foo /dev/stdin

बहुत स्पष्ट है कि अब मैं इसे देखता हूं।


क्या आप वन-लाइनर की तलाश कर रहे हैं?
डेव फोर्गैक

क्या आप सुनिश्चित हैं कि फू को "-" के तर्क को स्वीकार नहीं करना है, ताकि इसे स्टडिन से पढ़ा जा सके?
रैकबंडमैन

अफसोस की बात है कि इस मामले में - यह एक php स्क्रिप्ट है।
स्टीव बेनेट

हाँ वास्तव में। ।
स्टीव बेनेट

जवाबों:


19

अगर मैं समझता हूं कि आप ठीक से क्या करना चाहते हैं, तो आप इसे bash के कमांड प्रतिस्थापन फीचर से कर सकते हैं:

foo <(somecommand | pv)

यह कुछ ऐसा ही करता है जैसे mkfifo-बेड जवाब का सुझाव देता है, सिवाय इसके कि बैश आपके लिए विवरणों को संभालता है (और यह एक नियमित रूप से नामित पाइप के बजाय / dev / fd / 63 कमांड की तरह कुछ पारित करता है)। आप इसे और भी सीधे इस तरह से करने में सक्षम हो सकते हैं:

somecommand | pv | foo /dev/stdin

1
ओह, अच्छा! यह pv inputfile.txt | foo /dev/stdinवही है जो मैं देख रहा था, लेकिन इसके बारे में नहीं सोचा था।
स्टीव बेनेट

यहाँ प्रारंभ करें / देव / स्टडिन
ऋषि

<(.)मेरे लिए काम किया। क्या यह वाक्य रचना बाश मैनुअल में प्रलेखित है? मैं समझता हूं (.)कि कमांड प्रतिस्थापन का दस्तावेजीकरण किया गया है, लेकिन इसके संयोजन को <स्पष्ट रूप से नहीं देखा ।
प्रवाह

@ flow2k इसे "प्रक्रिया प्रतिस्थापन" कहा जाता है - बैश मैनुअल के खंड 3.5.6 देखें ।
गॉर्डन डेविसन

समझ गया। आप सही हैं - यह उल्लेख करता है कि यह नामित पाइप / का उपयोग करता है mkfifo
प्रवाह


2

इस यूनिक्स एसई प्रश्न का एक उत्तर है जो दिखाता है कि एक अस्थायी नामित पाइप कैसे बनाया जाए:

शेल स्क्रिप्ट mktemp, अस्थायी नामित पाइप बनाने के लिए सबसे अच्छी विधि क्या है?

वहाँ के जवाबों के आधार पर, आप निम्नलिखित की तरह कुछ कर सकते हैं:

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

आप तब पाइप को देख सकते हैं:

foo $tmppipe

जब आप इसके साथ कर रहे हों तब इसे हटा दें।


1

Mkfifo का उपयोग करके देखें।

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

किसी अन्य शेल में, foo file_read_by_foo चलाएं


0

xargs इसके लिए अच्छी तरह से काम करने लगता है:

echo longfile.txt | xargs pv

यह कुछ अलग करता है: pvकई बार चल रहा है, प्रत्येक एक या अधिक लाइनों से खींचा गया है longfile.txt। नहीं मैं यहाँ के बाद क्या कर रहा हूँ।
स्टीव बेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.