2012-12-05 19 views
52

जब मैं csh में निम्न आदेश चलाता हूं, मुझे कुछ भी नहीं मिला है, लेकिन यह bash में काम करता है, क्या सीएसएच में कोई समतुल्य है जो मानक त्रुटि को मानक आउटपुट पर रीडायरेक्ट कर सकता है?सी खोल में stdout को stderr को रीडायरेक्ट करें

xxx 2>&1 

नोट: xxx एक अमान्य आदेश है, मैं बस आउटपुट देखने में त्रुटि बनाना चाहता हूं।

+6

CSH खतरनाक है। बैश में स्थानांतरित करने का प्रयास करें, zsh http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ –

+0

@SSHegde "खतरनाक" से आपका क्या मतलब है? –

+0

@ गीज़ा: कृपया उस लिंक का संदर्भ लें जिसका मैंने टिप्पणी में उल्लेख किया था। यह बताता है क्यों। –

उत्तर

66

csh खोल कभी भी पुनर्निर्देशन प्रक्रिया में फ़ाइल हैंडल में हेरफेर करने की व्यापक क्षमता के लिए ज्ञात नहीं है।

आप के साथ एक फ़ाइल के लिए दोनों मानक आउटपुट और त्रुटि अनुप्रेषित कर सकते हैं:

xxx >& filename 

लेकिन यह है कि काफी क्या आप के बाद कर रहे थे, वर्तमान मानक आउटपुट में मानक त्रुटि पुनः निर्देशित नहीं है।


हालांकि, अगर आपकी अंतर्निहित ऑपरेटिंग सिस्टम फाइल सिस्टम में एक प्रक्रिया के मानक आउटपुट को उजागर करता है (के रूप में लिनक्स /dev/stdout के साथ करता है), तो आप उस विधि इस प्रकार के रूप में उपयोग कर सकते हैं:

xxx >& /dev/stdout 

हो जाएगा ताकि वर्तमान मानक आउटपुट के समान मानक स्थान पर जाने के लिए मानक आउटपुट और मानक त्रुटि दोनों को मजबूर करें, प्रभावी रूप से bash पुनर्निर्देशन, 2>&1 के साथ आपके पास क्या है।

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


हालांकि, एक और तरीका है। यदि आप इसे पाइपलाइन पर |& के साथ भेजते हैं, तो आप दो धाराओं को एक साथ जोड़ सकते हैं, तो आपको केवल एक पाइपलाइन घटक मिलना है जो इसके मानक आउटपुट में मानक इनपुट लिखता है। यदि आप ऐसी चीज से अनजान हैं, तो यह ठीक है कि cat क्या करता है यदि आप इसे कोई तर्क नहीं देते हैं। इसलिए, आप के साथ इस विशिष्ट मामले में अपने सिरों को प्राप्त कर सकते हैं:

xxx |& cat 

बेशक, वहाँ भी है bash चलाने से रोक कुछ भी नहीं एक csh स्क्रिप्ट के भीतर (यह मानते हुए इसे कहीं सिस्टम पर है) आपको अतिरिक्त क्षमताओं को देने के लिए। फिर आप अधिक जटिल मामलों के लिए उस खोल के समृद्ध पुनर्निर्देशन का उपयोग कर सकते हैं जहां csh संघर्ष कर सकता है।

आइए इसे और अधिक विस्तार से देखें।सबसे पहले, एक निष्पादन echo_err कि stderr के लिए एक स्ट्रिंग लिखेंगे बनाएँ:

#include <stdio.h> 
int main (int argc, char *argv[]) { 
    fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?"); 
    return 0; 
} 

फिर एक नियंत्रण लिपि test.csh जो यह कार्रवाई में दिखाएगा:

#!/usr/bin/csh 

ps -ef ; echo ; echo $$ ; echo 

echo 'stdout (csh)' 
./echo_err csh 

bash -c "(echo 'stdout (bash)' ; ./echo_err bash) 2>&1" 

पीआईडी ​​की echo और ps बस इतना कर रहे हैं आप यह सुनिश्चित कर सकते हैं कि यह csh इस स्क्रिप्ट को चला रहा है।

