গ্রুপ কমান্ড এবং এখানে-স্ট্রিংয়ের সাথে ওরফে সীমাবদ্ধতার চারপাশে কাজ করা
উপাধিগুলি যুক্তি নিতে পারে না, তবে আমরা এটি "অনুকরণ" করতে পারি। এই প্রশ্নের আমার উত্তর উদাহরণস্বরূপ নিন ।
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
মূল পয়েন্টগুলি যা এখানে ঘটছে:
read
একটি ভেরিয়েবলের স্ট্রিং পড়তে আমরা অন্তর্নির্মিত ব্যবহার করি d
। যেহেতু আমরা ফাঁকা অক্ষর (নিউলাইন, ট্যাব, স্পেস) সহ একটি সম্পূর্ণ স্ট্রিং পড়তে চাই, তাই আমরা IFS=
ব্যাকস্ল্যাশ পলায়নগুলি ব্যবহার করি এবং অক্ষম করি -r
।
<<<
যা এখানে স্ট্রিং অপারেটর আমাদের উপন্যাসের পক্ষে যুক্তি হিসাবে যে কোনও স্ট্রিং সরবরাহ করে তা পুনর্নির্দেশের অনুমতি দেয় mkcd
; ব্যবহার হিসাবে হবেmkcd "some directory"
- ওরফে মধ্যে একাধিক কমান্ড মিলিত এবং ব্যবহার বর্তমান শেল মধ্যে মৃত্যুদন্ড কার্যকর করা হয়
{ list; }
কাঠামো (যা হিসাবে পরিচিত হয় group command
এ bash
ম্যানুয়াল)। নোট করুন যে নেতৃত্বের পরে স্থান {
এবং ;
পৃথক কমান্ডের তালিকা প্রয়োজন।
আপনার নির্দিষ্ট উদাহরণে আমরা এটি করতে পারি:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
স্পেস-বিভাজিত যুক্তিগুলি সঞ্চয় করতে আমরা শব্দ বিভাজন ব্যবহার করতে পারি:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
অথবা আমরা একাধিক যুক্তি সরবরাহ করতে অ্যারে ব্যবহার করতে পারি:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
কিন্তু এই ভাল পদ্ধতির হয়?
অগত্যা। এই জাতীয় পদ্ধতির সমস্যাটি এটি খুব নির্দিষ্ট - আর্গুমেন্টগুলি সহজেই উদ্ধৃত করা যায় না যার অর্থ আমরা কেবল কোনও স্থান ছাড়াই আর্গুমেন্ট রাখতে পারি have
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
এটি অবশ্যই এমন কিছু নয় যা বহুল ব্যবহৃত হবে, কেবল কারণ সত্যিকারের বিশ্বে আমাদের জটিল যুক্তিগুলি মোকাবেলা করতে হবে, সুতরাং এই পদ্ধতিটি বেশ ব্যবহারিক নয়। ফাংশনগুলি অনেক বেশি নমনীয়। আরগস স্ট্রিংয়ের উদ্ধৃতি দেওয়ার প্রয়োজনটি দ্রুত বিরক্তিকর হয়ে ওঠে।
সীমাবদ্ধতা থাকা সত্ত্বেও, এটি সরল স্ট্রিংগুলির সাথে আর্গুমেন্ট হিসাবে কাজ করে যেখানে আমরা শব্দ বিভাজনকে বহন করতে পারি, এভাবে আংশিকভাবে আমাদের উপাধিতে আর্গুমেন্ট দেওয়ার অনুমতি দেয়।