نخستین فرمانهایی که یک تازه وارد میآموزد
فرمان اصلی لیست «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
قرمان ls موقع تلاش برای لیست نمودن فایلی که موجود نیست، یک وضعیت خروج غیر صفر برگشت میدهد. bash$ ls abc ls: abc: No such file or directory bash$ echo $? 2 |
مثال 16-1. کاربرد ls برای ایجاد فهرست فایلها جهت تهیه یک دیسک CDR
#!/bin/bash # # SPEED=10 # IMAGEFILE=cdimage.iso CONTENTSFILE=contents # DEVICE="1,0,0" DEFAULTDIR=/opt # # # #از بسته cdrecord نوشته Joerg Schilling استفاده میکند # # #+ممکن است لازم باشد بیت 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، یک سرنام برای 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 است، لیست کردن وارونه محتویات یک فایل از انتهای آن.
هر سطر فایل را وارونه میکند و در خروجی استاندارد بیرون میدهد. این دارای همان اثر فرمان 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 file1 file2 از file1 در file2 رونوشت تهیه میکند، با رونویسی کردن file2 در صورتیکه از قبل موجود باشد ( مثال 16-6 را ببینید).
مخصوصاً نشانگر -a بایگانی (برای رونوشتبرداری یک درخت دایرکتوری کامل)، نشانگر -u به روزرسانی (که از رونویسی فایلهای جدیدتر با نام یکسان پیشگیری میکند)، و نشانگرهای -r و -R بازگشتی، سودمند هستند. cp -u source_dir/* dest_dir # |
فرمان انتقال دادن (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/ |
حذف فایل یا فایلها. گزینه -f حذف حتی فایلهای فقط خواندنی را تحمیل میکند، و برای عدم نیاز به تایید کاربر، در یک اسکریپت مفید است.
حذف دایرکتوری. برای موفق شدن این فرمان، دایرکتوری باید خالی از هرگونه فایل -- از جمله «فایلهای نقطهای» غیر قابل مشاهده[2] -- باشد.
ساختن دایرکتوری، یک دایرکتوری جدید ایجاد میکند. برای مثال، mkdir -p project/programs/December دایرکتوری نامبرده را ایجاد میکند. با کاربرد گزینه -p به طور خودکار همه دایرکتوریهای پدر ایجاد میشوند.
خصوصیات یک فایل یا دایرکتوری موجود را تغییر میدهد ( مثال 15-14 را مشاهده کنید).
chmod +x 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) کنید. حتی میتوانید به فایلها در آن دایرکتوری پیوند نمادین بزنید، #اما نمیتوانید پیوندهای نمادین را بخوانید، بنویسید یا اجرا کنید. #این محدودیتها برای کاربر ارشد صادق نیست.
تغییر خصوصیات فایل (Change file attributes). این فرمان قابل قیاس با فرمان chmod فوق است، اما با گزینههای متفاوت و یک اختلاف در ترکیب دستوری فراخوانی آن، و همچنین تنها در سیستم فایلهای ext2/ext3
یک گزینه مخصوصاً جالب توجه 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) نمایانده نمیشود. |
پیوند به فایلهای از قبل موجود ایجاد میکند. یک «پیوند»(link) ارجاعی به یک فایل است، نام جایگزینی برای آن است. فرمان ln رجوع کردن به فایل پیوند شده را با بیش از یک نام روا میدارد و جایگزینی برای مستعار سازی است ( مثال 4-6 را ببینید ).
ln تنها یک ارجاع، یک اشارهگر به فایل فقط به اندازه چند بایت ایجاد میکند.
فرمان ln بیشتر اوقات با نشانگر -s، نشانگر پیوند نمادین یا «نرم» به کار میرود. مزایای استفاده از نشانگر -s آن است که پیوند زدن میان سیستم فایلها یا به دایرکتوریها را مجاز میسازد.
ترکیب دستوری فرمان کمی ترفندگونه است. برای مثال: ln -s oldfile newfile فایل از قبل موجود oldfile را به پیوند به تازگی ایجاد شده newfile پیوند میزند.
اگر فایل نامبرده newfile از قبل وجود داشته باشد، یک پیغام خطا نتیجه خواهد شد. |
پیوندها توانایی فراخوانی اسکریپت (یا هر نوع دیگر قابل اجرا) بواسطه چندین نام را ارایه میکنند و آن اسکرپت بر اساس آن که چگونه فراخوانی شده است رفتار میکند.
مثال 16-2. Hello یا Good-bye
#!/bin/bash # #+ #با دستور ln -s hello.sh goodbye در دایرکتوری کاری #جاری ($PWD) یک پیوند به این اسکریپت ایجاد کنید. #اکنون اسکریپت را به هر دو روش فراخوانی کنید: # # HELLO_CALL=65 GOODBYE_CALL=66 if [ $0 = "./goodbye" ] then echo "Good-bye!" #برخی فرمانهای دیگر نوع goodbye به طوری که مناسب است. exit $GOODBYE_CALL fi echo "Hello!" #برخی فرمانهای دیگر نوع hello به طوری که شایسته است. exit $HELLO_CALL
این فرمانها مستندات و صفحات اطلاعات در باره فرمانهای سیستم و برنامههای سودمند نصب شده را دستیابی میکنند. صفحات info هنگامی که در دسترس باشند، معمولاً شامل توضیحات تفصیلی بیشتری نسبت به صفحههای man هستند.
کوششهای فراوانی برای «خودکار سازی» نوشتن صفحههای man به عمل آمده است. برای اسکریپتی که یک مرحله نخست ابتدایی در این جهت را به وجود میآورد، مثال A-39 را مشاهده نمایید.
[1] | گزینه -v مرتبسازی نسبت به نوع حروف کوچک یا بزرگ پیشوند شده نام فایلها را نیز انجام میدهد. |
[2] |
فایلهای نقطهای فایلهایی هستند که نامشان با یک نقطه آغاز میشود، از قبیل ~/.Xdefaults. چنین فایلهایی در یک فهرست کردن عادی ls ظاهر نمیشوند (اگر چه یک ls -a آنها را نمایش خواهد داد)، و نمیتوانند با یک فرمان تصادفی rm -rf * حذف بشوند. فایلهای نقطهای عموماً به عنوان فایلهای پیکربندی و تنظیمات در دایرکتوری خانگی کاربر به کار میروند. |
[3] | این ویژگی بخصوص ممکن است هنوز در نگارش ext2/ext3 سیستم فایل نصب شده روی سیستم شما پیادهسازی نشده باشد. مستندات توزیع لینوکستان را بررسی کنید. |