فصل 7- بررسی‌ها

7.2- عملگرهای بررسی فایل

صحیح را برگشت می‌دهد اگر...

‎-e‎

فایل موجود باشد

‎-a‎

فایل موجود باشد

این در عمل مانند ‎-e‎ است. این عملگر ناپسند ‎(Deprecate)‎ ‏[1]‎‎ تلقی گردیده است، و استفاده از آن تشویق نمی‌شود.

‎-f‎

یک فایل معمولی باشد (نه یک دایرکتوری یا فایل دستگاه)

‎-s‎

اندازه فایل صفر نباشد

‎-d‎

فایل یک دایرکتوری باشد

‎-b‎

فایل یک دستگاه بلوکی باشد

‎-c‎

فایل یک دستگاه کاراکتری باشد

device0="/dev/sda2"    # /   (دایرکتوری ریشه)‎
if [ -b "$device0" ]
then
  echo "$device0 is a block device."
fi

# /dev/sda2 is a block device.



device1="/dev/ttyS1"   # PCMCIA کارت مودم‎
if [ -c "$device1" ]
then
  echo "$device1 is a character device."
fi

# .یک دستگاه کاراکتری است ‎/dev/ttyS1‎ 

‎-p‎

فایل یک لوله باشد

function show_input_type()
{
   [ -p /dev/fd/0 ] && echo PIPE || echo STDIN
}

show_input_type "Input"                           # STDIN
echo "Input" | show_input_type                    # PIPE

# است ‎Carl Anderson‎ این مثال اهدایی

‎-h‎

فایل یک پیوند نمادین باشد

‎-L‎

فایل یک پیوند نمادین باشد

‎-S‎

فایل یک socket باشد

‎-t‎

(توصیف‌گر) فایل با یک دستگاه ترمینال ارتباط داده می‌شود

این گزینه بررسی، می‌تواند برای کنترل این به کار برود که آیا ‎stdin [ -t 0 ]‎ یا ‎stdout [ -t 1 ]‎ در یک اسکریپت مفروض یک ترمینال است.

‎-r‎

فایل دارای مجوز خواندن باشد (برای کاربر اجرا کننده تست)

‎-w‎

فایل دارای مجوز نوشتن باشد (برای کاربر اجرا کننده بررسی)

‎-x‎

فایل دارای مجوز اجرا باشد (برای کاربر اجرا کننده بررسی)

‎-g‎

نشانه ‎set-group-id (sgid)‎ روی فایل یا دایرکتوری برقرار باشد

اگر یک دایرکتوری دارای نشانه sgid تنظیم شده باشد، آنوقت فایل ایجاد شده در آن دایرکتوری به گروهی که مالک آن دایرکتوری است تعلق دارد، نه لزوماً متعلق به گروه کاربری که فایل را ایجاد نموده است. این مورد می‌تواند برای دایرکتوری‌های به اشتراک گذاشته شده توسط یک گروه کاری سودمند باشد.

‎-u‎

نشانه ‎set-user-id (suid)‎ روی فایل تنظیم شده باشد

یک فایل باینری متعلق به root که نشانه ‎set-user-id‎ آن تنظیم شده، حتی موقعی که یک کاربر عادی آنرا فراخوانی می‌کند با مزایای root اجرا می‌گردد. [2] این مطلب برای فایل‌های اجرایی (از قبیل pppd و cdrecord) که نیازمند دسترسی به سخت‌افزار سیستم هستند سودمند است. با فقدان نشانهsuid، این فایلهای باینری نمی‌توانند توسط یک کاربر غیر از root فراخوانی بشوند.

-rwsr-xr-t    1 root       178236 Oct  2  2000 /usr/sbin/pppd

فایلی با نشانه suid تنظیم شده، یک s در مجوزهایش نشان می‌دهد.

‎-k‎

تنظیم sticky bit

نشانه save-text-mode که به طور رایج sticky bit نامیده می‌شود، یک نوع خاصی از مجوز فایل است. اگر یک فایل دارای این نشانه تنظیم شده باشد، برای دسترسی سریعتر آن فایل در حافظه میانجی نگهداری خواهد شده. [3] اگر بر روی یک دایرکتوری تنظیم شود، مجوز نوشتن را محدود می‌کند. برقراری بیت sticky یک t در لیست کردن فایل یا دایرکتوری اضافه می کند. این مجوز، حذف یا اصلاح فایلهای خاص در آن دایرکتوری را در انحصار مالک آن فایلها قرار می‌دهد.


drwxrwxrwt    7 root         1024 May 19 21:26 tmp/

