দুর্ভাগ্যক্রমে দু'জনেরই কৌতুহল আছে।
উভয়ই পসিএক্স দ্বারা প্রয়োজনীয়, সুতরাং তাদের মধ্যে পার্থক্য কোনও বহনযোগ্যতা উদ্বেগ নয় ¹
ইউটিলিটিগুলি ব্যবহার করার সহজ উপায়
base=$(basename -- "$filename")
dir=$(dirname -- "$filename")
পরিবর্তনশীল বিকল্পের পরিবর্তে ডাবল উদ্ধৃতিগুলি সর্বদা হিসাবে নোট করুন এবং --
কমান্ডের পরেও, যদি ফাইলের নামটি ড্যাশ দিয়ে শুরু হয় (অন্যথায় কমান্ডগুলি ফাইলের নামটিকে বিকল্প হিসাবে ব্যাখ্যা করবে)। এটি এখনও একটি কিনারা ক্ষেত্রে ব্যর্থ হয়, যা বিরল তবে এটি দূষিত ব্যবহারকারী দ্বারা বাধ্য করা যেতে পারে²: কমান্ড প্রতিস্থাপনটি নতুন লাইনের পিছনে ফেলেছে। সুতরাং যদি কোনও ফাইল নাম কল করা হয় foo/bar
তবে base
তার bar
পরিবর্তে সেট করা হবে bar
। একটি কার্যপ্রণালী হ'ল একটি নন-লাইন অক্ষর যুক্ত করা এবং কমান্ড প্রতিস্থাপনের পরে এটি ছাঁটাই:
base=$(basename -- "$filename"; echo .); base=${base%.}
dir=$(dirname -- "$filename"; echo .); dir=${dir%.}
প্যারামিটার প্রতিস্থাপনের সাথে, আপনি অদ্ভুত অক্ষরগুলির প্রসারণ সম্পর্কিত প্রান্তের কেসগুলিতে দৌড়েন না, তবে স্ল্যাশ চরিত্রটিতে বেশ কয়েকটি সমস্যা রয়েছে। একটি জিনিস যা একেবারে প্রান্তের কেস নয় তা হ'ল ডিরেক্টরি অংশের কম্পিউটিংয়ের ক্ষেত্রে যেখানে নেই সেখানে ক্ষেত্রে বিভিন্ন কোডের প্রয়োজন /
।
base="${filename##*/}"
case "$filename" in
*/*) dirname="${filename%/*}";;
*) dirname=".";;
esac
প্রান্তের কেসটি যখন ট্রেলিং স্ল্যাশ হয় (মূল ডিরেক্টরিটি যা সমস্ত স্ল্যাশ সহ অন্তর্ভুক্ত) including basename
এবং dirname
কমান্ড বন্ধ স্ট্রিপ স্ল্যাশ trailing আগে তারা তাদের কাজ। আপনি যদি পসিক্স কনস্ট্রাক্টকে আটকে থাকেন তবে একবারে ট্রিলিং স্ল্যাশগুলি ছিনিয়ে নেওয়ার কোনও উপায় নেই তবে আপনি দুটি পদক্ষেপে এটি করতে পারেন। ইনপুটটিতে স্ল্যাশ ছাড়া কিছুই না থাকলে আপনাকে কেস যত্ন নেওয়া দরকার need
case "$filename" in
*/*[!/]*)
trail=${filename##*[!/]}; filename=${filename%%"$trail"}
base=${filename##*/}
dir=${filename%/*};;
*[!/]*)
trail=${filename##*[!/]}
base=${filename%%"$trail"}
dir=".";;
*) base="/"; dir="/";;
esac
যদি আপনি জানতে পারেন যে আপনি কোনও প্রান্তের ক্ষেত্রে নন (উদাহরণস্বরূপ find
প্রারম্ভিক পয়েন্ট ব্যতীত অন্য ফলাফলের মধ্যে সর্বদা একটি ডিরেক্টরি অংশ থাকে এবং এর কোনও অনুপস্থিতি থাকে /
) তবে পরামিতি প্রসারিত স্ট্রিং ম্যানিপুলেশনটি সোজা for আপনার যদি সমস্ত প্রান্তের মামলাগুলি মোকাবেলা করার প্রয়োজন হয় তবে ইউটিলিটিগুলি ব্যবহার করা সহজ (তবে ধীর)।
কখনও কখনও, আপনি foo/
পছন্দ foo/.
না করে পছন্দ করতে চান foo
। আপনি যদি কোনও ডিরেক্টরি এন্ট্রিতে অভিনয় করে থাকেন তবে foo/
তার সমান হতে হবে foo/.
, নয় foo
; foo
এটি কোনও তাত্পর্যপূর্ণ করে যখন কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক থাকে: foo
অর্থ প্রতীকী লিঙ্ক, foo/
মানে লক্ষ্য ডিরেক্টরি। সেক্ষেত্রে পিছনের স্ল্যাশ সহ কোনও .
পথের বেসনাম সুবিধাজনকভাবে হয় এবং পথটি তার নিজস্ব নাম হতে পারে।
case "$filename" in
*/) base="."; dir="$filename";;
*/*) base="${filename##*/}"; dir="${filename%"$base"}";;
*) base="$filename"; dir=".";;
esac
দ্রুত এবং নির্ভরযোগ্য পদ্ধতিটি হিস্ট্রি মডিফায়ারগুলির সাথে zsh ব্যবহার করা (এই প্রথম স্ট্রিপগুলি অনুসরণের স্ল্যাশগুলি যেমন ইউটিলিটিগুলির মতো):
dir=$filename:h base=$filename:t
Less যদি না আপনি সোলারিস 10 এবং তার বেশি বয়সীদের /bin/sh
( যেমন এখনও উত্পাদিত মেশিনগুলিতে প্যারামিটার এক্সপেনশন স্ট্রিং ম্যানিপুলেশন বৈশিষ্ট্যগুলির অভাবের মতো প্রাক পসিক্স শেল ব্যবহার করেন না - তবে sh
ইনস্টলেশনটিতে একটি পসিক্স শেল বলা হয়, কেবল এটি /usr/xpg4/bin/sh
নয় /bin/sh
)।
² উদাহরণস্বরূপ: foo
একটি ফাইল আপলোড পরিষেবাতে ডাকা একটি ফাইল জমা দিন যা এটির বিরুদ্ধে রক্ষা করে না, তারপরে এটি মুছুন এবং foo
তার পরিবর্তে মোছার কারণ দিন
base=$(basename -- "$filename"; echo .); base=${base%.}; dir=$(dirname -- "$filename"; echo .); dir=${dir%.}
? আমি মনোযোগ সহকারে পড়ছিলাম এবং আপনার কোনও অসুবিধাগুলির উল্লেখ আমি লক্ষ্য করি না।