मैं फ़ाइल में टर्मिनल आउटपुट कैसे सहेज सकता हूं?


688

मैं किसी फ़ाइल में कमांड के आउटपुट को कैसे बचा सकता हूं?

क्या किसी भी सॉफ्टवेयर का उपयोग किए बिना एक रास्ता है? मैं जानना चाहूंगा कि कैसे।

जवाबों:


735

हाँ यह संभव है, बस आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करें:

SomeCommand > SomeFile.txt  

या यदि आप डेटा संलग्न करना चाहते हैं:

SomeCommand >> SomeFile.txt

यदि आप stderrइसका उपयोग करना चाहते हैं :

SomeCommand &> SomeFile.txt  

या इसे संलग्न करने के लिए:

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

(यदि आप केवल आउटपुट चाहते हैं, तो 2ऊपर छोड़ें )


15
ध्यान दें कि someCommand 2> someFile.txtऔर someFile.txt पर someCommand 2>> someFile.txtभी रीडायरेक्ट stterrकरता है
Slothworks

मैं gcc कमांड के साथ ऐसा करने की कोशिश कर रहा हूँ लेकिन यह काम नहीं करता है। यह अन्य कमांड के साथ काम करता है, लेकिन यह नहीं। यह बस इसके अंदर कुछ भी नहीं के साथ आउटपुट फ़ाइल बनाता है।
निकोस

@ Nik-Lz अक्सर ऐसा इसलिए होता है क्योंकि कमांड अपने सभी आउटपुट को stderr पर भेज रहा है। यदि gcc त्रुटि संदेश उत्पन्न कर रहा है, तो यह संभावना प्रतीत होती है। स्टडआउट के बजाय स्टर्रर पर कब्जा करने के तरीके के लिए स्लॉथवर्क्स देखें।
जोनाथन हार्टले

1
एनबी: के उत्पादन प्राप्त करने के लिए make: एक फ़ाइल यह इस वाक्य रचना के बजाय की आवश्यकता में आदेश make > someFile.txt 2>&1(स्रोत: linuxquestions.org/questions/linux-newbie-8/... )
गेब्रियल स्टेपल्स

मुझे एक समस्या है कि यह लिखना बंद कर देता है जब फ़ाइल लगभग 8 एमबी तक पहुंच जाती है। क्या यह एक ज्ञात सीमा है?
8

863

किसी फ़ाइल में कमांड के आउटपुट को लिखने के लिए, मूल रूप से 10 आमतौर पर उपयोग किए जाने वाले तरीके हैं।

अवलोकन:

कृपया ध्यान दें कि n.e.सिंटैक्स कॉलम में "मौजूदा नहीं" का अर्थ है।
एक रास्ता है, लेकिन यह कॉलम में फिट होने के लिए बहुत जटिल है। आप इसके बारे में सूची अनुभाग में एक उपयोगी लिंक पा सकते हैं।

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

सूची:

  • command > output.txt

    मानक आउटपुट स्ट्रीम को केवल फ़ाइल पर पुनर्निर्देशित किया जाएगा, यह टर्मिनल में दिखाई नहीं देगा। यदि फ़ाइल पहले से मौजूद है, तो वह अधिलेखित हो जाती है।

  • command >> output.txt

    मानक आउटपुट स्ट्रीम को केवल फ़ाइल पर पुनर्निर्देशित किया जाएगा, यह टर्मिनल में दिखाई नहीं देगा। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।

  • command 2> output.txt

    मानक त्रुटि स्ट्रीम केवल फ़ाइल पर पुनर्निर्देशित की जाएगी, यह टर्मिनल में दिखाई नहीं देगी। यदि फ़ाइल पहले से मौजूद है, तो वह अधिलेखित हो जाती है।

  • command 2>> output.txt

    मानक त्रुटि स्ट्रीम केवल फ़ाइल पर पुनर्निर्देशित की जाएगी, यह टर्मिनल में दिखाई नहीं देगी। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।

  • command &> output.txt

    मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को केवल फ़ाइल पर रीडायरेक्ट किया जाएगा, टर्मिनल में कुछ भी दिखाई नहीं देगा। यदि फ़ाइल पहले से मौजूद है, तो वह अधिलेखित हो जाती है।

  • command &>> output.txt

    मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को केवल फ़ाइल पर रीडायरेक्ट किया जाएगा, टर्मिनल में कुछ भी दिखाई नहीं देगा। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।

  • command | tee output.txt

    मानक आउटपुट स्ट्रीम को फ़ाइल में कॉपी किया जाएगा, यह अभी भी टर्मिनल में दिखाई देगा। यदि फ़ाइल पहले से मौजूद है, तो वह अधिलेखित हो जाती है।

  • command | tee -a output.txt

    मानक आउटपुट स्ट्रीम को फ़ाइल में कॉपी किया जाएगा, यह अभी भी टर्मिनल में दिखाई देगा। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।

  • (*)

    बैश के पास कोई शॉर्टहैंड सिंटैक्स नहीं है जो केवल StdErr को दूसरी कमांड में पाइप करने की अनुमति देता है, जिसे teeतालिका को पूरा करने के लिए फिर से संयोजन के साथ यहां आवश्यक होगा । यदि आपको वास्तव में ऐसा कुछ चाहिए, तो कृपया "कैसे stderr को पाइप करें, और stdout को नहीं" देखें। कुछ तरीकों के लिए स्टैक ओवरफ्लो पर यह कैसे किया जा सकता है जैसे कि धाराओं को स्वैप करके या प्रक्रिया प्रतिस्थापन का उपयोग करके।

  • command |& tee output.txt

    टर्मिनल में दिखाई देने के दौरान मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को फ़ाइल में कॉपी किया जाएगा। यदि फ़ाइल पहले से मौजूद है, तो वह अधिलेखित हो जाती है।

  • command |& tee -a output.txt

    टर्मिनल में दिखाई देने के दौरान मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को फ़ाइल में कॉपी किया जाएगा। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।