اگر کاربری مالک دایرکتوری که بیت sticky آن تنظیم است نباشد، اما دارای مجوز نوشتن در آن دایرکتوری باشد،فقط فایلهایی را که بر آنها مالکیت دارد می‌تواند حذف نماید. این مطلب کاربران را از حذف و رونویسی سهوی فایلهای دیگران در یک دایرکتوری قابل دسترس عمومی، مانند ‎/tmp‎ باز می‌دارد. (البته مالک دایرکتوری یا root می‌توانند فایلهای آنجا را تغییر نام بدهند یا حذف کنند.)

‎-O‎

شما مالک فایل باشید

‎-G‎

شماره شناسایی گروه فایل مانند شماره گروه شما باشد

‎-N‎

فایل بعد از آخرین باری که خوانده شده ویرایش شده باشد

‎f1 -nt f2‎

فایل f1 جدیدتر از f2 باشد

‎f1 -ot f2‎

فایل f1 قدیمی‌تر از f2 باشد

‎f1 -ef f2‎

فایلهای f1 و f2 پیوندهای سخت به فایل یکسان باشند

!

«نفی« -- معنی بررسی‌های فوق را وارونه می‌کند (اگر شرط برقرار نباشد، صحیح برگشت می‌دهد).

مثال ‎7-4‎. بررسی پیوندهای معیوب

#!/bin/bash
# broken-link.sh
# ‎Lee bigelow <ligelowbee@yahoo.com>‎ نوشته شده توسط‎
#           .استفاده شده است ‎ABS‎ با مجوز در راهنمای ‎

#  یک اسکریپت پوسته ناب برای یافتن پیوندهای نمادین معیوب و بیرون دادن آنها‎
#+ تغذیه شده و با آنها کار بشود ‎xargs به شکل نقل‌قولی شده، چنانکه بتواند به‎
#+             ‎sh broken-link.sh /somedir /someotherdir|xargs rm‎ برای مثال‎
#
#      :اگرچه، این شیوه مناسب‌تری است‎
#
#   find "somedir" -type l -print0|\
#   xargs -r0 file|\
#   grep "broken symbolic"|
#   sed -e 's/^\|: *broken symbolic.*$/"/g'
# 
# + but that wouldn't be pure Bash, now would it.
#   Caution: beware the /proc file system and any circular links!
# ###############################################################


#  اگر هیچ شناسه‌ای به اسکریپت عبور داده نشود، دایرکتوری‌های مورد جستجو‎
#+   به دایرکتوری جاری تنظیم می‌شوند. در غیر اینصورت دایرکتوری‌های مورد‎
#+                           .جستجو به شناسه‌های داده شده تنظیم می‌شوند‎
######################

[ $# -eq 0 ] && directorys=`pwd` || directorys=$@


#  برای کنترل دایرکتوری داده شده جهت فایل‌هایی ‎linkchk‎ تنظیم تابع
#+.که پیوند هستند و موجود نیستند، آنوقت چاپ نام نقل‌قولی شده آنها‎
#  اگر یکی از عناصر داخل دایرکتوری یک دایرکتوری فرعی باشد، آنوقت‎
#+                     ‎linkcheck‎ ارسال آن دایرکتوری فرعی به تابع‎
######################

linkchk () {
    for element in $1/*; do
      [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
      [ -d "$element" ] && linkchk $element
# .برای دایرکتوری‌ها ‎'-d'‎ برای پیوندهای نمادین بررسی می‌کند و ‎'-h'‎ البته
    done
}

#اگر ،‎linkchk()‎ ارسال هر شناسه‌ای که به اسکریپت داده شده برای تابع‎
#+  که یک دایرکتوری معتبر باشد. در صورتیکه معتبر نباشد، آنوقت چاپ‎‎
#+                             .یک پیغام خطا و اطلاعات نحوه کاربرد
#######################

for directory in $directorys; do
    if [ -d $directory ]
	then linkchk $directory
	else 
	    echo "$directory is not a directory"
	    echo "Usage: $0 dir1 dir2 ..."
    fi
done

exit $?

مثال ‎31-1‎‏، مثال ‎11-8‎‏، مثال ‎11-3‎‏، مثال ‎31-3‎‏، و مثال ‎A-1‎ نیز موارد استفاده عملگرهای بررسی فایل را روشن می‌سازند.

یادداشت‌ها

[1]

به قرار ویرایش 1913 واژه‌نامه Webster:

Deprecate
...

To pray against, as an evil;
to seek to avert by prayer;
to desire the removal of;
to seek deliverance from;
to express deep regret for;
to disapprove of strongly.

[2]

آگاه باشید که باینری‌های suid ممکن است حفره‌های امنیتی ایجاد کنند. نشانه suid تاثیری در اسکریپت‌های پوسته ندارند.

[3]

در سیستم‌های لینوکس، بیت sticky دیگر برای فایلها استفاده نمی‌شود، فقط برای دایرکتوری‌ها به کار می‌رود.