තුළ
[ -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
පරිස්සම් වන්න ).