nullglob
বিকল্প (যা BTW একটি হল zsh
উদ্ভাবন, শুধুমাত্র বছর পরে যোগ bash
( 2.0
মামলা একটি সংখ্যা আদর্শ হবে না))। এবং ls
একটি ভাল উদাহরণ:
ls *.txt
বা এর আরও সঠিক সমতুল্য:
ls -- *.txt
সঙ্গে nullglob
চালানো হবে ls
কোন যুক্তি যা হিসাবে গণ্য হবে সঙ্গে ls -- .
(বর্তমান ডিরেক্টরির তালিকা) যদি কোন ফাইল মেলে, যা সম্ভবত কলিং চেয়েও কঠিন অপরাধ ls
একটি আক্ষরিক সঙ্গে *.txt
আর্গুমেন্ট হিসাবে।
বেশিরভাগ টেক্সট ইউটিলিটিগুলির সাথে আপনার একই সমস্যা রয়েছে:
grep foo *.txt
ফাইল foo
না থাকলে স্টিডিনে খোঁজ করতেন txt
।
আরও বুদ্ধিমান ডিফল্ট এবং csh, tcsh, zsh বা માછલી ২.৩++ (এবং প্রথমদিকে ইউনিক্স শেলগুলির) হ'ল গ্লোব মেলে না গেলে কমান্ডটি পুরোপুরি বাতিল করতে হবে।
bash
(যেহেতু সংস্করণ 3) এর জন্য একটি failglob
বিকল্প রয়েছে (এই আলোচনার জন্য আকর্ষণীয়, বিপরীতে ash
, এটি অ্যান্ড টি ksh
বা zsh
, bash
বিকল্পগুলির জন্য স্থানীয় স্কোপগুলিকে সমর্থন করে না (যদিও এটি ৪.৪-এ পরিবর্তিত হবে)), যখন বিকল্পটি বিশ্বব্যাপী সক্ষম হয় তখন কয়েকটি জিনিস ভাঙে বাশ-সমাপ্তির ফাংশনগুলির মতো)।
মনে রাখবেন যে, csh শেল এবং tcsh শেল থেকে সামান্য ভিন্ন zsh
, fish
বা bash -O failglob
মত ক্ষেত্রে:
ls -- *.txt *.html
আপনার কমান্ডটি বাতিল হওয়ার জন্য সমস্ত গ্লোব মিলছে না। উদাহরণস্বরূপ, যদি একটি টেক্সট ফাইল থাকে এবং এইচটিএমএল ফাইল না থাকে তবে তা হয়ে যায়:
ls -- file.txt
আপনার সাথে যে আচরণ পেতে পারেন zsh
সঙ্গে setopt cshnullglob
যদিও এটি না করার জন্য আর যুক্তিসম্মত উপায় zsh
মত একটি উল্লিখিত glob ব্যবহার করতে হবে:
ls -- *.(txt|html)
ইন zsh
এবং ksh93
, এছাড়াও আপনি আবেদন করতে পারেন nullglob প্রতি উল্লিখিত glob ভিত্তিতে, যা একটি গ্লোবাল সেটিংসকে পরিবর্তন তুলনায় অনেক saner পন্থা করুন:
files=(*.txt(N)) # zsh
files=(~(N)*.txt) # ksh93
txt
কোনও ত্রুটিযুক্ত কমান্ড ব্যর্থ করার পরিবর্তে কোনও ফাইল না থাকলে (বা এটি *.txt
অন্যান্য শাঁসের সাথে একটি আক্ষরিক যুক্তি দিয়ে অ্যারে তৈরি করা) যদি একটি ফাঁকা অ্যারে তৈরি করে ।
fish
২.৩ এর পূর্ববর্তী সংস্করণগুলি এমনভাবে কাজ করবে bash -O nullglob
কিন্তু যখন কোনও গ্লোবের কোনও মিল নেই তখন ইন্টারেক্টিভ করার সময় একটি সতর্কতা দেয়। 2.3 সাল থেকে, এটা মত কাজ করে zsh
ব্যবহার করা globs ছাড়া for
, set
অথবা count
।
এখন, ইতিহাস নোটে, আচরণটি আসলে বোর্ন শেল দ্বারা ভেঙে গেছে । ইউনিক্সের পূর্ববর্তী সংস্করণগুলিতে, সহায়তাকারীর মাধ্যমে গ্লোববিং করা হত /etc/glob
এবং সেই সাহায্যকারের মতো আচরণ করা হয়েছিল csh
: যদি কোনও গ্লোব কোনও ফাইলই মিলে না যায় এবং অন্যথায় কোনও মিল না দিয়ে গ্লোবগুলি সরিয়ে দেয় তবে কমান্ডটি ব্যর্থ হবে।
বোর্ন শেলটিতে করা একটি খারাপ সিদ্ধান্তের কারণে আমরা আজ যে পরিস্থিতিটির মধ্যে আছি।
নোট করুন যে বোর্ন শেল (এবং সি শেল) আরও একটি নতুন ইউনিক্স বৈশিষ্ট্য নিয়ে এসেছে: পরিবেশ। এর অর্থ পরিবর্তনশীল সম্প্রসারণ (এর পূর্বসূরীর কেবলমাত্র $1
, $2
... অবস্থানগত পরামিতি ছিল)। বোর্ন শেল কমান্ডের প্রতিস্থাপনেরও সূচনা করেছিল।
বোর্ন শেলের আরেকটি দুর্বল নকশার সিদ্ধান্তটি ছিল ভেরিয়েবল এবং কমান্ড প্রতিস্থাপনের বিস্তারের উপর গ্লোববিং (এবং বিভাজন) করা (সম্ভবত থম্পসন শেলের সাথে পশ্চাদপদ সামঞ্জস্যের জন্য যেখানে echo $1
এখনও ওয়াইল্ডকার্ড থাকা /etc/glob
থাকলে অনুরোধ করা হত $1
(এটি প্রি-প্রসেসরের ম্যাক্রো বিস্তারের মতো ছিল) সেখানে, প্রসারিত মানটিকে শেল কোড হিসাবে আবার পার্স করা হয়েছিল))।
মেলে না এমন গ্লোবগুলির ব্যর্থতার অর্থ উদাহরণস্বরূপ:
pattern='a.*b'
grep $pattern file
কমান্ডটি ব্যর্থ করবে ( a.whateverb
বর্তমান ডিরেক্টরিতে কিছু ফাইল না থাকলে)। csh
(যা ভেরিয়েবল প্রসারণ নিয়ে গ্লোব্বিংও করে তোলে) সেক্ষেত্রে কমান্ডটি ব্যর্থ করে (এবং আমি যুক্তি দিয়েছিলাম যে এটি একটি সুপ্ত বাগ ত্যাগ করার চেয়ে ভাল, এমনকি এটি যদি গ্লোব্বিংয়ের মতো না করা যেমন ভাল না হয় তবে zsh
)।