2010-01-24 10 views
14

अभी यह स्टडआउट पर आवश्यक मूल्य को आउटपुट करता है। मैं इसे एक चर में कैप्चर कैसे कर सकता हूं ताकि मैं इसे बाकी स्क्रिप्ट में उपयोग कर सकूं?कमांड के माध्यम से यहां दस्तावेज़ को कैसे पाइप करें और परिणाम को एक चर में कैप्चर करें?

आवश्यकताएँ:

  • स्क्रिप्ट एक फ़ाइल में सभी की जरूरत है।
  • यदि संभव हो तो मैं किसी भी temp फ़ाइलों को लिखना पसंद नहीं करूंगा।

#!/bin/bash 

cat << EOF | xsltproc - ../pom.xml | tail -1 
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"><xsl:value-of select="/project/version"/></xsl:template> 
</xsl:stylesheet> 
EOF 

उत्तर

12

ऐसा लगता है (इग्नासिओ के उत्तर पर आधारित)। एक सबहेल का उपयोग करके यहां दस्तावेज़ को सही ढंग से xsltproc में पाइप किया गया है जबकि अभी भी पूंछ के माध्यम से पारित किया जा रहा है।

VERSION=$((xsltproc - ../pom.xml | tail -1) << EOF 
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"><xsl:value-of select="/project/version"/></xsl:template> 
</xsl:stylesheet> 
EOF 
) 
10

cat ... | आवश्यक नहीं है।

foo=$(sed 's/-/_/g' << EOF 
1-2 
3-4 
EOF 
) 
+0

वैसे मुझे केवल उस आउटपुट की अंतिम पंक्ति की आवश्यकता है। अभी भी "| पूंछ -1" को कैसे शामिल किया जाए? –

+4

'sed's/-/_/g '<< ईओएफ | पूंछ -1' –

2

मैं एक या दो सप्ताह के लिए heredocs के साथ प्रयोग करना रहा है।

... अंश:: ...

शायद आप के बीच अंतर पर ध्यान यहाँ यूनिक्स स्टैक एक्सचेंज पर Is there a way to get actual (uninterpreted) shell arguments in a function or script? करने के लिए अपने जवाब से एक अंश है कि उनके उपयोग को वर्णन अपने मामले के लिए एक छोटे से मदद कर सकता है है दूसरे उदाहरण में दो heredocs। हेड्रोक ईओएफ फ़ंक्शन के भीतर टर्मिनेटर अनजान है, जबकि पढ़ने के लिए खिलाया गया एक एकल उद्धरण के साथ उद्धृत किया गया है। इस तरह शैल को हेडोकोक पर एक निर्विवाद टर्मिनेटर के साथ विस्तार करने का निर्देश दिया जाता है, लेकिन ऐसा करने के लिए नहीं जब उसके टर्मिनेटर उद्धृत किया जाता है। फ़ंक्शन में अनगिनत हेरेडोक का विस्तार करते समय यह तोड़ नहीं जाता है क्योंकि यह विस्तारित चर के मान को पहले ही उद्धृत स्ट्रिंग के रूप में सेट किया गया है और यह दो बार इसका विश्लेषण नहीं करता है।

शायद आप जो करना चाहते हैं वह आपके विंडोज पथ को एक कमांड के आउटपुट से दूसरे गतिशील इनपुट में पाइप करना शामिल है। एक हियरडॉक भीतर कमान प्रतिस्थापन से यह संभव है: तो बुनियादी तौर पर

% _stupid_mspath_fix() { 
> sed -e '[email protected]\\@/@g' -e '[email protected]\(.\):\(.*\)@/drive/\1\[email protected]' <<_EOF_ 
>> ${1} 
>> _EOF_ 
> } 
% read -r _stupid_mspath_arg <<'_EOF_'      
> c:\some\stupid\windows\place 
> _EOF_ 
% _stupid_mspath_fix ${_stupid_mspath_arg} 
/drive/c/some/stupid/windows/place  
% read -r _second_stupid_mspath_arg <<_EOF_      
> $(printf ${_stupid_mspath_arg}) 
> _EOF_ 
% _stupid_mspath_fix ${_second_stupid_mspath_arg} 
/drive/c/some/stupid/windows/place 

यदि आप कर सकते हैं मज़बूती से उत्पादन कुछ आवेदन से बैकस्लैश (मैं printf ऊपर इस्तेमाल किया), तो $ के भीतर उस आदेश चलाकर (...) और उस के भीतर संलग्न एक अज्ञात हेड्रोक एक अन्य एप्लिकेशन को पास कर देता है जो बैकस्लाश को इनपुट के रूप में विश्वसनीय रूप से स्वीकार कर सकता है (जैसे उपरोक्त पढ़ना और ऊपर) आपके बैकस्लेश के खोल के पार्सिंग को पूरी तरह से बाईपास कर देगा। एप्लिकेशन बैकस्लैश को संभाल सकता है या नहीं, क्योंकि इनपुट/आउटपुट कुछ ऐसा है जो आपको अपने लिए खोजना होगा।

-माइक

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

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