এটি দক্ষতা সম্পর্কে নয় - এটি সঠিকতা সম্পর্কে। basename
প্রিন্ট করা ফাইলের নামগুলি সীমিত করতে নিউলাইনগুলি ব্যবহার করে। সাধারণ ক্ষেত্রে যখন আপনি কেবল একটি ফাইল নাম পাস করেন, এটি এর আউটপুটে একটি পিছনে নতুন লাইন যুক্ত করে। যেহেতু ফাইলের নামগুলিতে নিজেরাই নিউলাইন থাকতে পারে তাই এই ফাইলগুলির নামগুলি সঠিকভাবে পরিচালনা করতে অসুবিধা হয়।
এটি আরও সত্য যে মানুষ সাধারণত ব্যবহার দ্বারা জটিল basename
ভালো: "$(basename "$file")"
। এটি জিনিসগুলিকে আরও বেশি কঠিন করে তোলে, কারণ এখান থেকে সমস্ত পেছনের নতুন লাইনগুলি $(command)
স্ট্রিপ করে । একটি নতুন লাইন দিয়ে শেষ হয় এমন সম্ভাব্য কেসটি বিবেচনা করুন । তারপরে একটি অতিরিক্ত নিউলাইন যুক্ত হবে, তবে আপনাকে একটি ভুল ফাইল নাম রেখে নতুন দুটি লাইনই ছড়িয়ে দেবে।command
$file
basename
"$(basename "$file")"
এর সাথে আর একটি সমস্যা basename
হ'ল যদি $file
কোনও -
(ড্যাশ ওরফে বিয়োগ) দিয়ে শুরু হয় , তবে এটি বিকল্প হিসাবে ব্যাখ্যা করা হবে। এই এক ঠিক করা সহজ:$(basename -- "$file")
ব্যবহারের শক্তিশালী উপায় basename
হ'ল:
# A file with three trailing newlines.
file=$'/tmp/evil\n\n\n'
# Add an 'x' so we can tell where $file's newlines end and basename's begin.
file_x="$(basename -- "$file"; printf x)"
# Strip off two trailing characters: the 'x' added by us and the newline added by basename.
base="${file_x%??}"
একটি বিকল্প ব্যবহার করা হয় ${file##*/}
, যা সহজ তবে এর নিজস্ব বাগ রয়েছে। বিশেষ করে, এটা ক্ষেত্রে যেখানে মধ্যে ভুল $file
হয় /
বা foo/
।