ভিতরে
[ -f "$file" ]
[
কমান্ড একটি করে stat()
(না lstat()
পথে সঞ্চিত দিকে) সিস্টেম কল $file
এবং আয় সত্য যে সিস্টেম কল সফল এবং ফাইল টাইপ হিসাবে দ্বারা ফিরে stat()
"হয় নিয়মিত ।"
সুতরাং যদি [ -f "$file" ]
সত্যটি ফিরে আসে, আপনি ফাইলটি উপস্থিত থাকতে পারেন এবং একটি নিয়মিত ফাইল বা একটি সিএমলিংক হ'ল অবশেষে একটি নিয়মিত ফাইলের সমাধান করা (বা কমপক্ষে এটি সেই সময়ে ছিল stat()
)।
তবে যদি তা ফেরৎ মিথ্যা (বা যদি [ ! -f "$file" ]
বা ! [ -f "$file" ]
সত্য ফিরে), বিভিন্ন সম্ভাবনার আছে:
- ফাইলটি নেই
- ফাইলটি বিদ্যমান তবে একটি নিয়মিত ফাইল নয় (কোনও ডিভাইস, ফিফো, ডিরেক্টরি, সকেট হতে পারে ...)
- ফাইলটি বিদ্যমান তবে আপনার প্যারেন্ট ডিরেক্টরিতে অনুসন্ধানের অনুমতি নেই
- ফাইলটি বিদ্যমান তবে এটি অ্যাক্সেস করার পথটি দীর্ঘ
- ফাইলটি একটি নিয়মিত ফাইলের একটি সিমিলিংক, তবে সিমলিংকের রেজোলিউশনের সাথে জড়িত কয়েকটি ডিরেক্টরিতে আপনার অনুসন্ধানের অনুমতি নেই।
- ... অন্য কোন কারণে
stat()
সিস্টেম কল ব্যর্থ হতে পারে।
সংক্ষেপে, এটি হওয়া উচিত:
if [ -f "$file" ]; then
printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi
ফাইলটির অস্তিত্ব নেই কিনা তা জানতে, আমাদের stat()
একটি ত্রুটি কোড দিয়ে কোড কলটি ফিরে আসতে হবে ENOENT
(ENOTDIR
আমাদেরকে বলে যে একটি পথের উপাদান একটি ডিরেক্টরি নয় অন্য কোনও ক্ষেত্রে যেখানে আমরা ফাইলটি বলতে পারি না যে পথ দ্বারা অস্তিত্ব)। দুর্ভাগ্যক্রমে [
কমান্ড আমাদের এটি জানতে দেয় না। এটি ত্রুটি কোড ENOENT, EACCESS (অনুমতি অস্বীকৃত), ENAMETOOLONG বা অন্য যে কোনও কিছু হোক না কেন এটি মিথ্যা প্রত্যাবর্তন করবে।
[ -e "$file" ]
পরীক্ষা সাথেও কাজ করা যেতে পারে ls -Ld -- "$file" > /dev/null
। সেক্ষেত্রে, ls
আপনাকে বলতে হবে কেন stat()
, ব্যর্থ যদিও তথ্য সহজে প্রোগ্রামেটিক্যালি ব্যবহার করা যাবে না:
$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed
কমপক্ষে ls
আমাকে বলুন যে ফাইলটি বিদ্যমান না হওয়ায় এটি ব্যর্থ হয়। কারণ ফাইলটি বিদ্যমান আছে কি নেই তা এটি বলতে পারে না। দ্য[
কমান্ড শুধু সমস্যা উপেক্ষা করেছেন।
সঙ্গে zsh
শেল আপনার সাথে ত্রুটি কোড খোঁজ করতে পারেন $ERRNO
ব্যর্থ হয়ে বিশেষ পরিবর্তনশীল [
কমান্ড, এবং ডিকোড যে ব্যবহার সংখ্যা $errnos
বিশেষ অ্যারের zsh/system
মডিউল:
zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
err=$ERRNO
case $errnos[err] in
("") echo exists, not a regular file;;
(ENOENT|ENOTDIR)
if [ -L "$file" ]; then
echo broken link
else
echo does not exist
fi;;
(*) syserror -p "can't tell: " "$err"
esac
fi
(সতর্কতা অবলম্বন করুন যখন সাম্প্রতিক সংস্করণগুলির সাথে নির্মিত তখন $errnos
কয়েকটি সংস্করণ দিয়ে সমর্থনটি ভেঙে দেওয়া zsh
হয়েছিলgcc
)।