آموزش همگام شل اسکریپت نویسی

مباحث مربوط به زبان های برنامه نویسی در لینوکس

آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » آدینه اسفند 7, 88 11:41 pm

سلام بر همه‌ی مهربانان؛
در اینجا مقصود این است که با هم شل اسکریپت رو یاد بگیریم.
برای این مقصود، فایل ضمیمه رو دانلود کنین (اگه قبلا خودتون ندارینش!)
بعدش بر اساس پست های این بخش با هم پیش می‌ریم تمام حالات مختلف رو در نظر می‌گیرم و سعی می‌کنیم تجربه‌ی مشترکی از یادگیری شل با کمک همدیگه داشته باشیم.

سعی می‌کنیم همه چیز رو کشف کنیم. نتیجه‌اش رو هم توی یک ویکی می‌گذاریم. ایشالله! -- البته با نظر شما، اگه هم حوصله نداشتیم هویجوری پیش می‌ریم ببینیم چی می‌شه.
پیوست ها
shell-tutorial.pdf.zip
آموزش شل اسکریپت
(759.56 KIB) 394 بار دریافت شده است
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

The following 3 users would like to thank Ali_Gh for his or her post:
moslem.b, NabiKAZ, totia

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » شنبه اسفند 7, 88 12:15 am

خیلی خب برای شروع من پیشنهاد می‌دم ۲۱ تا ۳۷ رو کامل بخونیم. هر جا مشکلی بود یا کمبودی اینجا مطرح کنیم. دلیل این انتخابم هم این هستش که تا صفحه‌ی ۳۷ ظاهرا کل مطالب مربوط به خروجی گفته شده و از اونجا به بعدش در مورد ورودی گرفتن از کاربر برای اسکریپت مطرح شده.
نظر شما چیه؟
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

The following user would like to thank Ali_Gh for his or her post:
totia

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز moslem.b » شنبه اسفند 8, 88 11:00 pm

بسیار بسیار عالیه

خوب مورد اول این که این ویرایشگر vi خیلی چیز جالبیه واسه تایپ کردن تو محیطش باید کلید i رو زد و متن رو نوشت بعد که کارمون تموم شد Esc میزنیم و بعدش هم تایپ میکنیم wq: تا متن مورد نظر ذخیره بشه

مورد دوم صفحه ی 35 یه مطلب جالب در مورد کوتیشن ها نوشته شده بود که قبلا نمیدونستم کاربردشون چه فرقی داره

و مورد سوم اینکه chmod +X با chmod 755 چه فرقی داره ؟

البته یه سوالی هم قبلا یه جا پرسیده بودم که بی ربط به این موضوع نیست,مجوزها روی فایل ها اعمال میشن یا روی سیستم عامل ؟ اگه روی فایل ها پس چرا وقتی من به یه اسکریپت مجوز اجرای میدم توی یه سیستم عامل دیگه باید باز هم بهش مجوز اجرایی داد ؟
ctrl+c
moslem.b

 
نوشته: 362
پیوستن: چهار شنبه دی 4, 87 4:51 pm
شهر: اهواز
Given: 100 thanks
Received: 108 thanks

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » شنبه اسفند 8, 88 11:42 pm

moslem.b نوشته است:بسیار بسیار عالیه

خوب مورد اول این که این ویرایشگر vi خیلی چیز جالبیه واسه تایپ کردن تو محیطش باید کلید i رو زد و متن رو نوشت بعد که کارمون تموم شد Esc میزنیم و بعدش هم تایپ میکنیم wq: تا متن مورد نظر ذخیره بشه

مورد دوم صفحه ی 35 یه مطلب جالب در مورد کوتیشن ها نوشته شده بود که قبلا نمیدونستم کاربردشون چه فرقی داره

و مورد سوم اینکه chmod +X با chmod 755 چه فرقی داره ؟

