$(<file)(এছাড়াও এতে কাজ করে `<file`) হ'ল zshএবং দ্বারা অনুলিপি করা কর্ন শেলের একটি বিশেষ অপারেটর bash। এটি দেখতে অনেকটা কমান্ড প্রতিস্থাপনের মতো দেখাচ্ছে তবে এটি বাস্তবে নয়।
পসিক্স শেলগুলিতে একটি সাধারণ কমান্ডটি হ'ল:
< file var1=value1 > file2 cmd 2> file3 args 3> file4
সমস্ত অংশগুলি alচ্ছিক, আপনার কেবল পুনর্নির্দেশ, কেবল আদেশ, কেবলমাত্র অ্যাসাইনমেন্ট বা সংমিশ্রণ থাকতে পারে।
যদি পুনঃনির্দেশগুলি থাকে তবে কোনও আদেশ নেই, পুনর্নির্দেশগুলি সম্পাদন করা হয় (সুতরাং > fileএটি খোলা হবে এবং কাটা হবে file) তবে কিছুই ঘটে না। সুতরাং
< file
fileপড়ার জন্য খোলে , তবে কোনও আদেশ না থাকায় কিছুই ঘটে না। সুতরাং fileতারপর বন্ধ এবং এটি। যদি $(< file)একটি সরল কমান্ড প্রতিস্থাপন হয় , তবে এটি কিছুতেই প্রসারিত হত।
ইন POSIX স্পেসিফিকেশন , ইন $(script), যদি scriptশুধুমাত্র পুনঃনির্দেশগুলি নিয়ে গঠিত, যে অনির্দিষ্ট ফল । এটি কর্ন শেলের সেই বিশেষ আচরণের অনুমতি দেয়।
কেএসএসে (এখানে এটি দিয়ে পরীক্ষা করা হয়েছে ksh93u+), যদি স্ক্রিপ্টটিতে একটি এবং কেবলমাত্র একটি সাধারণ কমান্ড থাকে (যদিও মন্তব্যগুলি আগে এবং পরে অনুমোদিত হয়) কেবলমাত্র পুনর্নির্দেশগুলি নিয়ে গঠিত (কোনও আদেশ নয়, কোনও কার্যনির্বাহী নয়) এবং যদি প্রথম পুনর্নির্দেশটি স্টিডিন (fd) হয় 0) ইনপুট শুধুমাত্র ( <, <<বা <<<) ফেরৎ, তাই:
$(< file)
$(0< file)
$(<&3)(এছাড়াও $(0>&3)বাস্তবে একই অপারেটর কার্যকর হিসাবে)
$(< file > foo 2> $(whatever))
কিন্তু না:
$(> foo < file)
- না
$(0<> file)
- না
$(< file; sleep 1)
- না
$(< file; < file2)
তারপর
- প্রথম পুনর্নির্দেশ ছাড়া সমস্ত এড়ানো হবে (সেগুলি পার্স করে দেওয়া হয়)
- এবং এটি ফাইল / হেরেডোক / হিয়ারস্ট্রিংয়ের সামগ্রীতে প্রসারিত হয় (বা যেমন কিছু ব্যবহার করে ফাইল বর্ণনাকারীর কাছ থেকে যা কিছু পড়তে পারে
<&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তার স্টাডাউট যেহেতু পাইপ হবে তাই পছন্দ করে) acting
তবে যখন 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)যেখানে catএকটি builtin হবে cat।
- উপরের ফলস্বরূপ, এর মধ্যে করা কোনও পরিবর্তন পরে নষ্ট হয়ে যায় (
$(<${file=foo.txt})উদাহরণস্বরূপ, উপরে উল্লিখিত, এই $fileকার্যভারটি পরে হারিয়ে যায়)।
ইন bash, IFS= read -rd '' var < file (এছাড়াও এতে কাজ করে zsh) একটি টেক্সট ফাইলের বিষয়বস্তুকে একটি ভেরিয়েবলের মধ্যে পড়ার আরও কার্যকর উপায় । এর পিছনে থাকা নতুন লাইনের চরিত্রগুলি সংরক্ষণ করার সুবিধাও রয়েছে। আরও দেখুন $mapfile[file]মধ্যে zsh(ইন zsh/mapfileমডিউল এবং শুধুমাত্র নিয়মিত ফাইল জন্য) যা বাইনারি ফাইল সঙ্গে কাজ করে।
উল্লেখ্য, পিডিএক্স-ভিত্তিক বৈকল্পিকগুলির kshksh93 এর তুলনায় কয়েকটি ভিন্নতা রয়েছে। আগ্রহের বিষয়, mksh(সেইগুলির মধ্যে পিডিএক্স-উত্পন্ন শেলগুলির মধ্যে একটি), ইন
var=$(<<'EOF'
That's multi-line
test with *all* sorts of "special"
characters
EOF
)
এতে অনুকূলিত হয়েছে যে এখানে নথির বিষয়বস্তু (পিছনের অক্ষরগুলি ছাড়াই) অস্থায়ী ফাইল বা পাইপ ব্যবহার না করে প্রসারিত করা হয়েছে অন্যথায় এখানে নথির ক্ষেত্রে, যা এটি কার্যকর মাল্টি-লাইন উদ্ধৃতি বাক্য গঠন করে তোলে।
সমস্ত সংস্করণে পোর্টেবল হওয়ার জন্য ksh, zshএবং bashসর্বোত্তম হ'ল কেবল $(<file)মন্তব্যগুলি এড়ানো এবং মনে রাখতে হবে যে ভেরিয়েবলগুলির মধ্যে পরিবর্তনগুলি সংরক্ষণ করা যেতে পারে বা সংরক্ষণ করা যায় না।
bashএটি ব্যাখ্যা করবেন " বলছেনcat filename, আপনার অর্থ কি এই আচরণটি প্রতিস্থাপনের আদেশের জন্য নির্দিষ্ট? কারণ আমি যদি< filenameনিজেই চালনা করি তবে ব্যাশ তা কার্যকর করে না। এটি কিছুই না আউটপুট এবং একটি প্রম্পটে আমাকে ফিরিয়ে দেবে।