فصل 16- فرمان‌ها، برنامه‌ها و فیلترهای خارجی

‎16.1‎- فرمان‌های پایه

نخستین فرمان‌هایی که یک تازه وارد می‌آموزد

ls

فرمان اصلی لیست «list» فایل. قدرت این فرمان متواضع و فروتن را دست کم نگیرید. برای مثال، با کاربرد ‎-R‎، گزینه بازگشتی، ls یک لیست درخت‌گونه ساختار دایرکتوری را ارایه می‌کند. دیگر گزینه‌های سودمند عباتند از ‎-S‎، لیست مرتب شده بر اساس اندازه فایل، ‎-t‎، مرتب شده بر حسب زمان ویرایش، ‎-v‎، مرتب بواسطه(عددی) شماره نگارش‌های جاسازی شده در نام‌فایل‌ها‎[1]‎‏، ‎-b‎، نشان دادن کاراکترهای فاصله، و ‎-i‎، نشان دادن inode فایل‌ها ( مثال ‎16-4‎ را ببینید).

bash$ ls -l

-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter10.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter11.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter12.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter1.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter2.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter3.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:49 Chapter_headings.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:49 Preface.txt


bash$ ls -lv

 total 0
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:49 Chapter_headings.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:49 Preface.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter1.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter2.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter3.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter10.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter11.txt
-rw-rw-r-- 1 bozo bozo 0 Sep 14 18:44 chapter12.txt
 

tip

قرمان ls موقع تلاش برای لیست نمودن فایلی که موجود نیست، یک وضعیت خروج غیر صفر برگشت می‌دهد.

bash$ ls abc
ls: abc: No such file or directory

bash$ echo $?
2

مثال ‎16-1‎. کاربرد ls برای ایجاد فهرست فایلها جهت تهیه یک دیسک CDR

#!/bin/bash
# ex40.sh (burn-cd.sh)
# .‎CDR‎ اسکریپت برای خودکارسازی نوشتن روی یک دیسک


SPEED=10         # .اگر سخت‌افزار پشتیبانی نماید، سرعت بالاتر نیز میسر است
IMAGEFILE=cdimage.iso
CONTENTSFILE=contents
# DEVICE=/dev/cdrom                       ‎cdrecord‎ برای نگارش‌های قدیمی‌تر
DEVICE="1,0,0"
DEFAULTDIR=/opt  # .این دایرکتوری محتوی داده‌هایی است که باید نوشته بشوند
                 #                       .از وجود آن اطمینان حاصل نمایید
                 #             .یک تست برای انجام این کار بنویسید ‎:‎تمرین

#                   از بسته cdrecord نوشته ‎Joerg Schilling‎ استفاده می‌کند
#  http://www.fokus.fhg.de/usr/schilling/cdrecord.html

#                  ،اگر این اسکریپت به عنوان یک کاربر عادی فراخوانی بشود
#+  ممکن است لازم باشد بیت suid برنامه cdrecord با استفاده از قدرت root و
#+                   اجرای فرمان ‎chmod u+s /usr/bin/cdrecord‎ تنظیم بشود‎.
#        .البته، این کار یک حفره امنیتی، اگر چه نسبتاً ناچیز، ایجاد می‌کند

if [ -z "$1" ]
then
  IMAGE_DIRECTORY=$DEFAULTDIR
  # .دایرکتوری پیش‌فرض، در صورتیکه در خط فرمان دایرکتوری تعیین نشده باشد
else
    IMAGE_DIRECTORY=$1
fi

#                                          .ایجاد یک فایل «فهرست مطالب»‏
ls -lRF $IMAGE_DIRECTORY > $IMAGE_DIRECTORY/$CONTENTSFILE
#                              گزینه ‎"l"‎ یک لیست مشروح فایل ارایه می‌کند.
#                                گزینه ‎"R"‎ تهیه لیست را بازگشتی می‌نماید.
# گزینه ‎"F"‎ انواع فایل را علامت می‌زند (دایرکتوری‌ها یک / انتهایی می‌گیرند).
echo "Creating table of contents."

#               ایجاد یک فایل image آماده‌سازی برای burn کردن بر روی CDR.
mkisofs -r -o $IMAGEFILE $IMAGE_DIRECTORY
echo "Creating ISO9660 file system image ($IMAGEFILE)."

