मानक आउटपुट को कई लॉग फ़ाइलों में पुनर्निर्देशित कैसे करें? निम्नलिखित काम नहीं करता है:
some_command 1> output_log_1 output_log_2 2>&1
मानक आउटपुट को कई लॉग फ़ाइलों में पुनर्निर्देशित कैसे करें? निम्नलिखित काम नहीं करता है:
some_command 1> output_log_1 output_log_2 2>&1
जवाबों:
देखें man tee
:
NAME: tee - मानक इनपुट से पढ़ा जाता है और मानक आउटपुट और फ़ाइलों को लिखता है
SYNOPSIS: टी [विकल्प] ... [फ़ाइल] ...
तदनुसार:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2
मैंने ऊपर की तरह निष्पादित करने की कोशिश की, लेकिन मुझे इसे दूसरी लॉग फ़ाइल में रीडायरेक्ट करने के लिए ctrl-c प्रेस करना होगा। साथ ही आउटपुट कंसोल पर प्रिंट होता है। मैं चाहता हूं कि कमांड आउटपुट को लॉग पर पुनर्निर्देशित किया जाए लेकिन कंसोल पर नहीं। किसी भी मदद की सराहना की है।
tee
आदेश लिखते stdin
दायर करने के लिए (रों) और भी करने के लिए stdout
। यदि आप नहीं चाहते कि आउटपुट टर्मिनल पर दिखाई दे, तो /dev/null
आपको सामान्य रूप से पसंद करने के लिए पुनर्निर्देशित करना होगा।
echo test | tee --append file1 file2
मान लें कि आपका आउटपुट किसी फ़ंक्शन से उत्पन्न होता है 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 में सत्यापित किया गया है, इसलिए इसे किसी भी हाल के ग्नू बैश संस्करण पर काम करना चाहिए।
version 4.3.11(1)-release (i686-pc-linux-gnu)
Ubuntu 14.04 में GNU बैश ( ) के तहत इसका परीक्षण किया है ।
यह एक पुरानी पोस्ट है लेकिन मुझे अभी यह पता चला है ...
आउटपुट को रीडायरेक्ट करने के बजाय > /dev/null
आप इसे अंतिम फ़ाइल पर रीडायरेक्ट कर सकते हैं:
echo "foobarbaz" | tee file1 > file2
या आउटपुट जोड़ने के लिए:
echo "foobarbaz" | tee -a file1 >> file2
-a
टी को छोड़कर )
जैसा कि @jofel ने उत्तर के तहत एक टिप्पणी में उल्लेख किया है, यह मूल रूप से किया जा सकता है zsh
:
echo foobar >file1 >file2 >file3
या, ब्रेस विस्तार के साथ:
echo foobar >file{1..3}
आंतरिक रूप से यह tee
ऊपर दिए गए उत्तरों के समान ही काम करता है। शेल कमांड के स्टडआउट को एक ऐसी प्रक्रिया से जोड़ता है जो कई फाइलों में पाइप करता है; इसलिए, यह इस तरह से कर रही है के लिए किसी भी सम्मोहक तकनीकी लाभ (लेकिन यह नहीं है करता है देखने के लिए असली अच्छा)। देखें पुस्तिका अधिक के लिए।zsh
टिप्पणी करने में असमर्थ, हालांकि, व्यक्त करने का दूसरा तरीका
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
कई फाइलों से निपटते समय इसे सरल बनाया जा सकता है।
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
के माध्यम से file8
उनके नाम के रूप में और उन फ़ाइलों के नाम के लिए होने की संभावना सिर्फ उदाहरण प्लेसहोल्डर हैं
zsh
, आप उपयोग कर सकते हैंsome_command >output_log_1 >output_log_2
।