البته یه سوالی هم قبلا یه جا پرسیده بودم که بی ربط به این موضوع نیست,مجوزها روی فایل ها اعمال میشن یا روی سیستم عامل ؟ اگه روی فایل ها پس چرا وقتی من به یه اسکریپت مجوز اجرای میدم توی یه سیستم عامل دیگه باید باز هم بهش مجوز اجرایی داد ؟


من که اصلا با vi حال نکردم. من با nano کار می‌کنم. (فقط امیدوارم این به جنگ ویرایشگر‌های متنی منتهی نشه!)
آره منم فکر نمی‌کردم این ` هم جزو علامات کوتا باشه! در مورد اون باید بگم تفاوتشون توی کارکردشونه:
کد: گزینش همه
chmod +x filename

بر اساس اینکه فایل چه مجوز‌هایی قبلا داشته - مثلا ممکنه 666 یا 640 یا هر چیز دیگه‌ای باشه- به همه‌ی مخاطباش اجازه‌ی اجرا رو اضافه می‌کنه. مثلا در مورد 666 می‌شه 777 (خواندن/نوشتن/اجرا برای همه) و برای 640 می‌شه 751 (که یعنی مالک: خواندن/نوشتن/اجرا، گروه مالک: خواندن/اجرا، سایرین: اجرا) ولی اون دستور
کد: گزینش همه
chmod 755 filename

صرفنظر از اینکه فایل چه مجوز‌هایی قبلا داشته مجوزش رو به این ترتیب تغییر می ده که مالک: خواندن/نوشتن/اجرا، گروه مالک: خواندن/اجرا و سایرین:خواندن/اجرا
امیدوارم تونسته باشم منظورم رو برسونم.
جالبه. این سوال رو من یکبار تست کردم البته در شرایط خاصی: من روی فایل سیستم ریزر یک پوشه با فایل‌هایی حاوی مجوز دسترسی فقط مالک گذاشتم. بعدش با یک توزیع لایو (اوبونتو) پارتیشن رو ماونت کردم و سعی کردم به اون‌ها دسترسی پیدا کنم. حدستون چیه؟ ... نشد! ولی وقتی sudo کردم به کاربر ریشه تونستم همه کاری باهاشون بکنم.
من که خودم گیج شدم!! شما چه نتیجه‌ای می‌گیرین؟
در مورد مجوز اجرایی هم کمابیش مطمئنم که باید خودت بهش مجوز بدی. دلیلش هم ساده‌ است. هر فایلی که از یک منبع خارجی در یک سیستم کپی/ایجاد می‌شه از umask سیستم پیروی می‌کنه (پیش فرض 0022) که معمولا مجوز 644 رو برای فایل‌ها نتیجه می‌ده. مگر اینکه این حالت توسط یک ناقلا! (در اینجا کاربر ریشه یا همدستاش!!) عوض شده باشه.
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

The following user would like to thank Ali_Gh for his or her post:
moslem.b

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » شنبه اسفند 8, 88 11:52 pm

منم تمامش کردم! اون چند صفحه رو می‌گم!
صفحه ۲۴؛ تفاوت اجرای با . و اجرای با /. در اینه که دستور اجرا شده با . در شل فعلی بدون ایجاد کپی جدیدی از شل اجرا می‌شود/
من یادمه قبلا توی یک کتاب (فکر کنم نصب و برپا سازی سرور‌های گنو/لینوکس بود) خوندم که ایجاد شدن کپی از شل معمولا اتفاق می‌افته. ولی یادم نیست دلیلش رو نوشته بود یا نه! کسی می‌دونه؟

راستی یک چیز خز بگم؟
برای اجرای هر دو پارامتر n- و e- با هم می‌شه نوشت ne- ! معلوم شد کرنل کار می‌کنه نه؟
:lol: :mrgreen:

برای نوتبوک من echo با اسکپینگ a\ آژیر نزد. کسی روی PC امتحان کرده؟

راستی من سعی کردم از اسکپینگ r\ توی echo استفاده کنم. خیلی قاطی کرد. در حدی که حتی کلمه‌ی قبلیش رو دیگه نشون نداد! من حدس می‌زنم از این کاراکتر باید برای متن‌هایی که قراره در سیستم عامل اسمش-رو-نبر خوانده بشن استفاده می‌شه.
کسی کاربردی توی لینوکس براش داره؟

------
راستی یک چیز همین الان یادم اومد. من یادمه خط اول اسکریبت همیشه اینجوری می‌نوشتیم:
کد: گزینش همه
#!/bin/bash

ولی تو این قسمت همچین چیزی نگفته. البته شاید در صفحات بعدی بگه. برداشت من اینه که چون ما اسکریبت رو از خود bash اجرا می‌کنیم. پیش‌فرض خودش رو مفسّر در نظر می‌گیره و تلاش می‌کنه اسکریبت رو خودش تفسیر کنه. که دست بر قضا موفق هم می‌شه! :ugeek: البته شاید این هم قابل تغییر باشه. واقعا قابل تغییره؟ فایل تنظیماتش کجاست؟ چطوری ممکنه؟....
:? :?:
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » یک شنبه اسفند 8, 88 12:29 am

خب فکر کنم به یک چیز‌هایی رسیدم. در مورد مفسّر پیش‌فرض:
قبلش این لیست مفسّر‌ها رو ببینین:
کد: گزینش همه
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f


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

به لینوکس می‌فهمونه که این یک اسکریپت (یک مجموعه دستور) هستش که باید با مفسّری که من می‌گم اجراش کنی. به همین دلیل هم هست که وقتی مسیر مفسر دنباله شا-بنگ رو اشتباه تایپ کنیم به پیغام خطای زیر می‌رسیم:
کد: گزینش همه
bad interpreter: No such file or directory


خب این از جریان لینوکس. اما همونطور که حدس می‌زدم مشخص نکردن شا-بنگ در بحث قابل حمل بودن اسکریپت اثر می‌گذاره. یک اسکریپت بدون شا-بنگ در لینوکس با bash و در سیستم‌های یونیکسی دیگه با sh تفسیر می‌شه.
ظاهرا با مشخص نکردن
کد: گزینش همه
#!/bin/bash

نمی‌شه از دایرکتیو‌های bash در محیط‌های خارج از لینوکس استفاده کرد. (گمونم مثل انتصاب مقدار به متغییر‌های کاربر به این فرم theline=30 )

در نهایتش. مشخص نکردن این شا-بنگ برای ما لینوکس کار‌ها خطری نداره.( مفسر پیش‌فرض لینوکس: bash) خیالتون یکم راحت باشه. ولی حتی سعی نکنین با اون اسکریپت خوشگلتون سمت freeBSD برین، اونجا csh پیش‌فرض نصبه. پس احتیاط کنین 8-)
--------------------
این‌ها از اینجا به من الهام شد!:
http://tldp.org/LDP/abs/html/sha-bang.html
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز NabiKAZ » یک شنبه اسفند 8, 88 1:55 am

خب بازگشتت مجددت رو به فروم تبریک میگم. خیلی خوش اومدی... ولی تو همونی؟! خوشتیپ شدی ;)

درمورد pdf متشکرم. صفحه 189 منو یاد برنامه نویسی کیوبیسک اون زمانهای دور انداخت....

در مورد سطح دسترسی. یادمه وقتی سیستم عامل عوض شد حجم فولدرها زیادتر شد. وقتی پرسیدم گفتند به خاطر سیستم عامل جدیده که در این حالت بهتر فولدرها ایندکس میشن و... اگر اشتباه نکنم اطلاعات فایل و فولدرها در تراک صفر ذخیره میشن که اطلاعات پارتیشن در اونجاست که خب طبعاً با مونت کردن و غیره همون سطح دسترسی ها حفظ میشن. مگر اینکه فایل جابجا بشه که در اون صورت در لحظه کپی سطوح دسترسی خودش رو از دست میده و این روال طبیعیه که سیستم عامل در پیش گرفته... ببخشید سواد من بیشتر از این نیست. خواستم نظری داده باشم ;)
NabiKAZ
مسئول وب‌سایت
 
نوشته: 166
پیوستن: شنبه دی 7, 87 8:26 am
شهر: اهواز
Given: 114 thanks
Received: 84 thanks

The following 2 users would like to thank NabiKAZ for his or her post:
Ali_Gh, moslem.b

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز moslem.b » یک شنبه اسفند 9, 88 10:07 pm

تفاوت اجرای با . و اجرای با /. در اینه که دستور اجرا شده با . در شل فعلی بدون ایجاد کپی جدیدی از شل اجرا می‌شود/
من یادمه قبلا توی یک کتاب (فکر کنم نصب و برپا سازی سرور‌های گنو/لینوکس بود) خوندم که ایجاد شدن کپی از شل معمولا اتفاق می‌افته. ولی یادم نیست دلیلش رو نوشته بود یا نه! کسی می‌دونه؟


یعنی وقتی شل رو با /. اجرا میکنیم یه کپی از شل ساخته میشه ؟؟؟!!!! این کپی کجا میره ؟
ctrl+c
moslem.b

 
نوشته: 362
پیوستن: چهار شنبه دی 4, 87 4:51 pm
شهر: اهواز
Given: 100 thanks
Received: 108 thanks

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » یک شنبه اسفند 9, 88 11:27 pm

NabiKAZ نوشته است:خب بازگشتت مجددت رو به فروم تبریک میگم. خیلی خوش اومدی... ولی تو همونی؟! خوشتیپ شدی ;)

بعله خودمم! از تاکس بودن خسته شدم گفته‌ام بگذار حالا که فروم راه افتاده ما هم آدم بشیم!! :mrgreen:


...درمورد pdf متشکرم. صفحه 189 منو یاد برنامه نویسی کیوبیسک اون زمانهای دور انداخت....

ناقلا رفتی جلو؟

در مورد سطح دسترسی. یادمه وقتی سیستم عامل عوض شد حجم فولدرها زیادتر شد. وقتی پرسیدم گفتند به خاطر سیستم عامل جدیده که در این حالت بهتر فولدرها ایندکس میشن و... اگر اشتباه نکنم اطلاعات فایل و فولدرها در تراک صفر ذخیره میشن که اطلاعات پارتیشن در اونجاست که خب طبعاً با مونت کردن و غیره همون سطح دسترسی ها حفظ میشن. مگر اینکه فایل جابجا بشه که در اون صورت در لحظه کپی سطوح دسترسی خودش رو از دست میده و این روال طبیعیه که سیستم عامل در پیش گرفته... ببخشید سواد من بیشتر از این نیست. خواستم نظری داده باشم ;)

راستش یکم گیج شدم! در مورد ذخیره شدن اطلاعات پارتیشن در تراک صفر مطمئنم ولی در مورد ذخیره شدن اطلاعات فایل‌ها و پوشه‌ها در تراک صفر چندان مطمئن نیستم. راستی من از این نظر نبی File System رو توی ویکی پدیا گوگل کردم. به یک چیز جالب برخوردم اگه دوست داشته بودین سرفرصت پیگیرش بشیم: تاپیکش اینجاست: http://khuzestanlug.ir/forum/viewtopic.php?f=30&t=495&start=0
خوشحال می‌شیم نبی جون همراهیمون می‌کنی. ;)
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

The following user would like to thank Ali_Gh for his or her post:
NabiKAZ

Re: آموزش همگام شل اسکریپت نویسی

نوشتهاز Ali_Gh » دو شنبه اسفند 9, 88 1:20 am

زنده باد آلن باغومیان؛ من از همینجا مطالعه‌ی کتاب «نصب و برپاسازی سرور‌های لینوکس» تالیف استاد آلن باغومیان رو به همه دوستداران لینوکس توصیه می‌کنم.
داشتم دنبال کپی شل می‌گشتم ببینین چی پیدا کردم:
مسلم جون یادت هست گفتم برای انجام محاسبات ریاضی خروجی echo رو به bc می دادیم؟
بعدش توی کتابه دیدم expr رو معرفی کرده...
حالا این رو ببین از شیخ آلن باغومیان:
کد: گزینش همه
echo "I am $[2003-1978] years old."

ای جان! حال کردین؟

حالا یک چیز دیگه، تا حدودی فهمیدم منظور از ./ و . چیه؟
خب می‌دونین مسئله سر مدیریت پروسه‌هاست. هر پروسه‌ای که در سیستم اجرا می‌شه یک کد انحصاری پروسه داره PID این کد حتی برای bash هم وجود داره.
تست کنین:
کد: گزینش همه
ps au

در خروجی به ردیف pid توجه کنین. این کد مربوط به pid شل شماست.
حقیقت قضیه اینجاست که با اجرای هر دستوری در شل یک نسخه از شل در حافظه مجددا بارگذاری می‌شه و دستور در اون شل اجرا می‌شه. دستور ps هم از این قاعده مستثنی نیست!
بیشتر توضیح بدم؟
این دستور رو ببینین:
کد: گزینش همه
echo $PPID

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

برای یک تمرین کوچولو حاضرین؟
دو تا پنجره‌ی ترمینال باز کنین. در هر دو ترمینال دستور زیر رو وارد کنین
کد: گزینش همه
ps au

همونطور که می‌بینین. دو تا bash وجود داره با دو تا PID متفاوت. حالا این دستور رو بزنین:
کد: گزینش همه
echo $PPID

در هر دو پنجره یک مقدار نشان داده می‌شود.
حتما با دستور کشتن پروسه آشنایی دارین:
کد: گزینش همه
kill -9 $PPID

همونطور که دیدین. این دستور پروسه‌ی والد bash ها رو می‌کشه و در نتیجه همه‌ی پنجره‌های bash یک دفعه بسته می‌شوند.

حالا در یک اسکریپت نمونه مثلا با اسم ppidTest این دستور رو وارد کنین
کد: گزینش همه
#
# PPID test
#
echo $PPID

خب حالا طبق کتاب اگه یکبار این اسکریپت رو به این شکل
کد: گزینش همه
./ppidTest

و یکبار به این شکل
کد: گزینش همه
. ppidTest

اجرا کنین (بین نقطه و اسم اسکریپت یک کاراکتر فاصله هست).
من اینجوری نتیجه می‌گیرم که برای اولی مثل هر دستور دیگه‌ای در شل یک PID فرزند از bash اصلی گرفته شده و آن فرزند، شده والد این اسکریپت بیچاره! و برای دومی اسکریپت رسما رفته پیش والد اصلی و گفته من فرزند شما هستم!

خب فکر کنم پزشکی قانونی بتونه مشکل این اسکریپت ما رو حل کنه! فقط دارم فکر می‌کنم اولی از این جهت بهتره که با نرم افزار‌های مدیریت پروسه یا حتی ps می‌شه پدر اسکریپت رو پیدا کرد و به خدمتش رسید! (البته اگه لازم شد) ولی برای حالت اجرای دومی قضیه به این سادگی نخواهد بود و تاوانش سنگین‌تر خواهد بود. به نظر شما چه موقع باید از دومی استفاده کرد؟

راستی بچه‌ها مواظب دام‌های تازه‌کار‌ها باشیم!
http://www.bash-hackers.org/wiki/doku.php/scripting/newbie_traps

نظر سنجی موافق هستین بریم گام بعدی؟
گروه کاربران ایرانی اینک اسکیپ
http://inkscape-ir.org
آکلینوکس
http://aqlinux.ir
Ali_Gh
مسئول جلسات
 
نوشته: 443
پیوستن: شنبه دی 7, 87 11:00 am
شهر: اهواز
Given: 58 thanks
Received: 196 thanks

The following user would like to thank Ali_Gh for his or her post:
NabiKAZ

پس

برگشت به برنامه نویسی

اکنون هست

;کسانی که اکنون در این تالار هستند: کاربری نام ننوشته است کاربر و 1 میهمان

cron