#        نوشتن روی CDR.
echo "Burning the disk."
echo "Please be patient, this will take a while."
wodim -v -isosize dev=$DEVICE $IMAGEFILE
# در توزیع‌های جدیدتر لینوکس، برنامه ‎"wodim"‎ عاملیت cdrecord را به عهده می‌گیرد.
exitcode=$?
echo "Exit code = $exitcode"

exit $exitcode
cat‏، tac

cat، یک سرنام برای concatenate(الحاق کردن)، یک فایل را در stdout فهرست می‌کند. موقعی که با تغییر مسیر (‎>‎ یا ‎>>‎) ترکیب شود، عموماً برای الحاق کردن فایل‌ها به کار می‌رود.

#  استفاده از فرمان ‎cat‎ 
cat filename                          #         .محتوای فایل را لیست می‌کند

cat file.1 file.2 file.3 > file.123   # .سه فایل را در یک فایل ادغام می‌کند

گزینه ‎-n‎ با فرمان cat اعداد ترتیبی را قبل از تمام سطرهای فایل(های) مقصد درج می‌کند. گزینه ‎-b‎ فقط سطرهای غیرخالی را شماره‌گذاری می‌کند. گزینه ‎-v‎ کاراکترهای غیرقابل چاپ را با به کار بردن نشانه‌ ^ بازتاب می‌دهد. گزینه ‎-s‎ چند سطر خالی متوالی را در یک سطر خالی فشرده می‌سازد.

همچنین مثال ‎16-28‎ و مثال ‎16-24‎ را ببینید.

در یک لوله، ممکن است تغییر مسیر دادن stdin به یک فایل، کارآمدتر از cat کردن فایل باشد.

cat filename | tr a-z A-Z

tr a-z A-Z < filename   # همان نتیجه، اما یک پردازش کمتر راه‌اندازی
                        #+        .می‌کند، و از لوله هم معاف می‌گردد

tac وارونه cat است، لیست کردن وارونه محتویات یک فایل از انتهای آن.

rev

هر سطر فایل را وارونه می‌کند و در خروجی استاندارد بیرون می‌دهد. این دارای همان اثر فرمان tac نیست، چون ترتیب سطرها را حفظ می‌کند، اما هر کدام را یک دور می‌چرخاند (تصویر آینه).

bash$ cat file1.txt
This is line 1.
This is line 2.

bash$ tac file1.txt
This is line 2.
This is line 1.

bash$ rev file1.txt
.1 enil si sihT
.2 enil si sihT

cp

این فرمانِ رونوشت‌برداری از فایل است. cp file1 file2 از file1 در file2 رونوشت تهیه می‌کند، با رونویسی کردن file2 در صورتیکه از قبل موجود باشد ( مثال ‎16-6‎ را ببینید).

tip

مخصوصاً نشانگر ‎-a‎ بایگانی (برای رونوشت‌برداری یک درخت دایرکتوری کامل)، نشانگر ‎-u‎ به روزرسانی (که از رونویسی فایل‌های جدیدتر با نام یکسان پیش‌گیری می‌کند)، و نشانگرهای ‎-r‎ و ‎-R‎ بازگشتی، سودمند هستند.

