$(<file)(साथ काम भी करता है `<file`) कोर्न शेल के एक विशेष ऑपरेटर द्वारा कॉपी किया गया zshऔर bash। यह कमांड प्रतिस्थापन की तरह दिखता है, लेकिन यह वास्तव में नहीं है।
POSIX गोले में, एक साधारण कमांड है:
< file var1=value1 > file2 cmd 2> file3 args 3> file4
सभी भाग वैकल्पिक हैं, आप केवल पुनर्निर्देशन कर सकते हैं, केवल कमांड, केवल असाइनमेंट या संयोजन।
यदि पुनर्निर्देशन हैं, लेकिन कोई आदेश नहीं है, तो पुनर्निर्देशन किया जाता है (इसलिए > fileखुल जाएगा और छोटा हो जाएगा file), लेकिन तब कुछ भी नहीं होता है। इसलिए
< file
fileपढ़ने के लिए खोलता है, लेकिन तब कुछ भी नहीं होता है क्योंकि कोई आदेश नहीं है। तो fileफिर बंद है और यह बात है। यदि $(< file)एक साधारण कमांड प्रतिस्थापन था , तो इसका विस्तार कुछ भी नहीं होगा।
में POSIX विनिर्देशन , में $(script), अगर scriptकेवल पुनर्निर्देशन के होते हैं, कि अनिर्दिष्ट परिणाम का उत्पादन । कि कोर्न शेल के उस विशेष व्यवहार की अनुमति है।
Ksh में (यहां परीक्षण किया गया ksh93u+), यदि स्क्रिप्ट में एक और केवल एक साधारण कमांड है (हालांकि टिप्पणियों को पहले और बाद में अनुमति दी गई है) जिसमें केवल पुनर्निर्देशन (कोई आदेश, कोई असाइनमेंट) नहीं है और यदि पहला पुनर्निर्देशन एक स्टड है (fd) 0) इनपुट केवल ( <, <<या <<<) पुनर्निर्देशन, इसलिए:
$(< file)
$(0< file)
$(<&3)(यह भी $(0>&3)वास्तव में एक ही ऑपरेटर के प्रभाव में है)
$(< file > foo 2> $(whatever))
लेकिन नहीं:
$(> foo < file)
- न
$(0<> file)
- न
$(< file; sleep 1)
- न
$(< file; < file2)
फिर
- सभी लेकिन पहले पुनर्निर्देशन को नजरअंदाज किया जाता है (उन्हें दूर रखा जाता है)
- और यह फ़ाइल / heredoc / herestring की सामग्री (या जो कुछ भी फ़ाइल का उपयोग करने वाला फ़ाइल विवरणक से पढ़ा जा सकता है) की सीमा तक फैलता है
<&3, अनुगामी न्यूलाइन वर्णों को घटाता है।
जैसे $(cat < file)कि इसके अलावा उपयोग करना
- रीडिंग आंतरिक रूप से शेल द्वारा की जाती है और इसके द्वारा नहीं
cat
- कोई पाइप और न ही अतिरिक्त प्रक्रिया शामिल है
- ऊपर के परिणाम के रूप में, क्योंकि अंदर कोड एक उपधारा में नहीं चलाया जाता है, इसके बाद कोई भी संशोधन शेष रहता है (जैसे
$(<${file=foo.txt})या $(<file$((++n))))
- रीड एरर (हालाँकि फाइल खोलने या फाइल डिस्क्रिप्टर को डुप्लिकेट करते समय त्रुटियाँ नहीं हैं) को चुपचाप नजरअंदाज कर दिया जाता है।
में zsh, यह सिवाय इसके कि उस विशेष व्यवहार केवल शुरू हो रहा है जब केवल एक फ़ाइल इनपुट पुनर्निर्देशन है ही है ( <fileया 0< fileनहीं, कोई <&3, <<<here, < a < b...)
हालाँकि, अन्य गोले का अनुकरण करते समय:
< file
<&3
<<< here...
जब आदेश के बाहर केवल इनपुट पुनर्निर्देशन होते हैं, तो कमांड प्रतिस्थापन के बाहर, (डिफ़ॉल्ट रूप से एक पेजर) zshचलाता है $READNULLCMD, और जब इनपुट और आउटपुट दोनों पुनर्निर्देशन होते हैं, तो $NULLCMD( catडिफ़ॉल्ट रूप से), इसलिए भले ही $(<&3)उस विशेष के रूप में मान्यता प्राप्त न हो। ऑपरेटर, यह अभी भी काम करेगा, kshहालांकि इसे करने के लिए एक पेजर को आमंत्रित करके (यह कि पेजर अभिनय कर रहा है catक्योंकि इसके स्टडआउट एक पाइप होगा)।
हालांकि, जबकि ksh'एस $(< a < b)की सामग्री के लिए विस्तार होगा aमें, zshहै, यह की सामग्री के लिए फैलता है aऔर b(या बस bअगर multiosविकल्प अक्षम होता है), $(< a > b)की नक़ल की aकरने के लिए bऔर कुछ भी नहीं है, आदि का विस्तार
bash एक समान ऑपरेटर है लेकिन कुछ अंतरों के साथ:
टिप्पणियों की अनुमति पहले है लेकिन बाद में नहीं:
echo "$(
# getting the content of file
< file)"
काम करता है लेकिन:
echo "$(< file
# getting the content of file
)"
विस्तार कुछ भी नहीं।
जैसे zsh, केवल एक फ़ाइल स्टड पुनर्निर्देशन, हालांकि इसमें कोई गिरावट नहीं है $READNULLCMD, इसलिए $(<&3), $(< a < b)पुनर्निर्देशन करें, लेकिन विस्तार कुछ भी नहीं करें।
- किसी कारण के लिए, जब
bashयह आह्वान नहीं करता है cat, तब भी यह एक ऐसी प्रक्रिया की तलाश करता है जो फ़ाइल की सामग्री को एक पाइप के माध्यम से खिलाती है, जो इसे अन्य गोले की तुलना में बहुत कम अनुकूलन बनाती है। यह एक बिलियन होगा $(cat < file)जहां प्रभाव की तरह है ।catcat
- उपरोक्त के परिणामस्वरूप, किसी भी परिवर्तन को बाद में खो दिया जाता है (
$(<${file=foo.txt})उदाहरण के लिए, ऊपर उल्लेखित है, कि $fileअसाइनमेंट आगे की तरफ खो गया है)।
में bash, IFS= read -rd '' var < file (यह भी काम करता है zsh) एक पाठ फ़ाइल की सामग्री को एक चर में पढ़ने के लिए एक अधिक प्रभावी तरीका है । इसमें अनुगामी न्यूलाइन वर्णों को संरक्षित करने का भी लाभ है। यह भी देखें $mapfile[file]में zsh(में zsh/mapfileमॉड्यूल और केवल नियमित रूप से फ़ाइलों के लिए) है, जिसकी द्विआधारी फाइलों के साथ काम करता है।
ध्यान दें कि pdksh- आधारित वेरिएंट में kshksh93 की तुलना में कुछ विविधताएँ हैं। ब्याज में, mksh(उन pdksh व्युत्पन्न गोले में से एक), में
var=$(<<'EOF'
That's multi-line
test with *all* sorts of "special"
characters
EOF
)
इसमें अनुकूलित किया गया है कि यहाँ दस्तावेज़ की सामग्री (अनुगामी पात्रों के बिना) को एक अस्थायी फ़ाइल या पाइप के बिना विस्तारित किया जाता है जैसा कि अन्यथा उपयोग किया जा रहा है अन्यथा यहाँ दस्तावेजों के लिए मामला है, जो इसे एक प्रभावी मल्टी-लाइन उद्धरण सिंटैक्स बनाता है।
के सभी संस्करणों के लिए पोर्टेबल होना ksh, zshऔर bash, केवल $(<file)टिप्पणियों और असर को ध्यान में रखते हुए सीमित करना है कि भीतर किए गए चर में संशोधन किया जा सकता है या संरक्षित नहीं किया जा सकता है।
bashव्याख्या करेंगे किcat filename" के रूप में , क्या आपका मतलब यह व्यवहार कमांड प्रतिस्थापन के लिए विशिष्ट है? क्योंकि अगर मैं< filenameखुद से दौड़ता हूं , तो बैश उसे बाहर नहीं निकालता है। यह कुछ भी नहीं उत्पादन और मुझे एक शीघ्र वापस कर देगा।