मैं किसी फ़ाइल में कमांड के आउटपुट को कैसे बचा सकता हूं?
क्या किसी भी सॉफ्टवेयर का उपयोग किए बिना एक रास्ता है? मैं जानना चाहूंगा कि कैसे।
मैं किसी फ़ाइल में कमांड के आउटपुट को कैसे बचा सकता हूं?
क्या किसी भी सॉफ्टवेयर का उपयोग किए बिना एक रास्ता है? मैं जानना चाहूंगा कि कैसे।
जवाबों:
हाँ यह संभव है, बस आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करें:
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>&2
STDERR को STDOUT रीडायरेक्ट और 3>&1
STDERR को धारा 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
करता है