पुनर्निर्देशन करते समय अलग-अलग आउटपुट


10
$ mysql -e 'select a,b from tablefoo' databasename

पैदावार

+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+

जहाँ तक

$ mysql -e 'select a,b from tablefoo' databasename > file

एक फ़ाइल fileयुक्त पैदावार

a b
1 0
2 1

(जहां प्रत्येक पंक्ति पर एक अक्षर अल्फ़ान्यूमेरिक वर्णों के बीच होता है)।

मुझे लगता है कि पुनर्निर्देशन से आउटपुट नहीं बदलना चाहिए। मुझे दो अलग-अलग परिणाम क्यों मिले?


संपादित करें: विलियम जैक्सन के जवाब में कहा गया है कि यह mysql की एक विशेषता है: आउटपुट स्वरूप इस बात पर निर्भर करता है कि आउटपुट पुनर्निर्देशित किया जा रहा है या नहीं। हालांकि यह मेरे सवाल का जवाब नहीं देता है। Mysql को कैसे पता चलता है कि क्या आउटपुट को रीडायरेक्ट किया जा रहा है? क्या पुनर्निर्देशन सिर्फ उत्पादन नहीं लेता है और, ठीक है, इसे कहीं न कहीं पुनर्निर्देशित करता है? नहीं होना चाहिए कि mysql के लिए अदृश्य हो?


-tअपने mysql कमांड पर ध्वज जोड़ें :)
spencer.sm

जवाबों:


13

संपादित करें: मैं यह निश्चित नहीं कर सकता कि यह कैसे mysqlहोता है, लेकिन इसका उपयोग isatty(3)यह निर्धारित करने के लिए किया जा सकता है कि STDOUTटर्मिनल है या नहीं और तदनुसार आउटपुट को संशोधित करना है।

संपादित करें 2:mysql कमांड लाइन टूल निश्चित रूप से उपयोग करता है isatty()आप स्रोत कोड पढ़ सकते हैं।

Cस्टैक ओवरफ्लो में इसके कुछ अच्छे उदाहरण हैं (हालांकि इसमें नहीं ):


आपके प्रश्न का उत्तर देने के लिए, "क्यों?": क्योंकि यही प्रलेखन कहता है। संदर्भ मैनुअल देखें :

जब अंतःक्रियात्मक रूप से उपयोग किया जाता है, तो क्वेरी परिणाम ASCII-table प्रारूप में प्रस्तुत किए जाते हैं। जब निर्बाध रूप से उपयोग किया जाता है (उदाहरण के लिए, एक फिल्टर के रूप में), परिणाम टैब-अलग प्रारूप में प्रस्तुत किया जाता है।

मुझे संदेह है कि यह निर्णय पठनीयता के लिए किया गया था। जब अंतःक्रियात्मक रूप से उपयोग किया जाता है, तो mysqlमान सकते हैं कि मानव आउटपुट पढ़ रहा है, और आम तौर पर हमारे लिए उन पंक्तियों द्वारा सीमांकित डेटा को पढ़ना आसान है। जब गैर-अंतःक्रियात्मक रूप से उपयोग किया जाता है, तो धारणा यह है कि एक अन्य कार्यक्रम आउटपुट का उपभोग करने जा रहा है, और यह कि टैब-सीमांकित आउटपुट प्रोग्रामेटिक रूप से उपभोग करना आसान है।

यदि आप इस डिफ़ॉल्ट को ओवरराइड करने में रुचि रखते हैं और आउटपुट को रीडायरेक्ट करते समय ASCII- टेबल प्रारूप प्राप्त कर रहे हैं, तो आप --table( -t) कमांड लाइन विकल्प का उपयोग कर सकते हैं :

mysql -t -e 'select a,b from tablefoo' databasename > file

1
मुझे डिफ़ॉल्ट को ओवरराइड करने में कोई दिलचस्पी नहीं है। Whether मुझे नहीं पता था कि आउटपुट में अंतर mysql में कुछ के कारण था या बैश में कुछ के कारण था। लेकिन यह पूरी तरह से मेरे सवाल का जवाब नहीं देता है। Mysql को कैसे पता चलता है कि उसके आउटपुट में क्या हो रहा है? मुझे लगता है कि पुनर्निर्देशन को mysql के लिए अदृश्य होना चाहिए। मैंने प्रश्न को अधिक स्पष्ट रूप से संपादित करने के लिए संपादित किया है, जो मेरे कहने का मतलब है। हालांकि, बहुत अच्छी तरह से सवाल का जवाब देने के लिए I (जाहिरा तौर पर) पूछ रहा था
msh210

आह, मुझे गलत समझा गया। मैंने अपना उत्तर अपडेट कर दिया।
विलियम जैक्सन

आह, वह मदद करता है। लेकिन यह अभी भी वास्तव में नहीं है जो मैं चाहता हूं, जो कि "कैसे पता चलता है '?" अर्थात्, इस्तिमाल को मायस्कल कहा जाता है। चाहे stdout एक tty है bash में जीवन का एक तथ्य है, mysql में नहीं। Mysql कैसे जानता है कि क्या चल रहा है? मुझे लगता है कि बैश में सामान mysql के लिए अदृश्य होगा।
msh210

1
स्टडआउट एक फाइल डिस्क्रिप्टर है, और यह निर्धारित करने के लिए किसी अन्य प्रोग्राम के समान bashउपयोग कर सकता isatty()है कि क्या यह एक ट्टी या डिस्क पर एक फाइल की ओर इशारा कर रहा है। isatty()ओएस द्वारा प्रदान की जाती है, न कि बैश।
विलियम जैक्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.