कैसे कई लॉग फ़ाइलों में आउटपुट पुनर्निर्देशित करने के लिए


52

मानक आउटपुट को कई लॉग फ़ाइलों में पुनर्निर्देशित कैसे करें? निम्नलिखित काम नहीं करता है:

some_command 1> output_log_1 output_log_2 2>&1

6
के साथ zsh, आप उपयोग कर सकते हैं some_command >output_log_1 >output_log_2
जोफेल

जवाबों:


70

देखें man tee:

NAME: tee - मानक इनपुट से पढ़ा जाता है और मानक आउटपुट और फ़ाइलों को लिखता है

SYNOPSIS: टी [विकल्प] ... [फ़ाइल] ...

तदनुसार:

echo test | tee file1 file2 file3

क्या stderr को एक से अधिक फ़ाइल में भी पुनर्निर्देशित किया जा सकता है?
Fromnaboo

हां, इसे पुर्ननिर्देशन के आधार पर किया जा सकता है: खोज / -नाम परीक्षण 2> और 1 | tee file1 file2 file3
akond

@akond, cmd 2>&1 | tee log1 log2 मैंने ऊपर की तरह निष्पादित करने की कोशिश की, लेकिन मुझे इसे दूसरी लॉग फ़ाइल में रीडायरेक्ट करने के लिए ctrl-c प्रेस करना होगा। साथ ही आउटपुट कंसोल पर प्रिंट होता है। मैं चाहता हूं कि कमांड आउटपुट को लॉग पर पुनर्निर्देशित किया जाए लेकिन कंसोल पर नहीं। किसी भी मदद की सराहना की है।
डबलडैंकर

@doubledecker teeआदेश लिखते stdinदायर करने के लिए (रों) और भी करने के लिए stdout। यदि आप नहीं चाहते कि आउटपुट टर्मिनल पर दिखाई दे, तो /dev/nullआपको सामान्य रूप से पसंद करने के लिए पुनर्निर्देशित करना होगा।
Minix

4
कई फाइलों में संलग्न करना भी संभव है:echo test | tee --append file1 file2
user1364368

13

मान लें कि आपका आउटपुट किसी फ़ंक्शन से उत्पन्न होता है cmd():

cmd() {
    echo hello world!
}

आउटपुट cmdको दो फ़ाइलों से पुनर्निर्देशित करने के लिए , लेकिन कंसोल पर नहीं, आप उपयोग कर सकते हैं:

cmd | tee file1 file2 >/dev/null

यह कई फ़ाइलों के लिए काम करेगा, टी को कोई भी डेटा स्रोत पाइपिंग:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

यह भी काम करेगा:

echo $(cmd) | tee file1 file2 >/dev/null

/dev/nullपुनर्निर्देशन के बिना , टी निर्दिष्ट फाइलों के अलावा स्टडआउट में आउटपुट भेजेगा ।

उदाहरण के लिए, यदि यह कंसोल से चलाया जाता है, तो आपको वहां आउटपुट दिखाई देगा। एक क्रॉस्टैब से चलाएं, आउटपुट स्टेटस मैसेज दिखाई देगा जो आपको मेल किया गया है (गिल्स का जवाब यहां देखें https://unix.stackexchange.com/a/100833/3998 )।

इसने मेरे लिए उबंटू 12.04 पर बाश में काम किया, और इसे ग्नू बैश 4.3.11 (1) का उपयोग करके उबंटू 14.04 में सत्यापित किया गया है, इसलिए इसे किसी भी हाल के ग्नू बैश संस्करण पर काम करना चाहिए।


@doubledecker - ऐसा लगता है कि यह आपकी शर्तों को पूरा करता है, इसलिए उत्तर के रूप में स्वीकार किया जा सकता है। इसके अलावा, +1, जैसा कि मैंने version 4.3.11(1)-release (i686-pc-linux-gnu)Ubuntu 14.04 में GNU बैश ( ) के तहत इसका परीक्षण किया है ।
बेलाक्वा

9

यह एक पुरानी पोस्ट है लेकिन मुझे अभी यह पता चला है ...

आउटपुट को रीडायरेक्ट करने के बजाय > /dev/nullआप इसे अंतिम फ़ाइल पर रीडायरेक्ट कर सकते हैं:

echo "foobarbaz" | tee file1 > file2

या आउटपुट जोड़ने के लिए:

echo "foobarbaz" | tee -a file1 >> file2

यह कमोबेश अन्य उत्तर में कहा गया है ( -a टी को छोड़कर )
आर्चर

जाने का यह रास्ता है।
71GA

5

जैसा कि @jofel ने उत्तर के तहत एक टिप्पणी में उल्लेख किया है, यह मूल रूप से किया जा सकता है zsh:

echo foobar >file1 >file2 >file3

या, ब्रेस विस्तार के साथ:

echo foobar >file{1..3}

आंतरिक रूप से यह teeऊपर दिए गए उत्तरों के समान ही काम करता है। शेल कमांड के स्टडआउट को एक ऐसी प्रक्रिया से जोड़ता है जो कई फाइलों में पाइप करता है; इसलिए, यह इस तरह से कर रही है के लिए किसी भी सम्मोहक तकनीकी लाभ (लेकिन यह नहीं है करता है देखने के लिए असली अच्छा)। देखें पुस्तिका अधिक के लिए।zsh


2

टिप्पणी करने में असमर्थ, हालांकि, व्यक्त करने का दूसरा तरीका

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

कई फाइलों से निपटते समय इसे सरल बनाया जा सकता है।

echo "foobarbaz" | tee file{1..8} > /dev/null

2
यह वास्तव में पहले से दिए गए अन्य उत्तरों से कैसे अलग है? खासकर जब से कुछ लोगों को होने की संभावना शाब्दिक चाहते file1के माध्यम से file8उनके नाम के रूप में और उन फ़ाइलों के नाम के लिए होने की संभावना सिर्फ उदाहरण प्लेसहोल्डर हैं
एरिक Renouf

1
संभवतः या नहीं, यह वास्तव में मेरे लिए आवश्यक समाधान है, और सोचा कि यह किसी और की मदद कर सकता है।
user149146
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.