खोल पुनर्निर्देशन का एक बिट

यहाँ है कि कैसे हम सामान्य रूप से खोल पुनर्निर्देशन
$ ./pgm.sh args >out.txt 2>err.txt
मैं यह एक बिट को संशोधित करना चाहता था, और के रूप में चलाने
$ ./pgm.sh args
आवश्यकता है कि उत्पादन और त्रुटि कुछ pgm.sh अंदर args पर आधारित गणना फ़ाइल नाम के लिए जाना चाहिए के साथ. एक निदर्शी मामला है जब तारीख args का हिस्सा है हो सकता है. तो आप stdout / निर्देशिका / / pgm_out_YYYYMMDD.txt कहना चाहते करने के लिए जाना होगा 1

पुनः निर्देशित कर के मानक तरीका के साथ समस्या N>file.txt यानी, file.txt के लिए फ़ाइल विवरणक एन जोड़ है, कि यह केवल नव काँटेदार प्रक्रिया के लिए और नहीं वर्तमान प्रक्रिया के लिए काम करता है.
इसलिए
$ echo hi 1>out.txt ; echo hii हाय out.txt के लिए भेज लेकिन stdout में नमूना मुद्रित होगा. 2

यह वह जगह है जहां exec हमारे बचाव के लिए आता है. अगर हम जोड़ने के exec 1>somefile.txt तो स्क्रिप्ट के बाकी हिस्सों से आउटपुट somefile.txt के लिए जाना जाएगा

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh हाय out.txt के रूप में नमूना के रूप में अच्छी तरह से अनुप्रेषित करेगा

इसी तरह के रूप में के रूप में अच्छी तरह से stdout stderr पुनर्निर्देशित हम कुछ इस तरह करूँगा
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

अब खोल के अंदर से कुछ फ़ाइल को पुनः निर्देशित कर के मूल बिंदु के लिए वापस आ रहा है, चलो का कहना है कि कार्यक्रम कुछ चर OUTFILE में फ़ाइलनाम गणना, हम बस किया सकता exec 1>$OUTFILE

यह वर्तमान समस्या हल करती है. लेकिन आप निम्न उदाहरण है जो खोल स्क्रिप्ट में फ़ाइल के यादृच्छिक अभिगम 'प्राप्त होता है के माध्यम से जाना चाहते हो सकता है. उदाहरण से है यहाँ
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

टिप्पणी के साथ, इस कोड को आत्म व्याख्यात्मक है.
-
1 यह भी द्वारा किया जा सकता है $ ./pgm.sh args >pgm_out`date +%Y%m%d` लेकिन विचार करने के लिए ही प्रोग्राम में कुछ तर्क पर आधारित इस फ़ाइल नाम उत्पन्न है.
1 2 1 में> out.txt निरर्थक है लेकिन यहां यह स्पष्ट है कि हम 1 fd पुनः निर्देशित कर रहे हैं