තුළ
[ -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සමහර අනුවාද සමඟ සහාය බිඳී ඇති බවටzshgcc පරිස්සම් වන්න ).