STDOUT / STDERR की तुलना में अन्य जगहों पर प्रोग्राम कैसे आउटपुट करते हैं? इससे कैसे बचा जाए?


15

जाहिर तौर पर मैं उन सभी आउटपुट गंतव्यों को नहीं जानता जो उपयोग के लिए उपलब्ध हैं। मैं stdout( &1) और stderr( &2) के बारे में जानता हूं । हालांकि, दोनों वर्णनकर्ता पुनः निर्देशित करने के बाद, मैं कभी कभी अभी भी कुछ उत्पादन मेरे कंसोल में मिलता है!

सबसे आसान उदाहरण मैं सोच सकता हूं कि जीएनयू समानांतर है; हर बार जब मैं इसका उपयोग करता हूं, तो मुझे एक उद्धरण नोटिस दिखाई देता है। जब मैं करता हूं &2>1 > file, तब भी मैं नोटिस देखता हूं।

और यही बात लागू होती है emerge: जब मैं उभरता हूं और कुछ समस्याएं होती हैं, तो कुछ सुझाव न तो छपते हैं और stdoutन ही stdin, क्योंकि मैं उन्हें पुनर्निर्देशित करता हूं और वे अभी भी प्राप्त कर लेते हैं।

मैं ज्यादातर इन समस्याओं का उपयोग करके हल करता हूं script, लेकिन मैं अभी भी सोच रहा हूं कि यह समस्या क्या है।


1
कृपया एक पूर्ण उदाहरण प्रदान करें ।
Kusalananda

कौन सा खोल? पर एक नजर है mywiki.wooledge.org/BashFAQ/055 और stackoverflow.com/questions/876239/...
संदीप

8
तुम उन सब को नहीं मिलेगा । एक स्क्रिप्ट हमेशा लिख ​​सकती है /dev/tty
सातु कटसरा

1
GNU के लिए parallel: mkdir ~/.parallel; touch ~/.parallel/will-citeकष्टप्रद संदेश को अक्षम करेगा। वैकल्पिक रूप से, के अन्य कार्यान्वयन के लिए चारों ओर देखो parallel
सातु कटुरा

2
@OleTange क्योंकि यह कोई समस्या नहीं है - मैं पूछ रहा हूं कि कुछ क्यों हो रहा है और मैं parallelएक उदाहरण के रूप में उपयोग कर रहा हूं ।
मैथ्यू रॉक

जवाबों:


40

आपके द्वारा उपयोग किया गया सिंटैक्स गलत है।

cmd &2>1 >file

के रूप में विभाजित किया जाएगा

cmd &
2>1 >file

यह करेगा:

  1. cmdबिना रीडायरेक्शन वाली पृष्ठभूमि नौकरी के रूप में चलाएं
  2. एक अलग प्रक्रिया में (एक कमांड के बिना!) stderrएक फ़ाइल को शाब्दिक रूप से कहा जाता है 1और इसके लिए रीडायरेक्ट stdoutकरेगाfile

आप जो सिंटेक्स चाहते हैं वह है:

cmd >file 2>&1

संचालन का क्रम महत्वपूर्ण है। यह करेगा:

  1. पुन: निर्देशित stdoutकरने के लिएfile
  2. पुनर्निर्देशन stderrकरने के लिए &1एक ही filehandle के रूप में यानी -stdout

नतीजा यह है कि दोनों है stderrऔर stdoutपुनः निर्देशित किया जाएगा file

में bash, एक साधारण गैर-मानक (और इसलिए मैं इसे पोर्टेबिलिटी के आधार पर अनुशंसित नहीं cmd &> fileकरता ) समान कार्य करता है।


अच्छा धन्यवाद। दूसरी समस्या हो सकती है /dev/tty, लेकिन उम्मीद है कि ऐसा बहुत बार नहीं होता है (यदि बिल्कुल भी)।
मैथ्यूॉक जूल

5
यदि आपके पास atआपकी मशीन पर कमांड है और इसका उपयोग करने के लिए विशेषाधिकार हैं, तो आप कमांड को इसके माध्यम से चला सकते हैं at now। विवरण के लिए मैनपेज देखें। यह एक बैच प्रक्रिया तंत्र के माध्यम से कमांड चलाएगा और इस प्रक्रिया में लिखने के लिए कभी भी टटी नहीं होगी। लेकिन, सामान्य तौर पर, मैं इस किनारे मामले के बारे में चिंता नहीं करेगा। आमतौर पर केवल सहभागिता की आवश्यकता होती है और पुनर्निर्देशन के बावजूद उपयोगकर्ताओं को चीजों को प्रदर्शित करने की आवश्यकता होती है /dev/tty
स्टीफन हैरिस

वहाँ किया गया है, कि
davidbak

10

दो समस्याएं हैं।

पहला यह है कि आदेश मायने रखता है, दूसरा है /dev/tty

आइए इस स्क्रिप्ट का उपयोग एक उदाहरण स्क्रिप्ट के रूप में करें, जिसे हम आउटपुट से कैप्चर करना चाहते हैं:

test.sh:

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

अब आज्ञाओं के आउटपुट देखें:

./testmyscript.sh 2>&1 >/dev/null:

edada
ttdada

क्योंकि मूल्यांकन का क्रम बाएं से दाएं होता है, हम पहले " stderrजहाँ कहीं भी stdoutआउटपुट कर रहे हैं, उसे रीडायरेक्ट करते हैं (इसलिए, कंसोल आउटपुट)"। तब हमें "पुनर्निर्देशित" मिलता stdoutहै /dev/null। हम इस तरह की स्थिति से अंत करते हैं:

stdout-> /dev/null stderr-> सांत्वना

तो हम इसे सही पाते हैं:

./testmyscript.sh >/dev/null 2>&1

और हम प्राप्त करते हैं:

ttdada

अब हम "रीडायरेक्ट कर stdoutकरने के लिए /dev/null", और फिर "पुनर्निर्देशन जहां stdout इशारा कर रही है करने के लिए stderr" (हां, तो /dev/null)। हुर्रे!

हालाँकि, हम अभी भी एक समस्या है; कार्यक्रम के लिए प्रिंट /dev/tty। अब मुझे नहीं पता कि इस तरह के व्यवहार को कैसे ठीक किया जाए, इसलिए आपको सबसे अधिक संभावना है script, लेकिन उम्मीद है कि यह व्यवहार बहुत बार नहीं होगा।

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