स्क्रिप्ट में एक ही पंक्ति में अलग-अलग फ़ाइलों के लिए stderr और stdout को पुनर्निर्देशित कैसे करें?


180

मुझे यह बहुत पता है:

$ command 2>> error

$ command 1>> output

वहाँ किसी भी तरह मैं bash की एक ही पंक्ति में आउटपुट फ़ाइल में त्रुटि फ़ाइल और आउटपुट stdout को आउटपुट फ़ाइल में आउटपुट कर सकता हूं?

जवाबों:


292

बस उन्हें एक पंक्ति में जोड़ें command 2>> error 1>> output

हालाँकि, ध्यान दें कि >>यदि फ़ाइल में पहले से ही डेटा है तो इसे लागू करने के लिए है। जबकि, >फ़ाइल में किसी भी मौजूदा डेटा को अधिलेखित कर देगा।

तो, command 2> error 1> outputअगर आप एपेंड नहीं करना चाहते हैं।

बस पूरा करने के लिए, आप 1>बस के रूप में लिख सकते हैं >क्योंकि डिफ़ॉल्ट फ़ाइल डिस्क्रिप्टर आउटपुट है। इसलिए 1>और >यही बात है।

तो, command 2> error 1> outputबन जाता है,command 2> error > output


3
बहुत बढ़िया जवाब! मैं वास्तव में आपके स्पष्टीकरण को पसंद करता हूं कि कैसे 1>लिखा जा सकता है>
user784637

यह किस तरह से अलग है command &2>err.log, मुझे लगता है कि मैं पूरी तरह से भ्रमित भ्रमित हूँ। (सभी बैश पाइप-
आइम्स के

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html वह है जो मुझे लगता है कि आप ढूंढ रहे हैं। Fwiw, ऐसा लगता command &2>err.logहै कि काफी वैध नहीं है - उस वाक्य रचना में एम्परसेंड का उपयोग फ़ाइल डिस्क्रिप्टर के लिए लक्ष्य के रूप में किया जाता है, उदाहरण के लिए stder के लिए sterout command 1>&2reroute होगा।
DreadPirateShawn

@DreadPirateShawn, कृपया संदर्भ के रूप में ABS को लिंक न करें - इसमें कभी-कभी एकमुश्त गलतियाँ शामिल होती हैं, और बहुत बार इसमें बुरे अभ्यास के उदाहरण भी होते हैं। wiki.bash-hackers.org/howto/redirection_tutorial एक है अब तक पुनर्निर्देशन पर बेहतर संदर्भ स्रोत।
चार्ल्स डफी

27

इसे इस्तेमाल करे:

your_command 2>stderr.log 1>stdout.log

अधिक जानकारी

अंकों के 0माध्यम से 9कर रहे हैं फ़ाइल वर्णनकर्ता बैश में। 0मानक इनपुट 1के लिए खड़ा है, मानक उत्पादन 2के लिए खड़ा है, मानक त्रुटि के लिए खड़ा है। 3के माध्यम से 9किसी भी अन्य अस्थायी उपयोग के लिए अतिरिक्त हैं।

किसी भी फाइल डिस्क्रिप्टर को ऑपरेटर का उपयोग करके किसी फाइल या किसी अन्य फाइल डिस्क्रिप्टर पर पुनर्निर्देशित किया जा सकता है >। आप इसके बजाय >>एक खाली बनाने के लिए एक फ़ाइल के लिए append करने के लिए ऑपरेटर का उपयोग कर सकते हैं ।

उपयोग:

file_descriptor > filename

file_descriptor > &file_descriptor

कृपया उन्नत बैश-स्क्रिप्टिंग गाइड देखें: अध्याय 20। I / O पुनर्निर्देशन


धन्यवाद। मैं एक घंटे के लिए इसे खोज रहा हूं
dılo sürücü


9

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

command > merged-output.txt 2>&1

32
यह सवाल का जवाब नहीं है।
मथियास

लोग आउटपुट मर्ज क्यों करते हैं या मर्जिंग आउटपुट का सुझाव देते हैं?
नुरेटिन

@nurettin: हो सकता है कि आपके पास एक स्क्रिप्ट लाइन हो जो बस एक कमांड निष्पादित करती है और आउटपुट को लॉग फ़ाइल में सहेजती है। विचाराधीन कमांड कभी-कभी विफल हो सकती है इसलिए आप इसके बारे में कोई भी त्रुटि लेकिन एक ही लॉग फ़ाइल में सहेजना चाहते हैं।
स्ट्रीमोफ़स्टार्स

@streamofstars हां बिल्कुल सही है शायद आप कभी-कभी यही चाहते हैं कि लोग क्या चाहते हैं, मैं इस सवाल के संदर्भ में टिप्पणी कर रहा था क्योंकि कोई व्यक्ति जो जवाब मांग रहा था और स्टैकओवरफ्लो में बहुत सारे अप्रासंगिक थे।
नुरेटिन

0

एकाधिक कमांड के आउटपुट को पुनर्निर्देशित किया जा सकता है। यह कमांड लाइन के लिए काम करता है या बैश स्क्रिप्ट में सबसे अधिक उपयोगी है। -sपासवर्ड स्क्रीन करने के लिए संकेत भेजता है।

Hereblock cmds stdout / stderr को सेपरेट फाइल और कुछ भी प्रदर्शित करने के लिए नहीं भेजा जाता है।

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr को सिंगल फाइल और डिस्प्ले में भेजा जाता है।

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

यहाँब्लॉक cmds stdout / stderr को अलग-अलग फ़ाइलों और प्रदर्शित करने के लिए stdout में भेजा जाता है।

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

इस पर निर्भर करता है कि आप (whoami) कौन हैं और उपयोगकर्ता नाम पासवर्ड की आवश्यकता हो सकती है या नहीं।

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