./test.csh >test.out 2>test.err 

(प्रारंभिक पुनर्निर्देशन bash से पहले csh स्क्रिप्ट चलाने शुरू होता है द्वारा स्थापित किया गया है), और out/err फाइलों की जांच, आप देखते हैं:

test.out: 
    UID  PID PPID TTY  STIME  COMMAND 
    pax 5708 5364 cons0  11:31:14 /usr/bin/ps 
    pax 5364 7364 cons0  11:31:13 /usr/bin/tcsh 
    pax 7364  1 cons0  10:44:30 /usr/bin/bash 

    5364 

    stdout (csh) 
    stdout (bash) 
    stderr (bash) 

test.err: 
    stderr (csh) 

आप आप के साथ इस स्क्रिप्ट को चलाने के दौरान वहां देख सकते हैं कि test.csh प्रक्रिया सी खोल में चल रही है, और वहां से bash पर कॉल करने से आपको पूर्ण bash पुनर्निर्देशन की शक्ति मिलती है।

2>&1bash आदेश में काफी आसानी से आप वर्तमान मानक आउटपुट (के रूप में वांछित) जहां मानक आउटपुट वर्तमान में जा रहा है की पूर्व जानकारी के बिना करने के लिए मानक त्रुटि अनुप्रेषित करने देता है।

+0

पर तारांकित कर सकता हूं हाय, यह बायोफ की प्रतिक्रिया को थोड़ा सा संशोधित करके सीएसएच के साथ किया जा सकता है। आप जो चाहते हैं वह है stderr और stdout धाराओं को गठबंधन करना और फ़ाइल में नहीं। तो 'xxx | & tee/dev/null' करें और इसका परिणाम स्ट्रीम को संयोजित करने का प्रभाव होगा, उन्हें नकली फ़ाइल में भेजना होगा, लेकिन स्क्रीन पर STDOUT दोनों को भेजना होगा (या जहां भी आप stdout का उपयोग कर रहे हैं)। कृपया इस विकल्प के साथ इस उत्तर को अद्यतन करें। – mdiehl13

+0

@ mdiehl13, असल में, यह एक अच्छा बिंदु है और ऐसा नहीं जिसे मैंने माना था। हालांकि, मुझे यकीन नहीं है कि 'टीई' नौकरी के लिए सही उपकरण है। 'टीई' के माध्यम से डेटा को मानक आउटपुट और '/ dev/null' के माध्यम से डेटा भेजना' cat' से * * मानक आउटपुट के माध्यम से डेटा भेजने के लिए अलग नहीं है। तो मैंने इसे उस विकल्प के साथ अपडेट किया, लेकिन जानकारी के लिए धन्यवाद, इससे बहुत मदद मिली। – paxdiablo

+0

'cmd> और/dev/stderr' वास्तव में पूरी तरह से मेरे नोमाचिन सत्र को खराब कर दिया, भले ही आदेश उस सत्र से रिमोट सिस्टम पर था। मैंने इस जवाब को अतीत में उखाड़ फेंक दिया था, इसलिए शायद यह अतीत में काम करता था, लेकिन मैं सावधान रहने के लिए इस दूसरी राय की पेशकश कर रहा हूं। – esmit

27

जैसा कि पक्सडीब्लो ने कहा था कि आप >& दोनों stdout और stderr को पुनर्निर्देशित करने के लिए उपयोग कर सकते हैं।

(command > stdoutfile) >& stderrfile 

... के रूप में ऊपर संकेत stdoutfile को stdout और stderr अनुप्रेषित stderrfile को देगा: लेकिन अगर आप चाहते हैं उन्हें आप उपयोग कर सकते हैं निम्नलिखित अलग कर दिया।

+0

इस उत्तर में IMHO अधिक वोट होना चाहिए। क्या कोई नकारात्मक साइड इफेक्ट नहीं है जो मुझे नहीं दिख रहा है? – Martin

+0

