मैं किसी फ़ाइल में कमांड के आउटपुट को कैसे बचा सकता हूं?
क्या किसी भी सॉफ्टवेयर का उपयोग किए बिना एक रास्ता है? मैं जानना चाहूंगा कि कैसे।
मैं किसी फ़ाइल में कमांड के आउटपुट को कैसे बचा सकता हूं?
क्या किसी भी सॉफ्टवेयर का उपयोग किए बिना एक रास्ता है? मैं जानना चाहूंगा कि कैसे।
जवाबों:
हाँ यह संभव है, बस आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करें:
SomeCommand > SomeFile.txt
या यदि आप डेटा संलग्न करना चाहते हैं:
SomeCommand >> SomeFile.txt
यदि आप stderrइसका उपयोग करना चाहते हैं :
SomeCommand &> SomeFile.txt
या इसे संलग्न करने के लिए:
SomeCommand &>> SomeFile.txt
आप दोनों चाहते हैं stderrऔर आउटपुट कंसोल पर प्रदर्शित और एक फ़ाइल में उपयोग करें:
SomeCommand 2>&1 | tee SomeFile.txt
(यदि आप केवल आउटपुट चाहते हैं, तो 2ऊपर छोड़ें )
make: एक फ़ाइल यह इस वाक्य रचना के बजाय की आवश्यकता में आदेश make > someFile.txt 2>&1(स्रोत: linuxquestions.org/questions/linux-newbie-8/... )
किसी फ़ाइल में कमांड के आउटपुट को लिखने के लिए, मूल रूप से 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
टर्मिनल में दिखाई देने के दौरान मानक आउटपुट और मानक त्रुटि स्ट्रीम दोनों को फ़ाइल में कॉपी किया जाएगा। यदि फ़ाइल पहले से मौजूद है, तो नया डेटा फ़ाइल के अंत में संलग्न हो जाएगा।
2>&1पुनर्निर्देश STDERR STDOUT करने के लिए, 1>&2STDERR को STDOUT रीडायरेक्ट और 3>&1STDERR को धारा 3 अनुप्रेषित होगा।
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लगा हूँ। धन्यवाद।
shऔर नहीं bash(या शायद bashमें shमोड ...)। आप जांच सकते हैं कि आपकी वर्तमान शेल प्रक्रिया वास्तव में क्या उपयोग कर रही है ps -p $$ -o cmd=, क्योंकि echo $SHELLयह अविश्वसनीय है और आपको अपना लॉगिन शेल दिखाएगा, इस बात को अनदेखा करते हुए कि आपने एक अलग सबमिशन शुरू किया है या नहीं।
आप teeआउटपुट को फ़ाइल में भेजने के लिए भी उपयोग कर सकते हैं :
command | tee ~/outputfile.txt
एक मामूली संशोधन भी stderr को पकड़ लेगा:
command 2>&1 | tee ~/outputfile.txt
या थोड़ा कम और कम जटिल:
command |& tee ~/outputfile.txt
teeउपयोगी है अगर आप इसे लाइव देखने के दौरान कमांड आउटपुट कैप्चर करना चाहते हैं ।
2>&1?
आप कमांड आउटपुट को किसी फ़ाइल में पुनर्निर्देशित कर सकते हैं:
your_command >/path/to/file
अधिलेखित करने के बजाय किसी फ़ाइल में कमांड आउटपुट को जोड़ने के लिए, इसका उपयोग करें:
your_command >>/path/to/file
विचार करने के लिए एक वृद्धि -
विभिन्न स्क्रिप्ट रंग कोड को आउटपुट में इंजेक्ट करेंगे जो आप अपनी लॉग फ़ाइल को अव्यवस्थित नहीं करना चाहते हैं।
इसे ठीक करने के लिए, आप उन कोड को अलग करने के लिए प्रोग्राम सेड का उपयोग कर सकते हैं । उदाहरण:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
lsऔर grep, समर्थन --color=auto, जो कलर कोड को आउटपुट करता है केवल अगर मानक आउटपुट एक टर्मिनल है।
के लिए 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जो पहले से ही आप को समझाने चाहिए कि यह एक बुरा विचार है।
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
अधिक जानकारी: मैं वास्तविक समय में एक फ़ाइल के लिए कमांड आउटपुट कैसे बचा सकता हूं?
someCommand 2> someFile.txtऔर someFile.txt परsomeCommand 2>> someFile.txtभी रीडायरेक्टstterrकरता है