2012-12-22 35 views
29

मैं पार्टी कार्यों में से कुछ सेट है जो उत्पादन में कुछ जानकारी:पढ़ने stdin

  • ढूंढें modelname-इन-epson-PPDS
  • ढूंढें modelname में सैमसंग -ppds
  • ढूंढें modelname-इन-HP-PPDS
  • आदि ...

मैं कार्य करता है जो उत्पादन पढ़ लिख रहा है और यह फिल्टर करें:

function filter-epson { 
    find-modelname-in-epson-ppds | sed <bla-blah-blah> 
} 

function filter-hp { 
    find-modelname-in-hp-ppds | sed <the same bla-blah-blah> 
} 
etc ... 

लेकिन मैंने सोचा था कि यह बेहतर होगा कुछ इस तरह करते हैं:

function filter-general { 
    (somehow get input) | sed <bla-blah-blah> 
} 

और फिर एक और उच्च में फोन -लेवल फ़ंक्शंस:

function high-level-func { 
    # outputs filtered information 
    find-modelname-in-hp/epson/...-ppds | filter-general 
} 

मैं सर्वोत्तम बैश प्रथाओं के साथ इसे कैसे प्राप्त कर सकता हूं?

+0

आप अच्छा अभ्यास के लिए देख रहे हैं, तो आप पहले से ही 'समारोह fname'' fname साथ (जगह ले सकता है) '। –

+1

क्या अंतर है? केवल अल्पसंख्यक? लेकिन मुझे लगता है कि 'फंक्शन' के साथ परिभाषा अधिक अभिव्यक्तिपूर्ण दिखती है, है ना? – likern

+1

_more expressive_ से आपका क्या मतलब है? [इस लिंक] में (http://wiki.bash-hackers.org/scripting/obsolete) आप देखेंगे कि यह अप्रचलित और बहिष्कृत है (और POSIX नहीं)। –

उत्तर

34

बारे में होना करने के लिए सवाल How do I pass stdin to a bash function? है, तो जवाब है:

Shellscript कार्यों साधारण stdin ले रास्ता, जैसे कि वे आदेश या कार्यक्रम थे। :)

input.txt:

HELLO WORLD 
HELLO BOB 
NO MATCH 

test.sh:

#!/bin/sh 

myfunction() { 
    grep HELLO 
} 

cat input.txt | myfunction 

आउटपुट:

[email protected]:~/scratch$ ./test.sh 
HELLO WORLD 
HELLO BOB 

ध्यान दें कि लाइन तर्क भी साधारण तरीके से नियंत्रित किया जाता है आदेश, इस तरह:

test2.sh:

#!/bin/sh 

myfunction() { 
    grep "$1" 
} 

cat input.txt | myfunction BOB 

आउटपुट:

[email protected]:~/scratch/$ ./test2.sh 
HELLO BOB 
+0

यह बैश 4.1.0 पर काम नहीं करता है। मुझे आउटपुट मिलता है: "हेल्लो वर्ल्ड \ n हेल्लो बॉब \ n कोई MATCH" – DocSalvager

+0

ठीक है, यह इनपुट स्ट्रिंग में '\ n' के उपयोग के कारण है। मैंने जवाब संपादित किया है; सादगी के लिए अब यह केवल एक इनपुट फाइल बिल्लियों। यह प्रश्न किसी फ़ंक्शन से 'stdin' तक पहुंचने के बारे में है - और वह भाग बैश 2.05b में भी काम करता है। :) – daveloyall

+1

आह, हाँ ... क्योंकि गूंज भागने के दृश्यों का समर्थन नहीं करता है। इसे संभालने का एक और तरीका एनएल = "<हिट यहां दर्ज करें>" जैसे चर को परिभाषित करता है और "$ nL" के साथ "\ n" को प्रतिस्थापित करता है। अभी व्यस्त हूँ। धन्यवाद! – DocSalvager

5

कॉल sed सीधे कॉल करें। बस।

function filter-general { 
    sed <bla-blah-blah> 
} 
10

दर्दनाक स्पष्ट है कि मैं stdin से पाइपिंग हूँ, मैं कभी कभी

cat - | ... 
+0

मेरे मामले में, वास्तव में मुझे "दर्दनाक रूप से स्पष्ट" होने की आवश्यकता थी, अन्यथा यह काम नहीं करता था। – Mahdi

+0

@ महदी आपका क्या मतलब है? क्या वहां ऐसे गोले हैं जिनके लिए इस मामले/संदर्भ में 'बिल्ली -' के उपयोग की आवश्यकता है? कौन कौन से? कब? कैसे? –

+0

मेरे पास एक स्क्रिप्ट है जो एक हडोप मानचित्र में मैपर के रूप में चलती है-नौकरी कम करती है, और इनपुट सामग्री मुझे stdin के माध्यम से दी जाती है। मुझे आगे की प्रक्रिया के लिए फ़ाइल में पूरे इनपुट को पढ़ने की जरूरत थी, और यह समाधान मेरे लिए काम करता था। – Mahdi