यह मेरी राय में सही जवाब है .. अन्य स्वीकृत उत्तर प्रश्न का उत्तर नहीं देते हैं! – Charbel

+0

@ चार्बेल, यह stderr को _current_ stdout पर रीडायरेक्ट नहीं करता है, यह दोनों को _new_ स्थान पर रीडायरेक्ट करता है। – paxdiablo

41

मैं उपरोक्त उत्तर को ऑब्जेक्ट करता हूं और अपना खुद का प्रदान करता हूं। csh करता है यह क्षमता और यहाँ कि यह कैसे हुआ है:

xxx |& some_exeC# will pipe merged output to your some_exec 

या

xxx |& cat > filename 

या आप बस यह स्ट्रीम (stdout के लिए) विलय करने के लिए और एक फ़ाइल या some_exec पर रीडायरेक्ट नहीं चाहते हैं:

xxx |& tee /dev/null 
+1

@chris, यह आपको एक ही स्थान पर stdout और stderr भेजने की अनुमति देता है लेकिन यह _not_ को मानक त्रुटि को _current_ मानक आउटपुट में पाइप करने की अनुमति देता है। तो हर तरह से इसे वोट दें, बस जागरूक रहें कि यह सवाल का जवाब नहीं देता है। अस्थायी रूप से 'bash' खोल को कॉल करने की चालबाजी को छोड़कर, ओपी ने पूछा कि 'सीएसएच' के साथ नहीं किया जा सकता है। – paxdiablo

+1

जबकि सीएसएच में कोई सटीक समतुल्य नहीं है, वहीं आपका उत्तर केवल उपयोग के मामले को कवर करता है जब आप दोनों stdout और stderr को फ़ाइल में रीडायरेक्ट करना चाहते हैं। यह उत्तर यह भी दर्शाता है कि उन्हें एक पाइप में कैसे रीडायरेक्ट करना है। – chris

+0

@ क्रिस, प्रश्न को वर्तमान stdout पर stderr को निर्देशित करने के लिए एक रास्ता कहा जाता है, न कि उन्हें दोनों को एक नए नए स्थान (चाहे फ़ाइल या पाइप) पर निर्देशित किया जाए। उत्तरार्द्ध या तो मेरे उत्तर या इस उत्तर के पहले भाग के साथ किया जा सकता है लेकिन सीएसएच को पूर्व करने का कोई तरीका नहीं है। यदि आप मेरे उत्तर का दूसरा भाग पढ़ते हैं (अस्थायी रूप से सीएसएच से बैश को कॉल करते हैं, और अब उम्मीदवार स्पष्ट रूप से स्पष्ट करने के लिए एक ठोस उदाहरण के साथ विस्तारित), तो यह ठीक है। – paxdiablo

-1

मुझे लगता है कि यह सीएसएच के लिए सही जवाब है।

xxx >/dev/stderr 

नोट सबसे csh वास्तव में आधुनिक वातावरण में tcsh रहे हैं:

rmockler>ls -latr /usr/bin/csh

lrwxrwxrwx 1 जड़ जड़ 9 2011-05-03 13:40/usr/bin/csh ->/बिन/tcsh

एक बैकटिक एम्बेडेड कथन का उपयोग इस चित्रित करने के लिए इस प्रकार है:

echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt 

यदि यह आपके लिए काम करता है तो कृपया 1 तक बढ़ जाएं। अन्य सुझाव मेरे सीएच पर्यावरण के लिए काम नहीं करते हैं।

4

के बारे में क्या सिर्फ

xxx >& /dev/stdout 

???

+3

यह प्रश्न का उत्तर प्रदान करता है, लेकिन इसे शायद प्रश्न चिह्नों के साथ प्रस्तुत नहीं किया जाना चाहिए, क्योंकि ऐसा लगता है कि पोस्टर अनिश्चित है अगर यह प्रश्न का उत्तर देता है। –

4
xxx >& filename 

या स्क्रीन पर सब कुछ देख सकते हैं और यह आपके फाइल करने के लिए जाना है करने के लिए ऐसा करते हैं:

xxx | & tee ./logfile 
संबंधित मुद्दे