cp -u source_dir/* dest_dir
#      «هماهنگ‌سازی» دایرکتوری ‎dest_dir‎ با ‎source_dir‎ از طریق
#+ .کپی کردن مجموع فایل‌های جدیدتر و نه فایل‌های از قبل موجود


mv

فرمان انتقال دادن (move) فایل است. معادل یک آمیزش از فرمان cp و rm است. می‌تواند برای انتقال چندین فایل به یک دایرکتوری، یا حتی برای تغییر نام یک فایل یا دایرکتوری به کار برود. برای برخی نمونه‌های استفاده از mv در یک اسکریپت، مثال ‎10-11‎ و مثال ‎A-2‎ را ملاحظه نمایید.

هنگام به کار رفتن در یک اسکریپت غیر محاوره‌ای، mv گزینه ‎-f‎ ‎(force)‎ را برای عدم نیاز به تایید کاربر، قبول می‌کند.

موقعی که یک دایرکتوری به دایرکتوری از قبل موجود دیگری انتقال داده می‌شود، یک دایرکتوری فرعی از دایرکتوری مقصد خواهد شد.

bash$ mv source_directory target_directory

bash$ ls -lF target_directory
total 1
drwxrwxr-x    2 bozo  bozo      1024 May 28 19:20 source_directory/


rm

حذف فایل یا فایل‌ها. گزینه ‎-f‎ حذف حتی فایل‌های فقط خواندنی را تحمیل می‌کند، و برای عدم نیاز به تایید کاربر، در یک اسکریپت مفید است.

فرمان rm خودش به تنهایی در حذف فایل‌هایی که نام آنها با یک خط‌تیره شروع می‌گردد، ناموفق خواهد شد. چرا؟ زیرا rm یک نام فایل پیشوند شده با خط‌تیره را به صورت یک گزینه نگاه می‌کند.

bash$ rm -badname
rm: invalid option -- b
Try `rm --help' for more information.
 

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

bash$ rm -- -badname

یک شیوه دیگر برای این کار، مقدم کردن یک ‎dot-slash بر نام فایلی است که باید حذف بشود.

bash$ rm ./-badname


هنگام به کار رفتن با گزینه بازگشتی ‎-r‎، این فرمان از محل دایرکتوری جاری تمام فایل‌های بعدی تحت درخت دایرکتوری را حذف می‌کند. یک فرمان ‎rm ‎-rf‎ *‎ نسنجیده، می‌تواند قسمت بزرگی از ساختار دایرکتوری را نابود سازد.

rmdir

حذف دایرکتوری. برای موفق شدن این فرمان، دایرکتوری باید خالی از هرگونه فایل -- از جمله «فایل‌های نقطه‌ای» غیر قابل مشاهده‏‎[2]‎ -- باشد.

mkdir

ساختن دایرکتوری، یک دایرکتوری جدید ایجاد می‌کند. برای مثال، ‎mkdir -p project/programs/December‎ دایرکتوری نامبرده را ایجاد می‌کند. با کاربرد گزینه ‎-p‎ به طور خودکار همه دایرکتوری‌های پدر ایجاد می‌شوند.

chmod

خصوصیات یک فایل یا دایرکتوری موجود را تغییر می‌دهد ( مثال ‎15-14‎ را مشاهده کنید).

chmod +x filename
#        .را برای تمام کاربران قابل اجرا می‌سازد ‎"filename"‎

chmod u+s filename
#            بیت ‎suid‎ را در مجوزهای ‎"filename"‎ تنظیم می‌کند.
#  یک کاربر عادی می‌تواند ‎"filename"‎ را با همان مزیت‌های مالک
#   فایل اجرا نماید. (در مورد اسکریپت‌های پوسته صدق نمی‌کند.)

chmod 644 filename
#‎"filename"‎ قابل خواندن-قابل نوشتن برای مالک، و قابل خواندن
#+                        برای دیگران (مجوزها برحسب اکتال)‏.

chmod 444 filename
#               ‎"filename"‎ برای همه فقط خواندنی می‌شود.
#     ویرایش فایل (به عنوان مثال با ویرایشگر متن) برای
#+  کاربری که مالک فایل نباشد (غیر از کاربر ارشد) میسر
#+  نیست، و حتی مالک فایل هم در صورتیکه فایل را ویرایش
#+   کند، باید یک ذخیره اجباری فایل‎[توضیح]‎ انجام بدهد.
#          همان محدودیت‌ها برای حذف فایل نیز صدق می‌کند.

chmod 1777 directory-name
#    مجوز خواندن، نوشتن، و اجرا روی دایرکتوری را به همه می‌دهد، و ‎sticky bit‎
#+   را نیز تنظیم می‌کند. این به معنای آن است که فقط مالک آن دایرکتوری، مالک
#+              فایل و البته ‎root‎ می‌توانند فایل‌های آن دایرکتوری را حذف کند.

chmod 111 directory-name
# فقط مجوز اجرا روی دایرکتوری را به همه واگذار می‌کند. این به معنای آن است که
# می‌توانید فایلهای آن دایرکتوری را بخوانید و اجرا کنید (مجوز اجرا لزوماً شامل
#+مجوز خواندن نیز می‌شود چون شما بدون آنکه قادر به خواندن یک فایل باشید، قادر
#+  به اجرای آن نیستید). اما نمی‌توانید فایل‌ها را فهرست کنید یا با find جستجو
#+                            کنید.این محدودیت‌ها برای کاربر ارشد صدق نمی‌کند.

chmod 000 directory-name
#لغو هرگونه مجوز برای آن دایرکتوری. نمی‌توانید فایل‌های آن را بخوانید، بنویسید
# یا اجرا کنید. حتی نمی‌توانید فایل‌های آن را لیست کنید یا به آن ‎cd‎ کنید. اما،
#می‌توانید دایرکتوری را تغییر نام ‎(mv)‎ بدهید یا در صورتیکه خالی باشد آنرا حذف
#+  ‎(rmdir)‎ کنید. حتی می‌توانید به فایل‌ها در آن دایرکتوری پیوند نمادین بزنید، 
#            اما نمی‌توانید پیوند‌های نمادین را بخوانید، بنویسید یا اجرا کنید.
#                                   این محدودیت‌ها برای کاربر ارشد صادق نیست.

مترجم: به نظر می‌رسد در اینجا متاسفانه تداخل مفاهیم و اندک لغزشی در بیان، باعث گفتاری نادقیق گردیده است. مجوز اجرا شامل مجوز خواندن نمی‌شود. بلکه در مورد فایل‌ها مجوز خواندن پیش‌نیاز آن است. اما در مورد دایرکتوری چنین نیست و مجوز اجرا به معنای اجازه ورود یا cd به آن دایرکتوری است. چون دایرکتوری فایلی است که محتوای آن فهرست فایلها و دایرکتوری‌های دیگر است، هنگامی که دایرکتوری فاقد مجوز خواندن باشد، مجوزی برای مشاهده این فهرست نداریم. اما این مجوز ارتباطی به فایل‌های داخل دایرکتوری ندارد. اگر از وجود فایلی در آن دایرکتوری مطلع باشید ، و آن فایل دارای مجوز خواندن و اجرا باشد، می‌توانید آن را بخوانید یا اجرا کنید. برای آزمایش می‌توانید یک دایرکتوری ایجاد نموده و یک فایل دارای مجوز خواندن و اجرا در آن قرار بدهید. سپس مجوز دایرکتوری را به 111 تنظیم نمایید. مشاهده خواهید نمود که می‌توانید به آن cd کنید. اما ls مجاز نیست. با این وجود می‌توانید فایل را vi یا اجرا کنید. mv یا حذف یک دایرکتوری نیز در اصل نوشتن در دایرکتوری والد آن است و ارتباطی به مجوزهای خودش ندارد بلکه دایرکتوری پدر باید دارای مجوز نوشتن باشد.

chattr

تغییر خصوصیات فایل ‎(Change file attributes)‎. این فرمان قابل قیاس با فرمان chmod فوق است، اما با گزینه‌های متفاوت و یک اختلاف در ترکیب دستوری فراخوانی آن، و همچنین تنها در سیستم فایل‌های ‎ext2/ext3‎ (مترجم: و ext4)کار می‌کند.

یک گزینه مخصوصاً جالب توجه chattr، گزینه i است. یک فرمان chattr +i filename فایل را به عنوان تغییرناپذیر علامت می‌زند. فایل نمی‌تواند ویرایش گردد، به آن پیوند ایجاد شود، یا حدف گردد، نه حتی توسط root. این خصوصیت فایل تنها به وسیله root می‌تواند ایجاد یا حذف گردد. به یک روش مشابه، گزینه a فایل را به عنوان فقط پیوست کردنی علامت می‌زند.

root# chattr +i file1.txt

root# rm file1.txt
rm: remove write-protected regular file `file1.txt'? y
rm: cannot remove `file1.txt': Operation not permitted

اگر فایلی دارای صفت تنظیم شده s ‎(secure)‎ باشد، آنوقت هنگامی که حذف می‌شود، بلوک آن با صفرهای باینری رونویسی می‌گردد. ‎[3]‎

اگر فایلی دارای صفت تنظیم شده u ‎(undelete)‎ باشد، آنوقت موقعی که حذف بشود، بازهم محتویات آن می‌تواند بازیابی گردد.

اگر فایل دارای صفت تنظیم شده c ‎(compress)‎ باشد، آنوقت موقع نوشتن روی دیسک به طور خودکار فشرده و برای خواندن غیرفشرده می‌شود.

خصوصیات تنظیم شده فایل به وسیله فرمان chattr در یک فهرست فایل ‎(ls -l)‎ نمایانده نمی‌شود.


ln

پیوند به فایل‌های از قبل موجود ایجاد می‌کند. یک «پیوند»‏(link) ارجاعی به یک فایل است، نام جایگزینی برای آن است. فرمان ln رجوع کردن به فایل پیوند شده را با بیش از یک نام روا می‌دارد و جایگزینی برای مستعار سازی است ( مثال ‎4-6‎ را ببینید ).

ln تنها یک ارجاع، یک اشاره‌گر به فایل فقط به اندازه چند بایت ایجاد می‌کند.

فرمان ln بیشتر اوقات با نشانگر ‎-s‎، نشانگر پیوند نمادین یا «نرم»‏ به کار می‌رود. مزایای استفاده از نشانگر ‎-s‎ آن است که پیوند زدن میان سیستم فایل‌ها یا به دایرکتوری‌ها را مجاز می‌سازد.

ترکیب دستوری فرمان کمی ترفندگونه است. برای مثال: ‎ln -s oldfile newfile‎ فایل از قبل موجود oldfile را به پیوند به تازگی ایجاد شده newfile پیوند می‌زند.

Caution

اگر فایل نامبرده newfile از قبل وجود داشته باشد، یک پیغام خطا نتیجه خواهد شد.


پیوندها توانایی فراخوانی اسکریپت (یا هر نوع دیگر قابل اجرا) بواسطه چندین نام را ارایه می‌کنند و آن اسکرپت بر اساس آن که چگونه فراخوانی شده است رفتار می‌کند.

مثال ‎16-2‎.‏ Hello یا Good-bye

#!/bin/bash
# hello.sh:  ‎"goodbye"‎ یا ‎"hello"‎ گفتن
#+ .نسبت به چگونه فراخوانی شدن اسکریپت

#با دستور ‎ln -s hello.sh goodbye‎ در دایرکتوری کاری
#   جاری ‎($PWD)‎ یک پیوند به این اسکریپت ایجاد کنید.
#      اکنون اسکریپت را به هر دو روش فراخوانی کنید:
# ./hello.sh
# ./goodbye

HELLO_CALL=65
GOODBYE_CALL=66

if [ $0 = "./goodbye" ]
then
  echo "Good-bye!"
  #  برخی فرمان‌های دیگر نوع goodbye به طوری که مناسب است.
  exit $GOODBYE_CALL
fi

echo "Hello!"
  #   برخی فرمان‌های دیگر نوع hello به طوری که شایسته است.
exit $HELLO_CALL

man‏، info

این فرمان‌ها مستندات و صفحات اطلاعات در باره فرمان‌های سیستم و برنامه‌های سودمند نصب شده را دستیابی می‌کنند. صفحات info هنگامی که در دسترس باشند، معمولاً شامل توضیحات تفصیلی بیشتری نسبت به صفحه‌های man هستند.

کوشش‌های فراوانی برای «خودکار سازی» نوشتن صفحه‌های man به عمل آمده است. برای اسکریپتی که یک مرحله نخست ابتدایی در این جهت را به وجود می‌آورد، مثال ‎A-39‎ را مشاهده نمایید.

یادداشت‌ها

[1]

گزینه ‎-v‎ مرتب‌سازی نسبت به نوع حروف کوچک یا بزرگ پیشوند شده نام فایل‌ها را نیز انجام می‌دهد.

[2]

فایل‌های نقطه‌ای فایل‌هایی هستند که نامشان با یک نقطه آغاز می‌شود، از قبیل ‎~/.Xdefaults‎. چنین فایل‌هایی در یک فهرست کردن عادی ls ظاهر نمی‌شوند (اگر چه یک ls -a آنها را نمایش خواهد داد)، و نمی‌توانند با یک فرمان تصادفی ‎rm -rf *‎ حذف بشوند. فایل‌های نقطه‌ای عموماً به عنوان فایل‌های پیکربندی و تنظیمات در دایرکتوری خانگی کاربر به کار می‌روند.

[3]

این ویژگی بخصوص ممکن است هنوز در نگارش‌ ext2/ext3 سیستم فایل نصب شده روی سیستم شما پیاده‌سازی نشده باشد. مستندات توزیع لینوکس‌تان را بررسی کنید.


[توضیح] مترجم:  مقصود از ذخیره اجباری فایل، باطل کردن موقتی صفت فقط خواندنی است. به عنوان مثال در ویرایشگر vi اگر فایل فقط خواندنی نباشد، ثبت تغییرات به عمل آمده در فایل، با استفاده از دستور ‎:w‎   انجام می‌شود، اما در صورتیکه فایل دارای صفت فقط خواندنی باشد، با صدور این دستور ثبت تغییرات صورت نمی‌گیرد و vi اعلام می‌کند که اگر می‌خواهید ویژگی فقط خواندنی را ابطال کنید، فرمان را به صورت ‎:w!‎ به کار ببرید (ذخیره اجباری فایل)‏.