2015-10-31 8 views
8

के बीच अंतर मेरे पास यह कोड zsh चलाने के लिए है और आउटपुट फ़ाइल में इसका आउटपुट लॉग करें।गोलांग - os.stdout और multwriter

package main 

import (
    "io" 
    "os" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("zsh") 
    f, _ := os.Create("log.txt") 
    multiWriter := io.MultiWriter(os.Stdout, f) 
    cmd.Stdout = multiWriter 
    cmd.Stderr = os.Stderr 
    cmd.Stdin = os.Stdin 
    cmd.Run() 
}  
func haltOnError(err error) { 
    if err != nil { 
     panic(err) 
    } 
} 

जब कार्यक्रम कार्यान्वित करता है, ls इच्छा उत्पादन

foo 
bar 

टाइपिंग अगर मैं cmd.Stdout = os.Stdout करते हैं, यह

foo bar 

के रूप में सही ढंग से प्रदर्शित करता है क्या os.Stdout और multiwriter के बीच मतभेद की ओर जाता है?

+11

यह जाना जाता है, वैध व्यवहार। 'Ls' प्रोग्राम डिफ़ॉल्ट आउटपुट प्रारूप चुनने के लिए' isatty' सी फ़ंक्शन का उपयोग करता है। जब आप 'io.MultiWriter' का उपयोग करते हैं, 'isatty' रिटर्न 0 है, इसलिए' ls' का आउटपुट प्रारूप अलग है। –

+0

@TimCooper एक लेखक को एक tty की तरह व्यवहार करने के लिए कोई सीधा तरीका है? मैं थोड़ी सी बात करता हूं और पीटीआई ढूंढता हूं लेकिन वास्तव में यह नहीं जानता कि यह कैसे काम करता है। – boh

+0

@ बोह: आउटपुट क्षमताओं के बावजूद वांछित आउटपुट प्रारूप का उपयोग करने के लिए चीजों को अन्य तरीकों से क्यों न करें और 'एलएस' को मजबूर क्यों न करें? 'Ls -x',' ls-c' या 'ls -1' – wldsvc

उत्तर

2

@Time द्वारा और @wldsvc

समस्या के कारण टिप्पणियों के आधार पर कि isatty आधार पर अलग अलग फैसलों में io.MultiWriter और os.Stdout परिणाम के उपयोग के इस मामले में, ls द्वारा किया जाता है डिफ़ॉल्ट उत्पादन प्रारूप चुनना है isatty के परिणाम पर।

प्रस्तावित समाधान मापदंडों का उपयोग (man ls) द्वारा ls के उत्पादन में प्रारूप को मजबूर करना था:

-C list by columns 
-x list by lines instead of columns 
-1 list one file per line 

(अनुत्तरित सूची पर शो के रूप में दस्तावेजीकरण जवाब शांत उच्च)