برای برنامه نوییسی در shell دو نوع دستور داریم که بعدا در باره اونا با هم صحبت می کنیم اما یک سری علامت ها و .. داریم که همین الان قصد دارم چنتا از اونا رو بگم(که خیلی پر کاربردند)
بعدش اولین برنامه رو می نویسیم
منتقل کننده ها(redirection)
شما میتونید همونجوری که در c++ مقادیر رو از/به cin و cout دریافت/ارسال میکردید در اینجا هم عمل کنین
به عنوان مثال اگر خروجی یک دستور رو لازم دارید به راحتی میتونید اون رو داخل یک فایل بنویسید ویا اگه دستوری نیاز به آرگومان داره این آرگومان(ها) رو از یک فایل بهش بدین
(نکته مهم در اینجا اینه که همه چی تو لینوکس فایله و این براش یک نقطه قوته و خیلی خوبه-کار برنامه نویسا خیلی راحت شده- که البته بعدا در این باره بیشتر صحبت میکنیم)
برای این کارها(منتقل کردن) باید مثل c++ از عبارت کوچکتر و بزرگتر استفاده کرد یعنی به صورت یکی از ۴ شکل زیر
<
>
<<
>>
خوب معلومه که معانی اینها با هم فرق میکنن.
اونایی که دوتایی هستند یعنی >> یا << - کارشون اضافه کردن (append) هستش
به دستور زیر دقت کنین
ls *.deb >> mydebs.txt
این دستور نام هرچی فایل دبین در پوشه جاری باشه رو داخل یک فایل در فلدر جاری به نام mydebs.txt اضافه میکنه
اگه این فایل وجود نداشته باشه که ساخته میشه و در غیر این صورت به انتهای فایل مقادیر جدید اضافه میشه
حالا به دستور زیر دقت کنید
ls *.deb > mydebs.txt
اگه فایل موجود نباشه که ساخته میشه اما در غیر این صورت فایل قبلی با مقادیر جدید جایگزین میشه
به عبارت دیگه اطلاعات قدیمی از دیست میره و با مقادیر جدید جایگزین میشه
اگر جهت این فلش ها(بزرگ و کوچک) جابجا بشه و از >> یا > استفاده کنیم . این علامت ها به معنی ورودی برای دستور خواهند بود
لوله ها(pipes)
برخلاف ویندوز در لینوکس و یونیکس دست شما بازه که خروجی یک دستور رو به عنوان ورودی استفاده کنین و یا به عبارت دیگه کانال کشی کنین و خروجی ها درون دستور بعدی ریخته بشه
نکته جالب اینه که این کانال کشی واقعی هستش و نه مجازی(به زودی منظور من رو شرح میدم)
به دستور زیر دقت کنید
ps > psout.txt
sort psout.txt > pssort.out
در عبارت فوق ابتدا خروجی دستور ps رو در یک فایل ذخیره میکنیم و بعد خروجی رو با دستور sort منظم میکنیم و در یک فایل دیگه ذخیره میکنیم
به جای عبارت فوق با لوله کشی به عبارت زیر میرسیم (علامت لوله کشی | هستش)
ps | sort > pssort.out
همونطوری که دیده میشه فایل میانی که اضافه هم بود حذف شد و سرعت عملیلت هم بیشتر شد در صورتی که اگه این لوله کشی مجازی بود در واقه قسمتی از حافظه به عنوان temp قرار می گرفت و خروجی ابتدا در اون ذخیره میشد و سپس sort میشد در صورتی که در عبارت لوله کشی این فرایند به صورت موازی انجام میشه
یک شاهد دیگه برای موازی انجام شدن این فرایند دستور زیره
cat mydata.txt | sort | uniq | > mydata.txt
اگه این فرایند مجازی بود نباید مشکلی پیش میومد اما در دستور فوق به علت موازی بودن فرایند شما فقط یه فایل خالی گیرتون میاد.
دلیل این حرف و اتفاق هم اینه که فایل mydata.txt قبل از اینکه خونده بشه با دستور < داره جایگزین میشه(با یه فایل خالی) و لذا با نوشتن دستور فوق همیشه یک فایل خالی تحویل میگیرین
for file in *
do
if grep -l POSIX $file
then
more $file
fi
done
بعدا در باره حلقه ها و شرط یا هم صحبت میکنیم
فعلا دقت کنید که با تایپ دستورات به صورت خط به خط در ترمینال به چه سادگی از خط فرمان عادی ($) - شکل خط فرمان به صورت < دراومد و آماده گرفتن برنامه شد!!
نکته دیگه اینکه اگه خاستید یک سری عبارات یا دستور های مشابه رو بررسی کنسد - برای سادگی کار شما راه هایی وجود داره
ls my_{finger,toe}s
عبارت فوق فایل های my_fingers و my_toes رو نشون میده(در دایرکتوری جاری)
حالا احتیاج به یک ادیتور متن داریم(شما میتونید از هرچیزی استفاده کنید اما من یکی از برنامه های زیر رو پیشنهاد میکنم)
gedit
kate
vim
nano
emacs
یکی از دوستام ادعا میکنه که emacs از همه قویتره اما خودم با gedit راحت ترم
استفاده از vi یا vim هم خیلی با کلاسه
یک فایل به نام first ایجاد کنید(توجه کنید که اگه بعدا هم یک اسکریپت نوشتید نامش با دستور ها یکی نباشه و به عنوان مثال از test استفاده نکنید چون این یک دستوره)
داخلش عبارت زیر رو بنویسید
#!/bin/sh
# fist
# this is my first script and it is from forum.ubuntu.ir
for file in *
do
if grep -q POSIX $file
then
echo $file
fi
done
exit 0
کامنت ها در اسکریپت با # شروع میشن (همونجوری که در بعضی زبون ها با علامت های دیگه ای مثل // یا --!> شروع میشن)
اما خط اول یکم متفاوته
اگه بعد از # بافاصله ! بیاد یعنی عبارت #! مشاهده بشه به این معنیه که بعدش روش اجرای فایل قرار داره
اگه یادتون یاشه گفم که اسکریپت ها هرگر مستقیم اجرا نمیشن و از طریق یک برنامه دیگه اجرا میشن پس میتونیم روش اجرای اون رو در خط اول بزاریم و یا اینکه در هنگام استفاده دستی وارید کنیم
برای اجرای این اسکریپت شما باید اول اجازه اجرا شدن رو بهش بدین
chmod +x first
ویا اینکه بنویسید
/bin/sh first
واگر با chmod مجوز اجرا را بهش داده باشین با دستور زیر اجراش کنین
first
اگه با ویغامی مبنی بر اینکه دستور پیدا نشد مواجه شدید معنیش اینکه آدرس محل فایل در PATH وجود نداره پس شما چنتا راه دارین
۱- این فایل رو در یک آدرس معتبر کپی کنین
۲-دستور رو به شکل زیر اجرا کنین
./first
که به این معنیع که این فایل در آدرس جاری قرار داره
۳- دایرکتوری جاری رو به PATH اضافه کنین یعنی
PATH=$PATH:.
به اون نقطه آخر دقت کنین که به معنیه فولدر جاری هستش
۴-ویا اینکه با همون روش بند ۳ آدرس مطلق فلدر جاری رو به PATH اضافه کنین تا از هر جایی بتونین اسکریپت رو اجرا کنین
نکته : تغییر دادن PATH به شکل فوق برای سوپر یوزر ویا همون root کار خیلی خطرناکته چون یک شکاف امنیتی محسوب میشه چون با اجرای یک دستور توسط root ممکنه که یک برنامه اشتباه و دروغین اجرا بشه!!!(حالا پس با کپی کردن یک اسکریپت با نام یکی از دستورات مشهور و پر استفاده شما میتونید هر کار ی رو در سیستم قربانی انجام بدین
چون با دسترسی root قراره اجرا بشه)
نکته : استفاده از chroot و همچنین تغییر دسترسی و یا دادن مجوز ها راه های خیلی زیادی داره که فعلا یکیش رو بررسی کردیم-پیشنهاد میکنم دستور man chmod رو برای اطلاعات بیشتر اجرا کنین
خوش و خرم باشین
یا علی
فردا وارد بحث شیرین متغیر ها میشم و متغیر های اصلی و محلی سیستمتون رو معرفی میکنم و با هم چنتا برنامه کوچولو مینویسیم