66
तालिका के लिए धन्यवाद, यह उत्कृष्ट है! यह शीर्ष उत्तर होना चाहिए
DevShark

3
@ karthick87 यह वास्तव में किसी फ़ाइल में आउटपुट पुनर्निर्देशित करने के बारे में सवाल से संबंधित नहीं है, क्योंकि यह सिर्फ एक धारा को दूसरे में अनुप्रेषित करता है। 2>&1पुनर्निर्देश STDERR STDOUT करने के लिए, 1>&2STDERR को STDOUT रीडायरेक्ट और 3>&1STDERR को धारा 3 अनुप्रेषित होगा।
बाइट कमांडर

18
बस एक नोट कि macOS पर मेरे लिए '&' काम नहीं कर रहा था। यह इसके कारण बैश (मुझे लगता है) का एक पुराना संस्करण है। कम सुंदर '2> और 1' | हालांकि ठीक काम करता है
डैनी पार्कर

2
@ByteCommander मुझे त्रुटि मिलती है: sh: 1: Syntax error: "&" unexpectedजब मैं |& teeएक c9.io सर्वर में पायथन स्क्रिप्ट से उपयोग करता हूं। ऐसा लगता है कि एक अलग शेल का इस्तेमाल किया जा रहा है। echo $SHELLदिखाता है /bin/bashऔर $SHELL --versionसंस्करण 4.3.11 (1) -release दिखाता है। मैंने #!/bin/bashअपने अजगर की स्क्रिप्ट में कोशिश की लेकिन मुझे अभी भी मिल रहा है sh: 1: Syntax error। मुझे वह मिला जिसकी मुझे आवश्यकता थी इसलिए मैं अपने सर्वर पर shऔर उसके बीच की अजीबता को छाँटने में bashलगा हूँ। धन्यवाद।
समकान १३

1
@ samkhan13 लगता है कि आप चल रहे हैं की तरह shऔर नहीं bash(या शायद bashमें shमोड ...)। आप जांच सकते हैं कि आपकी वर्तमान शेल प्रक्रिया वास्तव में क्या उपयोग कर रही है ps -p $$ -o cmd=, क्योंकि echo $SHELLयह अविश्वसनीय है और आपको अपना लॉगिन शेल दिखाएगा, इस बात को अनदेखा करते हुए कि आपने एक अलग सबमिशन शुरू किया है या नहीं।
बाइट कमांडर

108

आप teeआउटपुट को फ़ाइल में भेजने के लिए भी उपयोग कर सकते हैं :

command | tee ~/outputfile.txt

एक मामूली संशोधन भी stderr को पकड़ लेगा:

command 2>&1 | tee ~/outputfile.txt

या थोड़ा कम और कम जटिल:

command |& tee ~/outputfile.txt

teeउपयोगी है अगर आप इसे लाइव देखने के दौरान कमांड आउटपुट कैप्चर करना चाहते हैं


यह कहता है कि & अनपेक्षित है, और कमांड चलने पर उसी समय लॉग नहीं लिखता है। मैं इसे एक bash फ़ाइल में उपयोग कर रहा हूँ, लेकिन क्या इससे कोई फर्क पड़ता है?
टिम 687

@ tim687 मैंने वह संपादन हटा दिया है। इस बारे में क्षमा करें ... मेरे मूल उत्तर का हिस्सा नहीं था।
हारून

