.:: Your Adversing Here ::.

لینوکس برای همه

>>> برای مشاهده کامل متن به ادامه مطلب بروید <<<

Linux لینوکس برای همه  

پایپ ها و انتقال

پیش از آن که در این شماره به طور جدی وارد مبحث برنامه نویسی در پوسته( shell )  شویم، بهتر است ابتدا با شیوه های انتقال ورودی و خروجی آشنا شویم.

انتقال خروجی
ممکن است تا کنون به چنین دستوری برخورده باشید:

 ls -l > lsoutput.txt$

این دستور، خروجی دستور ls را داخل فایلی به نام lsoutput.txt   می ریزد. با عملگر> تقریبا همه خروجی ها را می توان منتقل کرد. و اگر فایل مقصد از قبل وجود داشته باشد، در این صورت فایل جدید جایگزین آن خواهد شد. برای این که خروجی را به انتهای فایل اضافه کنیم، اما فایل قبلی پاک نشود، از عملگر> استفاده کنید:

$ls << lsoutput.txt

این دستور، نتیجه را به انتهای فایل قبلی اضافه خواهد کرد.

انتقال ورودی
درست مانند انتقال خروجی دستورات، می توان ورودی ها را هم منتقل کرد و از ورودی استاندارد استفاده نکرد. برای نمونه:

 more > lsoutput.txt$

 البته این مثال، بسیار جزیی و اندک بود و انتقال جریان ورودی و خروجی نسبت به ویندوز، ابعاد بسیار گسترده تری دارد.


پایپ ها
می توانید پروسس ها را با عملگر پایپ (1) به همدیگر وصل کنید. برخلاف سیستم عامل داس، در لینوکس می توان به کمک پایپ ها، پروسس ها را همزمان با هم اجرا کرد و به طور خودکار با انتقال جریان داده در میان آن ها، زمان بندی کرد. یک مثال ساده: می توانید به سادگی خروجی حاصل از دستور ps را به دستور sort  بدهید.  اگر از پایپ ها استفاده نکنید، دستور چند گام به درازا خواهد کشید:

 ps < psout.txt$
<$sort psout.txt pssort.out 

حالا راه بهتر و تر و تمیزتر این است که این دو پروسس را با یک پایپ به هم وصل کنیم:

 ps1 sort < pssort.out$

لابد می خواهید خروجی کار هم، صفحه بندی شده باشد، پس حتما از دستور سومی استفاده خواهید کرد به نام more و آن را با پایپ به دو دستور قبلی وصل می کنید: 

 $ps1 sort 1 more

در عمل هیچ محدودیتی برای تعداد پروسس هایی که به هم وصل می شوند، وجود ندارد. فرض بگیریم که می خواهید نام تمام پروسس هایی که در حال اجرا هستند  به جز پوسته  را ببینید. این خط دستور را نگاه کنید:

$ps-xo comm1 sort 1 uniq
 grep -v sh1 more

این دستور چه کار می کند؟

خروجیps  را می گیرد، به ترتیب الفبا مرتب می کند، پروسس ها را با استفاده ازuniq  استخراج می کند، با استفاده از grep -v sh  پروسسی که اسمش sh  است را حذف می کند و دست آخر به صورت صفحه بندی شده به خروجی (نمایشگر) می فرستد. این روش، همان طور که شما هم می بینید، عجب روش تر و تمیزی است برای پیوندانیدن چند دستور به همدیگر! تازه بدون این که به دردسر بیافتیم و فایل های موقت ایجاد بکنیم! هرچند، حسابی مراقب یک چیز باشید: اگر رشته ای از دستورها داشتید و قرار بود خروجی را به یک فایل بفرستید، هیچ وقت از یک نام فایل دوبار در رشته  دستوری استفاده نکنید. برای مثال اگر چنین دستوری بنویسید:

 cat mydata.txt 1 sort 1 uniq < mydata.txt$

در این صورت با یک فایل خالی مواجه خواهید شد، چون پیش از این که بخواهید فایلmydata.txt  را بخوانید، آن را بازنویسی کرده اید.

