در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
پایپها و انتقال
پیش از آنکه در این شماره بهطور جدی وارد مبحث برنامهنویسی در پوسته( 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 :
محمدرضا قربانی
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: