2008-08-27 19 views
9

मैं इंटरैक्टिव बैश में सभी stderr धाराओं को रीडायरेक्ट करने का एक तरीका ढूंढ रहा हूं (आदर्श रूप से इसके कॉलिंग पैरेंट प्रक्रिया के लिए)।बैश में सभी stderr को पुनर्निर्देशित करने के लिए कैसे?

मैं प्रत्येक व्यक्तिगत कमांड से stderr स्ट्रीम को पुनर्निर्देशित नहीं करना चाहता, जिसे मैं प्रत्येक आदेश में 2> a_file जोड़कर कर सकता हूं।

डिफ़ॉल्ट रूप से, इन stderr धाराओं को एक इंटरैक्टिव बैश के stdout पर रीडायरेक्ट कर रहे हैं। मैं त्रुटि संदेशों द्वारा प्रदूषित होने के लिए अपने stdout को रोकने के लिए और अलग से इलाज करने में सक्षम होने के लिए, इस इंटरैक्टिव बैश प्रक्रिया के stderr पर उन्हें प्राप्त करना चाहते हैं।

कोई विचार?

मुझे अभी भी कोई जवाब नहीं मिला है ... लेकिन शायद यह वास्तव में एक छोटा सा पैरामीटर है। क्या कोई stderr को संभालने के लिए tty/इंटरैक्टिव खोल जिम्मेदारी के बारे में कुछ जानता है?

+0

आप एक टिप्पणी में अजगर का उल्लेख है, आप कौन-सा कोड के लिए उपयोग कर रहे हैं दिखा सकता है इन एसएसएच धाराएं बनाएं। क्या आप popen/popen2/popen3 का उपयोग नहीं कर रहे हैं? – jtimberman

उत्तर

4

आप एक नया बैश प्रक्रिया है कि प्रक्रिया के stderr पुनः निर्देशित लांच कर सकता है:

$ bash -i 2> stderr.log 
    $ 
7

उपयोग exec बैश में builtin:

exec 2> /tmp/myfile

2

तो की तरह, doublequotes में अपने आदेश का प्रयास करें:

ssh remotehost "command" 2>~/stderr 

परीक्षण किया गया रिमोट होस्ट पर एक nonxistant फ़ाइल का उपयोग कर अपने स्थानीय सिस्टम पर।

$ ssh remotehost "tail x;head x" 2>~/stderr 
$ cat stderr 
tail: cannot open `x' for reading: No such file or directory 
head: cannot open `x' for reading: No such file or directory 
+0

यदि आप ssh के बाद सीधे कमांड टाइप करते हैं, तो आप दूरस्थ होस्ट पर एक शेल लोड नहीं कर रहे हैं। कमांड को एसएसएच चैनल के माध्यम से सीधे निष्पादित किया जाता है। मैं पाइथन में paramiko का उपयोग कर रहा हूँ, लेकिन यह वही है। मेरी समस्या यह है कि मुझे कई आदेशों को निष्पादित करने के लिए एक इंटरैक्टिव खोल की आवश्यकता है और फिर भी stderr मिलता है। –

2

मैं आपकी समस्या को नहीं देख पा रहे इसे डिजाइन रूप में काम करता है:

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout 
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found 
0

की कोशिश की ssh -t दूरदराज के अंत में एक छद्म TTY बनाने के लिए?

2

दो बातें:

  1. स्थानीय tarfile अंदर समाप्त त्रुटि में एक दूरस्थ ssh आदेश परिणामों में 2>&1 का उपयोग करना, एक 'टूट' बैकअप हो जाती है।
  2. यदि आप एसएसएच के दूसरी तरफ एक रीडायरेक्ट लागू करना चाहते हैं, तो रीडायरेक्ट कमांड से बचने के लिए याद रखें।

मेरा सुझाव किसी फ़ाइल के दूरस्थ भाग पर stderr को रीडायरेक्ट करना होगा और बाद में इसे किसी त्रुटि के मामले में ले जाना होगा। (कोई उप

ssh -t remotehost tar -cf - /mnt/backup 2\>backup.err > localbackup.tar 
EXITSTATUS=$? 
if [ $EXITSTATUS != "0" ] then 
    echo Error occurred! 
    ssh remotehost cat backup.err >localbackup.errors 
    cat localbackup.errors 
    ssh remotehost rm backup.err 
else 
    echo Backup completed successfully! 
    ssh remotehost rm backup.err 
fi 
2

मुझे लगता है एक अच्छा तरीका है, कोष्ठक, '()' द्वारा आदेशों के चारों ओर या घुंघराले-ब्रेसिज़, '{}' (एक उप खोल लांच) है:

उदाहरण -shell; तेजी से):

{ 
    cmd1 
    cmd2 
    ... 
    cmdN 
} 2> error.log 
बेशक

, यह 1 लाइन पर किया जा सकता है:

{ cmd1; cmd2; ... cmdN; } 2> error.log