پوسته یا یک زبان برنامه نویسی
حالا که دیگر برخی از عملیات پایه پوسته را یاد گرفتیم، وقت آن رسیده است که سراغ برنامه های واقعی پوسته برویم. دو راه برای نوشتن برنامه های پوسته وجود دارد. می توانید رشته ای از دستورات را بنویسید و به پوسته اجازه بدهید که آن ها را تک تک اجرا کند، یا دستورات را داخل فایل بریزید و بعد به عنوان برنامه از آن استفاده کنید.

برنامه های تعاملی
(Interactive Programs)
نوشتن و اجرا کردن دستورها، یکی از راه های سریع و آسان آزمایش تکه های کوچک کد است، برای یادگرفتن مناسب. فرض بگیرید تعداد زیادی فایلC  دارید و می خواهید فایل هایی که شامل رشتهPOSIX  هستند را شناسایی کنید، به جای این که تک تک و از طریق دستور grep  بخواهیم این کار را انجام دهیم، می توانیم همه  این کارها را داخل اسکریپتی تعاملی بنویسیم، این پایین را نگاه کنید:

for file in *$
 do <
 if grep -l POSIX $file<
 then<
 more $file<
 fi<
 done<

نگاه کنید که چقدر طبیعی $ برنامه  پوسته به < تبدیل می شود و پوسته منتظر اطلاعات بعدی است. می توانید تایپ کردن را بس کنید و به پوسته اجازه بدهید خودش تصمیم بگیرد که شما کارتان تمام شده است و بعد اسکریپت فورا اجرا می شود. پوسته همچنین ازWildcard expansion ها نیز پشتیبانی می کند. دیگر قریب به یقین شما می دانید که * یعنیWildcard  برای همه کاراکترها. ممکن است این را ندانید که برای یک حرف نیزWildcard  به نام  داریم، همچنین]set[  مجموعه ای از کاراکترها را در خود می گیرد که قرار است چک شوند. برعکس آن اگر 8 بیاید، مثل]set[  در این صورت، هر چیزی را شامل می شود جز آن هایی که داخل براکت اند. نشان آکولاد ت ت هم  به شما اجازه می دهد تا چند رشته را در مجموعه ای کنار هم قرار دهید تا کار خاصی انجام بدهید:

 ls my- تfinger, toeتs$

این دستور فایل های myfingers و mytoes را لیست می کند. این دستور از پوسته استفاده می کند تا هر فایلی که داخل دایرکتوری فعلی است را بررسی کند.

ساختن یک اسکریپت
با هر ویرایشگر متنی که میلتان می کشد، می توانید فایلی شامل دستورات بسازید، فایلی بسازید به نام first  که شبیه مثال زیر باشد:

/bin/shَ#
 firstَ#
This file looks throughَ#
 all the files in the current
 directory for the string POSIX,َ#
and then prints the names of
 those files to the standard output.َ#
for file in *
do
file$if grep -q POSIX
then
file$echo
fi
done
0exit

توضیحات (comment) ها با نماد  آغاز می شوند و تا پایان خط به عنوان توضیح به حساب می آیند؛ هر چند عرف است که در ستون اول همیشه  بگذارند. حال در خط بعدی به دستور َbin/sh/! بر می خوریم که فرم خاصی از توضیح است. کاراکترهای َ به سیستم می گویند که آرگومان هایی که در ادامه می آیند، برنامه ای است که برای اجرای این فایل باید دنبال شودbin/sh/ . برنامه پوسته پیش فرض است.

نکته: مسیر پس از َ مسیر قطعی(Absolute)  است. با هم توافق کرده اند که این رشته را از 32 کاراکتر کمتر نگه دارند تا با سیستم های قدیمی تر همخوان باشد، چون برخی از یونیکس های قدیمی از تعداد محدودی از کاراکترهایی که بعد از ! می آیند، بهره می بردند. واضح است که لینوکس های امروزی دیگر این محدودیت را ندارند. از آن جایی که اسکریپت وارده، به عنوان ورودی استانداردی در پوسته مطرح است. در این صورت می تواند شامل هر دستوری باشد که متغیر محیطی PATH شما مسیر آن را در خود دارد.

دستورexit  در انتهای اسکریپت اطمینان می دهد که اسکریپت با کد خروجی مطمئن کنترل اجرای دستورات را به سیستم عامل بر می گرداند. هرچند که به ندرت چنین چیزی چک می شود، اما می شود فهمید که آیا اسکریپت با موفقیت اجرا شده است یا خیر. در این صورت می توان با اطمینان از این اسکریپت در اسکریپت یا دستوری دیگر استفاده کرد و از صحت اجرای آن اطمینان حاصل کرد. حتا اگر نخواهید اسکریپت تان را بقیه اجرا کنند، باز هم در انتهای اسکریپت این کد را بگذارید که کاری منطقی است. به کاربردی بودن اسکریپت خود اعتقاد داشته باشید. فرض بگیرید که شاید، یک در یک میلیون قرار باشد به عنوان بخشی از اسکریپتی دیگر به کار گرفته شود.
نکته: عدد صفر نشانگر خروج موفقیت آمیز است.

اجرایی کردن یک اسکریپت
حالا فایل اسکریپت مان را ساختیم، می توانیم به دو صورت آن را اجرا کنیم. راه ساده تر این است که اسم فایل را به پوسته بدهیم.

/bin/sh first $

این دستور باید عمل کند، اما چقدر خوب می شود که اسکریپت را فقط با صدا کردن نامش استفاده کنیم و از اینbin/sh/  خلاص شویم.  این کار را با تغییر حالت فایل (chmod) به سادگی می توان انجام داد:

$chmod+xfirst

این دستور، فایل first را با +x اجرایی می کند. و پس از این، تنها کافی است با دستور زیر اسکریپت را اجرا کنید:

$first

اگر پیغامی گرفتید که "چنین دستوری یافت نشد!" متغیر محیطی PATH  احتمالا به مسیر فایل های اسکریپت شما اشاره نمی کند. برای رفع این مشکل، یا تایپ کنیدPATH=$PATH: یا فایل bash-profile  را ویرایش کنید و این دستور را به انتهای آن بیفزایید. سپس یک بارlog out  کنید و دوباره به سیستم برگردید. این هم نشد،first/.  را در دایرکتوری ای که اسکریپت داخلش است، بنویسید تا مسیر کامل نسبی به اسکریپت را به فایل بدهید.
استفاده از ./ یک سود دیگر هم دارد، آن این است که شما تصادفا دستور دیگری با این نام را اجرا نخواهید کرد. اگر دیدید که اسکریپت شما با موفقیت اجرا شد، می توانید به جای مطمئنی منتقلش کنید، اگر از این دستور فقط خودتان استفاده می کنید، می توانید یک دایرکتوری bin در فولدر home خود بسازید و مسیرش را بهPATH  اضافه کنید. اگر می خواهید بقیه کاربران هم از آن استفاده کنند، آن را داخل فولدرusr/local/bin/ قرار دهید. اگر دسترسیRoot  ندارید، باید از سرپرست سیستم درخواست کنید این کار را برای شما انجام دهد. اگر هم مایل نیستید که کسی آن را تغییر دهد، می توانید دسترسی نوشتن در آن فایل را بردارید. دستوراتی که سرپرست سیستم طی آن مالکیت و دسترسی های نرم افزار را مشخص می کند، چیزی شبیه این خواهد بود: 

 cp first /usr/local/binَ#
 chown root /usr/local/bin/firstَ#
 chgrp root /usr/local/bin/firstَ#
َchmod557 /usr/local/bin/first #
توجه داشته باشید که از شکل کلی دستور chmod استفاده کردیم، چون دقیقا می دانستیم که چه سطح دسترسی ای می خواهیم بدهیم. اما شما می توانید از شکل طولانی تر، اما شاید واضح تر دستور chmod استفاده کنید:

  َ chmod u=rwx,go=rx /usr/local/bin/first #

برای اطلاعات بیشتر از راهنمای دستور chmod  استفاده کنیدman chmod.

مشاهده ادامه مطلب لینوکس برای همه