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>&1
bash
आदेश में काफी आसानी से आप वर्तमान मानक आउटपुट (के रूप में वांछित) जहां मानक आउटपुट वर्तमान में जा रहा है की पूर्व जानकारी के बिना करने के लिए मानक त्रुटि अनुप्रेषित करने देता है।
CSH खतरनाक है। बैश में स्थानांतरित करने का प्रयास करें, zsh http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ –
@SSHegde "खतरनाक" से आपका क्या मतलब है? –
@ गीज़ा: कृपया उस लिंक का संदर्भ लें जिसका मैंने टिप्पणी में उल्लेख किया था। यह बताता है क्यों। –