2012-03-19 16 views
46

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

या तो

foo=$(bar) 
# or 
foo=`bar` 

लेकिन जावा संस्करण क्वेरी के लिए, यह काम करने के लिए प्रतीत नहीं होता है दो तरीके हैं।

मैंने किया:

version=$(java --version) 

यह वर के अंदर मूल्य की दुकान नहीं है। यह अभी भी इसे प्रिंट करता है, जो वास्तव में मामला नहीं होना चाहिए।

मैंने आउटपुट को फ़ाइल में रीडायरेक्ट करने का भी प्रयास किया लेकिन यह भी विफल हो गया।

+0

से अधिक दो तरीके हैं। foo <<(echo "यह एक और तरीका है") पढ़ें लेकिन यह त्रुटि आउटपुट को पकड़ने के साथ आपकी समस्या से असंबंधित है, पहले से ही उत्तर दिया गया है। –

उत्तर

56
version=$(java -version 2>&1) 

संस्करण परम केवल एक पानी का छींटा लेता है, और यदि आप stderr है, जो है, जहां संदेश लिखा है, रीडायरेक्ट कर आप इच्छित परिणाम प्राप्त करेंगे।

एक साइडेनोट के रूप में, दो डैश का उपयोग करना यूनिक्स जैसे सिस्टम पर एक अनौपचारिक मानक है, लेकिन चूंकि जावा विभिन्न प्लेटफार्मों पर लगभग समान होने की कोशिश करता है, यह यूनिक्स/लिनक्स-अपेक्षाओं का उल्लंघन करता है और इस संबंध में विंडोज़ के समान व्यवहार करता है , और जैसा कि मुझे संदेह है, मैक ओएस पर।

+0

एक टन धन्यवाद, ठीक है जो मैं – user1278282

+0

के लिए देख रहा था आप कैसे जानते हैं कि आउटपुट stderr या stdout पर लिखा गया है या नहीं? – user1527227

+2

@ user1527227: आप इसका परीक्षण कर सकते हैं। –

14

ऐसा इसलिए है क्योंकि java -versionstderr और stdout पर नहीं लिखता है। आप का उपयोग करना चाहिए:

version=$(java -version 2>&1) 

आदेश में stdout को stderr रीडायरेक्ट करने के लिए।

आप निम्नलिखित 2 आदेशों चलाकर इसे देख सकते हैं:

java -version > /dev/null 

java -version 2> /dev/null 
+0

आपकी अंतर्दृष्टि के लिए धन्यवाद, ऐसा लगता है कि शीर्ष भी संस्करण को stderr प्रिंट करता है – user1278282

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