@ ऐरॉन थैंक्स! टी वास्तविक समय में फ़ाइल संलग्न करेगा, है ना? मेरे पास एक बैकअप स्क्रिप्ट है जिसका उपयोग मैं अपने पीसी के लिए, lol, backup के लिए करता हूं, लेकिन लॉगिंग वास्तविक समय में नहीं है। बैकअप समाप्त होने के बाद मेरा पीसी सो जाता है, और लॉग फ़ाइल खाली है। क्या मुझे कमांड्स को लॉग इन करने के लिए किसी अन्य कमांड का उपयोग करना चाहिए?
समय

मैं इसका अर्थ कैसे समझाऊं 2>&1?
महेश999

@ Mahesha999 2 STDERR के लिए फ़ाइल डिस्क्रिप्टर है, और 1 STDOUT के लिए है। ताकि 2> और 1 STDERR STDOUT को भेजे। यह SO प्रश्न इसे बहुत अच्छी तरह से समझाता है: stackoverflow.com/questions/818255/…
हारून

20

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

your_command >/path/to/file

अधिलेखित करने के बजाय किसी फ़ाइल में कमांड आउटपुट को जोड़ने के लिए, इसका उपयोग करें:

your_command >>/path/to/file

आपका बहुत बहुत धन्यवाद ! क्या कोई सीमा है? फ़ाइल का अधिकतम आकार पसंद है?
एलईडी-ज़ेप

3
अधिकतम फ़ाइल आकार सिर्फ फ़ाइल सिस्टम के माध्यम से सीमित है
अराजकता

इस जवाब से स्टेडर को बचाया नहीं जा सकेगा। Use &>, stackoverflow.com/questions/637827/… और tldp.org/LDP/abs/html/io-redirection.html
पैंथर

3
ओपी ने स्टैडर को बचाने के लिए कभी नहीं कहा
अराजकता

यह कहता है "ऐसी कोई फ़ाइल या निर्देशिका नहीं"। क्या निर्देशिका को स्वचालित रूप से बनाना भी संभव है?
क्वर्टी

14

विचार करने के लिए एक वृद्धि -

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

इसे ठीक करने के लिए, आप उन कोड को अलग करने के लिए प्रोग्राम सेड का उपयोग कर सकते हैं । उदाहरण:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

1
उत्पादन को इस तरह से कैसे बचाया जाए कि रंगों का संरक्षण हो? मैं एक आदेश का परिणाम libreoffice में आयात करना और रंग रखना चाहूंगा।
मदरंग

@ माडरंग: मैं अब केवल आपकी टिप्पणी पढ़ता हूं, लेकिन आपको यह उत्तर उपयोगी लग सकता है।
सिल्वेन पिनेऊ

ओह, लगभग वही जो मैं देख रहा हूँ। आउटपुट को स्क्रीन पर कैसे प्रिंट करें?
सिगुर

1
ध्यान दें कि कई कमांड जो रंगीन आउटपुट का उत्पादन करते हैं, जैसे कि lsऔर grep, समर्थन --color=auto, जो कलर कोड को आउटपुट करता है केवल अगर मानक आउटपुट एक टर्मिनल है।
एलिया कागन

5

के लिए cronरोजगार के अवसर आदि आप बैश एक्सटेंशन से बचना चाहते हैं। बराबर POSIX shपुनर्निर्देशन ऑपरेटर हैं

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar

आप देखेंगे कि POSIX सुविधा कुछ सरल और अधिक सरल है। &>वाक्य रचना से उधार लिया गया था cshजो पहले से ही आप को समझाने चाहिए कि यह एक बुरा विचार है।


1

some_command | tee command.logऔर some_command > command.logसमस्या है कि वे command.logवास्तविक समय में फ़ाइल में कमांड आउटपुट को नहीं बचाते हैं ।

उस समस्या से बचने और वास्तविक समय में कमांड आउटपुट को बचाने के लिए, आप संलग्न कर सकते हैं unbuffer, जो expectपैकेज के साथ आता है ।


उदाहरण:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

मान लिया जाता है log.py:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

आप चला सकते हैं unbuffer python log.py | tee command.logयाunbuffer python log.py > command.log

अधिक जानकारी: मैं वास्तविक समय में एक फ़ाइल के लिए कमांड आउटपुट कैसे बचा सकता हूं?


वे आउटपुट को सहेजते हैं क्योंकि वे इसे प्राप्त करते हैं, समस्या यह है कि अजगर बफ़रिंग पर बदल जाता है जब आउटपुट एक TTY के लिए नहीं होता है। पायथन में इसे अक्षम करने के लिए अन्य विकल्प: stackoverflow.com/q/107705/2072269
muru
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.