رفتن به مطلب
بازگشایی انجمن! ×
GuardIran

پست های پیشنهاد شده


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

مجموعه اموزشی اسکریپتینگ از سه بخش اصلی تشکیل میشه

بخش اول کامند لاین و پیش نیاز های اسکریپت نویسی رو تشکیل میده

در بخش دوم اسکریپت نویسی رو از پایه شروع میکنیم و تا سطح متوسط پیش میریم (صفحه دوم)

و در بخش سوم مباحت مربوط به اسکریپت نویسی پیشرفته رو دنبال میکنیم

 

لطفا به هیچ عنوان اسپم ندید و اگر امری بود در پیام خصوصی عنوان کنید

 

This is the hidden content, please
/applications/core/interface/js/spacer.png">

__________________________________________________________________________________________________________________

بخش اول - قسمت یکم

یکی از راه های وصل شدن به CLI یا command line interface یا همان رابط کاربری خط فرمان ، استفاده از لینوکس بدون دسکتاپ هستش

درست مثل لینوکس در دوران قدیمش که شما فقط با یک محیط ویژال کنسول سر و کار داشتید

برای ویژال کنسول کردن محیط گرافیکی هم میتونیم از Alt + Ctrl + F1 / F7 استفاده کنیم

که هر کدوم از اف ها یک محیط ویژال کنسول مجزا برامون فراهم میکنن

که مستقیم به ران لول عمیق تر وصل اند و حتی میتونیم همزمان با یوزر های مختلف لاگین کنیم

هر کدوم از این محیط های کنسولیه مجزا شماره ی مربوط به خودشون رو دارن که در tty دیده میشه

مثلا وقتی شما با Alt + Ctrl +F2 دومین محیط کنسولیه خودتون رو باز میکنید

و با همون یوزر یا یوزر دیگه ای لاگین میکنید در اولین خط مقدار tty2 رو میتونید ببینید 

که نشون میده شما در دومین محیط کنسولیتون قرار دارید

برای شیفت کردن بین tty ها از همون Alt + Ctrl + F با شماره ی tty مورد نظر استفاده میشه

تو این مورد F1 ( برگشتن از محیط کنسولیه دوم ( با مقدار tty2 ) به محیط کنسولیه اولیه ( با مقدار tty 1 ) )

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

ما میتونیم درون محیط های کنسولی هم از text mode console terminal

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

 با استفاده از دستور setterm

برای مثال من چند مورد رو قرار میدم ، که البته خودتون با help میتونید لیست متنوع دستور setterm رو ببینید

This is the hidden content, please

 تغیر رنگ پس زمینه به یکی از رنگ هایی که اسمش رو نوشتم

This is the hidden content, please

تغیر رنگ متن به سبز ( یا هر رنگی که اسمش رو بنویسید )

This is the hidden content, please

برعکس کردن رنگ زمینه و متن

This is the hidden content, please

ذخیره ی تغیرات

This is the hidden content, please

برگشت به حالت پیش فرض

 

روش بعدی وصل شدن به شل استفاده از ترمینال های گرافیکی از داخل محیط دسکتاپ هستش  

این ترمینال ها روی کنسول کار میکنن ولی از داخل محیط گرافیکی دسکتاپ

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

در زیر من لیست پر استفاده هاشون رو با سایت هاشون برای علاقه مندان میزارم

 

This is the hidden content, please

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

به همین دلیل سعی کردم خیلی کوتاه و خلاصه توضیحش بدم ، در قسمت دوم دستورات خط فرمان رو شروع میکنیم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش اول - قسمت دوم

شلی که سیستم شروع به استفاده کردن ازش میکنه بستگی داره به پیکربندی یوزری که لاگین کرده

فایل /etc/passwd شامل لیستی از یوزر های سیستم هستش که جلوی هر یوزر اطلاعات پیکربندیش قرار داره

در زیر یک نمونه از مقادیر فایل passwd در دایرکتوری etc رو میبینید

 

This is the hidden content, please


هر کدوم از مقادیر فایل passwd دارای هفت فیلد هستش که این قسمت ها با ( : ) از هم جدا شدن

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

که اسم شل و مسیر دایرکتوریش قرار گرفته ، این همون شلی هست که بعد از لاگین کردن یوزر ، به صورت پیش فرض به اون یوزر داده میشه 

در این مثال یوزر rednaxela بعد از لاگین بر روی شل bash قرار میگیره

 

اکثر لینوکس ها از شل قدرتمند bash به صورت پیشفرض استفاده میکنن ، که یکی از شل های اصلی برای اسکریپت نویسی محسوب میشه

به همین دلیل ما هسته ی این مجموعه رو بر مبنا ی این شل قرار میدیم و بعد از پایان بخش سوم یه نگاه اجمالی به شل های دیگه میکنیم

 

تعامل با bash manual با دستور man :

صفحات manual صفحاتی هستند که جامع ترین توضیحات و دستور العمل هارو در مورد ابجکت های شل دارن

که میتونید مثلا با اموزش طرز کار یه کامند و اپشن های اون کامند تستش کنید

This is the hidden content, please

در دستور اول ما صفحات manual رو با استفاده از دستور  man برای دستور jobs دریافت میکنیم

و اما دستور دوم که دستور man رو با اپشن  k- اجرا کرده  ، از این اپشن میشه برای کشف دستوراتی که نمیدونید استفاده کنید

مثلا ما میخوایم یک فایل رو با استفاده از خط فرمان دانلود کنیم ، ولی نمیدونیم باید از چه دستوری برای دانلود استفاده کنیم

با دستور man -k download دستور هایی که مربوط به دانلود میشن برامون نمایش داده میشه

برای خروج از صفحات manual از حرف q استفاده کنید

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

از اطلاعات بدست اومده میتونید برای شناخت بخش های مختلف خروجی دستور man بهره ببرید


فایل سیستم و دستورات مربوطه :

به تفاوت پارتیشن بندی ویندوز با لینوکس دقت کنید

همون طور که در مثال پایین میبینید لینوکس از سیستم درایو هایی که ویندوز استفاده میکنه تبعیت نمیکنه و از نظر پارتیشن بندی یک ساختار یکپارچه درونی داره

نکته ای که باید در اسکریپت ها مدنظر داشته باشید اینه که مسیر های لینوکس برخلاف ویندوز از اسلش / استفاده میکنن نه بک اسلش \
و همچنین لینوکس بر خلاف ویندوز به تفاوت حروف کوچیک و بزرگ حساسه

This is the hidden content, please

در فایل سیستم لینوکس همه چیز از دایرکتوری ریشه ( / ) یا روت شروع میشه
( که در مثال بالا قبل از دایرکتوری home مشخصه ، که یعنی اولین دایرکتوری )
مواضب باشید به دلیل هم اسم بودن ، دایرکتوری ( / ) رو با دایرکتوری root در بحث ها اشتباه نگیرید ، چون در فارسی معنیه جفتشون میشه ریشه

مقادیر دایرکتوری /

boot = بوت دایرکتوری ( جایی که فایل های مربوط به بوت نگه داشته میشه )

dev = دیوایس دایرکتوری ( جایی که لینوکس نود های دیوایس تولید و نگهداری میکنه )
etc =  سیستم کانفیگوریشن ( جایی که فایل های پیکربندی سیستم نگه داری میشن )
home = دایرکتوری هوم ( جایی که لینوکس دایرکتوری یوزر هارو تولید و نگه داری میکنه )
lib = لیبراری دایرکتوری ( جایی که لینوکس فایل های لیبراری سیستم و اپلیکیشن هارو نگه میداره )
media = مدیا دایرکتوری ( یک مکان مرسوم برای مدیا های قابل جداسازی از سیستم )
mnt = مونت دایرکتوری ( یک مکان مرسوم دیگه برای مونت کردن مدیا های قابل جدا سازی )
opt = اپشنال دایرکتوری ( محل نگه داری دیتا و پکیج های نرم افزار های ثرد-پارتی )
proc = پراسس دایرکتوری ( جایی که اطلاعات سخت افزار و پروسه ها نگه داشته میشه )
bin = باینری دایرکتوری ( جایی که خیلی از ابزار های سطح یوزر گنو نگه داشته میشن )
root = روت دایرکتوری ( جایی که دایرکتوری خانه و دیتا های یوزر روت نگه داشته میشه )
sbin =  سیستم باینری دایرکتوری ( جایی که خیلی از ابزار های سطح ادمین گنو نگه داشته میشن )
run = ران دایرکتوری ( جایی که دیتا های ران تایم نگه داشته میشه )
srv = سرویس دایرکتوری ( جایی که دیتا های مربوط به سرویس هایی که سیستم میده نگه داشته میشه )
sys = سیستم دایرکتوری ( جایی که دیتا های مربوط به اطلاعات سخت افزاری نگه داشته میشه )
tmp = تمپورری دایرکتوری ( جایی که فایل های تمپورری (در فصل مربوط بهش کامل بهش میپردازیم) میتونن تولید و نگه داری بشن )
usr = یوزر باینری دایرکتوری ( محل نگه داری ابزار ها و دیتا فایل های سطح یوزر گنو )
var = وری ایبل دایرکتوری ( جایی که فایل هایی با مقادیر متغیر نگه داشته میشه مثل لاگ فایل ها )


به عنوان مثال وقتی که وارد شل میشید به طور پیش فرض در دایرکتوری home در لیست بالا قرار دارید که البته اونجا هم تو یه دایرکتوری دیگه که به اسم اکانتتون هست

 

دستورات خط فرمان :

 

This is the hidden content, please

از دستور cd برای مرور فایل سیستم استفاده میشه
مقادیری مثل ( . ) یا ( .. ) به ترتیب اشاره به دایرکتوری فعلی و دایرکتوری بالا تر دارن

 

This is the hidden content, please

از دستور pwd برای نمایش ادرس جایی که در فایل سیستم هستیم استفاده میشه
در این مثال خروجی دستور pwd میگه ما در مسیر root/books/ هستیم

 

This is the hidden content, please

از دستور ls برای مشاهده لیست مقادیر یک دایرکتوری استفاده میشه
که اپشن های متنوع ای داره که چند تاشون رو مثال زدم ، اپشن ها میتونن به صورت تکی یا بیشتر استفاده بشن ، یا حتی ادغام شن مثل ls -alF

اپشن F- فایل هارو از دایرکتوری ها متمایز میکنه
اپشن R- تمام محتوای دایرکتوری رو با تمام مقادیری که خود اونها دارن تا انتها لیست میکنه
اپشن a- مقادیر مخفی رو هم در لیست به نمایش میزاره
اپشن l- لیست خروجی رو همراه با اطلاعات مربوط به هر کدوم از مقادیر نشون میده
مقادیری مثل سطح دسترسی فایل برای یوزر ها
نام صاحب فایل
نام گروه فایل
مقدار سایز فایل
اخرین زمانی که اصلاح شده و ...

از دستور ls برای لیست هایی که مد نظرمون هست هم میشه استفاده کرد
مثل ls *.txt که میگه هر فایلی که چهار کاراکتر اخر اسمش ( t & x & t & . ) بود رو لیست کن
یا ? که میگه به جای من هرچیزی بود بپذیر
یا  [a-p] که میگه به جای من هر کاراکتری از a تا p بود قبول کن
یا [a!] که میگه به جای a هر کاراکتر دیگه ای بود بپذیر

شما میتونید از این چند نمونه ی ساده به جز دستور ls در جاهای بیشماری استفاده کنید
که البته با مدل های بیشتری در ادامه اشنا میشید

 

This is the hidden content, please

از دستور touch برای ساخت فایل خالی استفاده میشه
که در مثال بالا طرز استفاده و امکاناتش رو میتونید ببینید
ا

 

This is the hidden content, please

از دستور cp برای کپی کردن فایل ها استفاده میشه

در مثال اول یک فایل در همون دایرکتوری ای که بوده کپی شده ، به همین دلیل اسمش رو عوض کردیم
در مثال دوم چون خودمون تو هیچ کدوم از مسیر های مبدا و مقصد کپی نبودیم
نام فایل رو چه در مبدا چه در مقصد همراه با مسیر کامل نوشتیم
در مثال سوم چون خودمون در دایرکتوری قرار گیری فایل بودیم اسم فایل رو بدون ادرس مبدا نوشتیم
و اما مثال چهارم ، همون طور که قبلا گفتیم کاراکتر ( . ) اشاره به دایرکتوری فعلی ما داره به همین دلیل برای کپی کردن فایل به جایی که هستیم مسیر مبدا رو نوشتیم و به جای مسیر مقصد ( جایی که هستیم ) کاراکتر ( . ) گذاشتیم

میتونیم از اپشن i- هم استفاده کنیم , که در صورت وجود یک فایل هم نام در ادرس مقصد قبل از کپی روی مقادیر اون فایل ازمون سوال شه
با استفاده از اپشن R- میتونیم تمام محتوای یک دایرکتوری رو کپی کنیم

 

This is the hidden content, please

از دستور ln با اپشن s- برای ساخت شورتکات استفاده میشه

 

This is the hidden content, please

از دستور mv برای انتقال فایل و تغیر نام فایل استفاده میشه
در مثال اول ( تغیر نام به file2) تغیر نام انجام میشه
در مثال دوم ( انتقال به داخل دایرکتوری books ) انتقال فایل انجام میشه
در دستور mv هم مثل دستور cp میتونیم از اپشن i- یا R- استفاده کنیم

 

This is the hidden content, please

با دستور rm و انتخاب فایل , فایل مورد نظر دیلیت میشه
با استفاده از اپشن R- میتونیم یه دایرکتوری رو با همه ی مقادیرش دیلیت کنیم

 

This is the hidden content, please

با استفاده از دستور mkdire میتونیم دایرکتوری بسازیم
با اضافه کردن اپشن P- میتونیم با یک دستور دایرکتوری های تو در تو بسازیم

 

This is the hidden content, please


از دستور rmdir برای دیلیت کردن دایرکتوری های خالی استفاده میشه

 

This is the hidden content, please

از دستور tree برای دیدن ساختار درختی یک دایرکتوری استفاده میشه
( به تصویر کشیدن تمام مقادیر لایه به لایه )

 

This is the hidden content, please

دستور file نوع فایلی که بهش بدید رو بر مبنای مقدار درونیه فایل مشخص میکنه

 

This is the hidden content, please

دستور cat فایلی که بهش بدید رو باز میکنه ( نه اجرا )
اپشن n- اول هر خط یک عدد میزاره به ترتیب میاد پایین
اپشن b- فقط اول خط هایی که دارای مقادیر باشن شماره بندی اعمال میکنه

 

This is the hidden content, please

دستور more هم مشابه دستور cat عمل میکنه ولی یوزر فرندلی تر
و مقدار خروجی رو بخش بخش و درصد گذاری شده نمایش میده
نسبت به cat داینامیک تره و قدرت پویش یوزر رو افزایش میده

 

This is the hidden content, please

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

 

This is the hidden content, please

دستور tail به صورت پیشفرض ده خط اخر فایل رو میخونه
که با اپشن n- و عدد درخواست تعداد خط های اخر فایل یا مستقیما وارد کردن عدد درخواستی بعد از ( - )

میتونیم این مقدار رو تغیر بدیم
نکته ی جالب توجه این دستور اپشن f- هستش که باعث میشه سیشن دستور فعال بمونه حتی وقتی یه برنامه داره از فایل مورد نظر استفاده میکنه 
که این باعث میشه به محض تغیر در فایل به صورت زنده تغیرات نمایش داده بشن

 

This is the hidden content, please

دستور head مدل برعکس دستور tail هستش ، که ده خط اول فایل رو میخونه
در بقیه ی موارد کاملا مثل دستور tail عمل میکنه


پایان قسمت دوم از بخش یک 
برای اینکه طولانی شدن مبحث و تغیر در ریشه ی ادامه دستورات خط فرمان
خستتون نکنه ادامه دستورات در قسمت سوم تقدیمتون میشه

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش اول - قسمت سوم

ادامه مبحث دستور های خط فرمان ( مدیریت سیستم لینوکس )
یکی از مهم ترین بخش ها در مدیریت لینوکس ، تحت نظر داشتن عوامل فعال در سیستمه
که ما دستور های مرتبط بهش رو مرور میکنیم

This is the hidden content, please

وقتی یک برنامه روی سیستم اجرا میشه خودش رو به صورت پروسه نشون میده
برای دیدن اینکه چه پروسه هایی روی سیستم فعال هستند ، از دستور ps استفاده میکنیم
که میتونه ضمن نشون دادن پروسه ها اطلاعات مربوط به هرکدومشونم بهمون بده
در اینجا من چند تا از اپشن های جالبش رو مثال میزنم

اپشن A- نمایش تمام پروسه ها
اپشن M- نمایش اطلاعات امنیتی مربوط به پروسه ها
اپشن f- نمایش لیست ( فول فرمت )
اپشن l- نمایش به صورت لانگ لیست ( اطلاعات بیشتر )
اپشن forest-- که یکی از پارامتر های لانگ گنو محصوب میشه ، برای به تصویر کشیدن رابطه بین پروسه ها استفاده میشه

برخی از مقادیری که دستور ps میتونه بهمون بده رو براتون لیست میکنم

This is the hidden content, please

فیلد uid : مربوط به کاربریه که پروسه رو فعال کرده
فیلد pid : کد پی ایدی پروسه ( یک کد منحصر به هر پروسه )
فیلد ppid : اگه یک پروسه از طریق پروسه دیگه ای فعال شده باشه pid پروسه اولیه رو نمایش میده
فیلد stime : سیستم تایمی که پروسه فعال شده
فیلد TTY : نمایش اینکه هر پروسه در کدوم TTY فعال شده
فیلد Cmd : اسم خود برنامه ی هر پروسه

همون طور که دیدید دستور ps در نوع خودش عالی کار میکنه ضمن اینکه پویایی این دستور به مثال کوچیک ما محدود نمیشه
ولی اگه هدف شما زیر نظر گرفتن روند پروسه هاییه که فعالیت منقطع دارن
باید از دستور top استفاده کنید

This is the hidden content, please


دستور top هم مثل ps پروسه ها و اطلاعات برامون لیست میکنه
ولی این کارو در حالت ( real-time ) انجام میده ، که باعث میشه به هدفمون برسیم

اولین بخش خروجی اطلاعات عمومی سیستم رو نمایش میده
خط اول زمان فعلی ، زمانی که سیستم بالا بوده ، تعداد کاربر های لاگین کرده و load average رو نشون میده
خط دوم اطلاعات عمومی پروسه ها رو نشون میده 
مثل : تعداد کل پروسه ها ، چند پروسه فعال وجود داره ، چند پروسه متوقف شدن ، چند پروسه خواب هستن الان و چند پروسه به زامبی تبدیل شدن
زامبی : پروسه هایی که کارشون تموم شده ولی پروسه هایی که اینهارو فعال کرده بودن هنوز هیچ پاسخی بهشون ندادن
خط سوم اطلاعات عمومی در مورد cpu نشون میده
و دو خط اخر هم در مورد وضعیت system memory هستند ، خط اول وضعیت physical memory , و خط دوم swap memory

بخش دوم دستور هم شامل اطلاعات پروسه ها میشه ، مثل دستور ps

 

This is the hidden content, please

از دستور kill و killall برای متوقف کردن پروسه ها استفاده میشه

در مثال اول pid یک پروسه که 3940 هست رو به عنوان مقدار میدیم به دستور تا اون پروسه متوقف شه
در مثال دوم به دستور killall میگیم هر پروسه ای که با http شروع میشه رو متوقف کن

 

This is the hidden content, please

همونطور که قبلا در موردش صحبت کردیم لینوکس تمام فایل سیستم رو در یه دایرکتوری مرجع ( / ) قرار میده 
قبل از اینکه شما بتونید از یک مدیا دیسک استفاده کنید ، باید اونو در سیستم دایرکتوری جا بدید ، که به این کار میگن mounting
که برای این کار به دسترسی روت نیاز دارید
( البته این موضوع مربوط به اون دسته از removable media هایی میشه که به صورت خودکار این عمل براشون اتفاق نمیوفته ، که شامل موارد مرسوم نیست)

با وارد کردن دستور mount به صورت تنها ، لیستی از دیوایس های مونت شده نمایش داده میشه ، به همراه مسیرشون ، نوع فایل سیستمشون و وضعیت سطح دسترسیشون

در مثال اول ما یک فلش مموری رو با نوع فایل سیستم ntfs در ادرس دیوایس و ادرس مدیا ی مشخص شده به ترتیب ، مونت کردیم
البته در حالت پیشفرض فقط همون یوزر روت به مدیا ی مونت شده دسترسی داره ، که میتونه سطح دسترسی رو تغیر بده

در مثال دوم هم از دستور umount هم برای unmount کردن استفاده کردیم

 

This is the hidden content, please


از دستور df برای دیدن فضای خالی تمام دیوایس ها استفاده میکنیم ( اینترنال و اکسترنال )
اپشن h- مقادیر خروجی رو به صورت مگ و گیگ و ... نمایش میده که راحت تر قابل درک باشه

 

This is the hidden content, please

دستور du بر خلاف دستور df مقادیر مربوط به فضای استفاده شده رو نمایش میده
اپشن h- هم همون اپشن مثال قبله

 

This is the hidden content, please

از دستور sort برای مرتب سازی مقادیر استفاده میشه
از اپشن n- برای مرتب سازی بر اساس ترتیب اعداد استفاده میشه
از اپشن M- برای مرتب سازی بر اساس ترتیب ماه های میلادی استفاده میشه ( برای مواقعی که اسم مقادیر دارای نام ماه هستن ، مثل لاگ فایل  ها )
از اپشن r- برای برعکس کردن ترتیب فعلی مقادیر استفاده میشه
و اما ترکیب جالب t- و k- که در مرحله اول یک کاراکتر رو به عنوان جدا کننده انتخاب میکنه و در مرحله دوم بین بلاک های ساخته شده بلاک مورد نظر رو انتخاب میکنه ، در مثال ما سومین بلاک انتخاب شده ، از بین بلاک هایی که کاراکتر ( : ) به وجود اورده

 

This is the hidden content, please

از دستور grep برای جستجو و تعامل با مقادیر و فایل استفاده میکنیم
در مثال اول با مشخص کردن الگوی جستجو root برای فایل passwd به دستور grep میگیم بین مقادیر فایل passwd هر خطی که الگوی مارو داشت نمایش بده
اپشن e- برای مشخص کردن چند الگو استفاده میشه ، تو مثال ما الگو های red و blue مشخص شدن
اپشن v- به دستور میگه تمام مقادیر فایل رو نمایش بده به جز قسمت هایی که الگوی ما رو دارن
اپشن n- شماره خطی که مقدار الگوی مارو داشته هم باهاش نمایش میده
اپشن c- به جای نمایش مقادیر ، تعداد خط هایی که الگوی مارو داشتن رو نمایش میده

 

This is the hidden content, please

از دستور gzip برای زیپ کردن فایل استفاده میشه
از دستور gzcat برای نمایش مقادیر فایل زیپ استفاده میشه
از دستور gunzip برای از زیپ خارج کردن مقادیر استفاده میشه

 

This is the hidden content, please

از دستور tar برای ساخت فایل های فشرده tar استفاده میشه که بخشی از فایل های فشرده مرسوم رو تشکیل میدن
اپشن c- برای ساخت فایل استفاده میشه
اپشن v- برای نمایش فرایند استفاده میشه
اپشن f- برای مشخص کردن فایل خروجی استفاده میشه
اپشن x- برای استخراج مقادیر فایل فشرده استفاده میشه
در مثال اول ما یک فایل فشرده به اسم test.tar میسازیم که مقادیر فولدر های test و test2 رو دریافت کرده
در مثال دوم ما مقدار فایل ساخته شده در مثال اول رو بدون استخراج فایل میبینیم
در مثال سوم فایل رو استخراج میکنیم
در مثال چهارم هم فایل رو استخراج میکنیم ، که البته مربوط به فرمت پیشفرض نیست ، مثلا برای استخراج تربال ها استفاده میشه

 

در ادامه لیست دستورات پر استفاده رو براتون گذاشتم که بخشیش رو تا الان دیدید و بقیش هم در قسمت های بعد با توجه به موضوع بحث اون قسمت میبینید

This is the hidden content, please

 

پایان قسمت سوم از بخش یک

در قسمت بعد وارد مباحث مرتبط با شل میشیم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش اول - قسمت چهارم

الان که تا حدی با دستورات بیسیک خط فرمان اشنا شدید وقتشه مروری بر عمق شل داشته باشیم
که برای درک بهترش باید مروری بر موارد بیسیک کامند لاین اینترفیس ( CLI ) داشته باشیم

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

در این قسمت شما با پروسه شل و به وجود اومدن ساب شل ها و رابطشون با پرنت شل ها اشنا میشید

حتما یادتونه در قسمت های قبل در مورد شل پیشفرض برای هر یوزر صحبت کردیم ، که در پیکربندی هر یوزر این مقدار میتونه متغیر باشه 
( فیلد هفتم از مقادیر فایل passwd که با مقدار bin/bash/ شل پیش فرض یوزر ( اینجا بش ) و ادرسش رو نشون میداد )
وقتی شما در محیط ویژال کنسول لاگین میکنید ، یا وقتی یه ترمینال در محیط گرافیکی باز میکنید ، شل پیشفرضی که توضیح دادم براتون فعال میشه
اما ...
اما این تنها شل پیش فرض سیستم شما نیست
یک شل پیش فرض دیگه وجود داره به اسم دیفالت سیستم شل ، که این شل برای اسکریپت های سیستم استفاده میشه ، مثل اونایی که تو استارت اپ بهشون نیازه
این شل پیش فرض در مسیر bin/sh/ قرار داره

در بعضی لینوکس ها شما مثال زیر رو میبینید که طی اون دیفالت سیستم شل با استفاده از یه لینک رو شل بش تنظیم شده

This is the hidden content, please

 

 البته باید توجه داشته باشید روی همه لینوکس ها ، هم برای دیفالت سیستم شل و هم برای دیفالت اینتراکتیو شل ، یک شل استفاده نمیشه 
و ممکنه هر کدوم از دو شل پیشفرض روی یه شل متفاوت تنظیم شده باشن ، مثل مثال پایین

This is the hidden content, please


تفاوت شل های پیش فرض میتونه منجر بشه به درست کار نکردن اسکریپت ما 
( در صورتی که سیستم دیفالت شل سیستمی که اسکریپت مارو اجرا میکنه ، با شلی که اسکریپت باهاش نوشته شده فرق داشته باشن )

به همین دلیل ما همیشه در اولین خط اسکریپت نوع شلی که قراره اجراش کنه رو مشخص میکنیم ( مربوط به بخش دوم اموزش )

اگرچه شل های پیش فرض قابل تغیرن ،اما  تو حالت عادی هم شما مجبور نیستید از دیفالت شل اینتراکتیو استفاده کنید ، تو همون محیط کنسول میتونید هر شلی رو بخونید تا اون شل STDIN رو دریافت کنه ، ( در بخش دوم با STDIN اشنا میشید ٬ اینجا منظور مقادیر ورودیه ) و از اون لحضه با اون شل کار کنید

به مثال پایین دقت کنید ، تو محیط ترمینال شل دش خونده شده ، به خروجی دستور دقت کنید ، این خروجی به معنی ( هیچی و فاقد خروجی ) نیست
از این لحضه هر دستوری وارد کنید شل دش اون دستور رو میگیره
مثل دستور exit که شل دش گرفت و طبق اون خودش رو بست ، و به همین دلیل ترمینال بسته نشد و شما علامت پرامپت رو میبینید ( که یعنی برگشتید به همون شلی که باهاش شل دش رو خونده بودید )

This is the hidden content, please

 

مروری بر رابطه parent shell با child shell یا همون subshell

شلی که شما بعد از لاگین تو محیط کنسول میگیرید ، یا از ترمینال تو محیط گرافیکی ، شل پرنت یا شل اولیه محسوب میشه 
وقتی شما توی محیط شل یه شل دیگه باز میکنید ( چه مستقیم چه غیر مستقیم )
اون شل ثانویه ، چایلد شل یا ساب شله

بعد از باز کردن یه ساب شل چیز خاصی برای نشون دادن روابط بین شل ها نشون داده نمیشه ، به همین دلیل از دستور ps با اپشن f- استفاده میکنیم
در مثال پایین یه نمونه از خروجی دستور قبل از اجرای ساب شل و بعدش رو میتونید ببینید

This is the hidden content, please

 

به خروجی اولین دستور دقت کنید ، دوتا پروسه رو نشون میده اولی bash- دومی دستور ps 
اگه به ppid ( شماره پروسه ی پرنت ) دستور ps نگاه کنید pid ( شماره پروسه ) بش رو مینید ، که یعنی پروسه مادری که پروسه ی دستور ps از اون نشعت گرفته ، متعلق به بش هستش

با همین تفاسیر در خروجی دومین دستور ps 
( که بعد از دستور bash تایپ شده ، که یعنی داخل شل بش جدیدی که باز شده دستور ps وارد شده ) 
میبینیم که سه پروسه قرار داره ، به ppid دومین پروسه دقت کنید ( شل جدید ) میبینید که مقدار pid اولین پروسه رو داره 1841
که یعنی شل دوم داخل شل اول باز شده و چایلد شل یا ساب شل همون شل اوله
و چون تو شل دوم ps گرفتیم میبینید که pid ساب شلمون ppid دستور ps هستش

وقتی یه ساب شل به وجود میاد ، همه ی ابجکت های محیطیه شل مادر رو نداره
و این ممکنه تو کار با متغیر ها مشکل ایجاد کنه ، که در قسمت متغیر ها بهش میپردازیم

یه ساب شل میتونه خودش هم ساب شل ایجاد کنه که اون ساب شل ثانویه میشه گرند چایلده پرنت چایلده ساب شل اولیه ، و حتی میشه بیشتر رفت پایین
(میشه چندین شل تو همدیگه ساخت ، که با هم در تعامل اند )
به مثال پایین دقت کنید

This is the hidden content, please


هر کدوم از دستورات bash که میبینید داخل دستور قبلی اجرا شده
خروجی دو دستور ps رو با هم مقایسه کنید

 

نگاهی به لیست های دستوری

توی یک خط شما میتونید دستورات مختلف رو جوری لیست کنید که یکی بعد از دیگری اجرا بشن ، این عمل با گذاشتن یک semicolon ( ; ) بین دستورات اتفاق میوفته 
به لیست دستورات و خروجیه به ترتیبشون در مثال زیر دقت کنید

This is the hidden content, please

 

یه فرمت دیگش هم به این صورته

This is the hidden content, please

 

مثال بالا یک کامند لیست بود ، برای ساخت لیست پروسه ها کافیه کامند لیست رو بین پرانتز بزاریم
تفاوت command list  با process list اینه که مقادیر porocess list توی یک ساب شل اجرا میشن
به مثال زیر دقت کنید ، به لیست دستور فقط یک پرانتز اضافه شده ، خروجی هم به نظر فرقی نکرده ، ولی از ریشه یه تغیر بزرگ حاصل شده

This is the hidden content, please

 

برای بهتر دیدن تغیر در خروجی دو مثال بالا ، از یک متغیر محیطی به اسم BASH_SUBSHELL استفاده میکنیم
در صورتی که دستورات توی یک ساب شل اجرا شده باشن مقدار این متغیر 1 میشه ، اگه تو ساب شل اجرا نشده باشن مقدارش 0 میشه
( هر عدد مربوط به عمق شل بر تعداد ساب شل هاست ، جلو تر مثال میزنم )
مثال بالا رو با این متغیر محیطی ببینید :

This is the hidden content, please

 

اینجا ما با دستور echo مقدار $ متغیر رو نمایش میدیم ( عدد 0 خط اخر )
که یعنی دستورات تو ساب شل اجرا نشدن

This is the hidden content, please

 

میبینید که تو این مثال خروجی 1 گرفتیم ، چون process list برای اجرا ساب شل ران کرده

شما میتونید توی process list هم دوباره ساب شل باز کنید ، به مثالش دقت کنید

This is the hidden content, please

 

دقت کنید خروجی مربوط به ساب شل اولین دستور 1 بود ، مثل مثال های قبلی
ولی خروجی دومین دستور 2 بود 
که میگه این دستور تو عمق دو لایه شل اجرا شده ( ساب شل دوم ، در ساب شل اول )

 

استفاده از background mode


حالت بک گراند به شما این فرصت رو میده که وقتی شل در حال اجرای دستوریه که زمان میبره انجامش ، شما منتظر نمونید و همون لحضه بتونید دوباره کنترل شل رو بدست بگیرید
برای اجرای یک کامند در حالت بک گراند تنها کافیه به انتهای دستور & اضافه کنید

This is the hidden content, please

 

مثال بالا دستور sleep رو با مقدار 3000 ثانیه اجرا کرده ( در حالت بک گراند با استفاده از & در انتهای دستور )
و چون دستور در حالت بک گراند اجرا شده ، کنترل شل فورا به دستمون برگشته و تونستیم دستور ps رو اجرا کنیم
( اگه دستور قبلی در بک گراند نبود ، باید سه هزار ثانیه صبر میکردیم تا بتونیم دستور بعدی رو وارد کنیم )
که در خروجی دستور ps میتونیم sleep رو در حال اجرا ببینیمعلاوه بر دستور ps میتونیم از دستور jobs برای دیدن دستورات بک گراند استفاده کنیم 

This is the hidden content, please


میبینید که دستور jobs شماره job number هر job رو به علاوه ی وضعیت اجرا و اسم دستور و مقدار دستورش رو نشون میده


با اپشن l- میتونید pid هر دستور رو هم ببینید

This is the hidden content, please

 

هر زمان یک بک گراند جاب به اتمام برسه ، نتیجش در صفحه اعلان میشه

This is the hidden content, please

 

گذاشتن process list ها در background :


میدونید که process list ها در ساب شل اجرا میشن ، با این روش ما میتونیم ساب شل ایجاد شده رو ببریم در background
مثال زیر هر دو حالت رو به تصویر میکشه

در حالت عادی 

This is the hidden content, please

 

در حالت بک گراند

This is the hidden content, please

 

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

 

انجام co-processing با دستور coproc :


 دستور coproc ساب شل در بک گراند ایجاد میکنه ، و دستورات رو اونجا اجرا میکنه
به ترکیب جالب co-processing با process list در مثال زیر دقت کنید

This is the hidden content, please

 

مروری بر دستورات built-in و external

دستورات external دستوراتی هستند که بیرون از خود شل قرار دارند ، که معمولا در مسیر های زیر هستند

This is the hidden content, please


مثلا دستور ps یه دستور اکسترناله ، شما میتونید محل نگه داریشو با دستورات which و type پیدا کنید

This is the hidden content, please

 

هر موقع یک دستور اکسترنال اجرا بشه ، بدین واسطه یک child process به وجود میاد ، به مثال زیر دقت کنید

This is the hidden content, please

 

خود دستور ps به عنوان یکی از پروسه ها در لیست دیده میشه که مقدار ppid برابر با pid بش هستش ، که یعنی بش به عنوان پرنت ps رو اجرا کرده

و اما دستورات built-in دستوراتی هستند که بخشی از خود شل محسوب میشن و به عنوان child process اجرا نمیشن مثل دستورات cd و exit 

This is the hidden content, please

 

بر خلاف دستورات اکسترنال ، این دستورات جایی بیرون از شل دیده نمیشن
چون برای اجرای دستورات built-in نیازی به child process نیست ، این دستورات سریع تر از دستورات اکسترنال هستند

اما بعضی از دستورات هستند که تلفیقی از این دو نوع محسوب میشن
برای مثال هر دو دستور echo و pwd از این دسته هستند 

This is the hidden content, please


پایان قسمت چهارم از بخش یک
در قسمت پنجم وارد مباحث مرتبط با متغیر ها میشیم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


This is the hidden content, please

بخش اول - قسمت پنجم 

    یکی از عوامل تاثیر گذار در محیط شل متغیر های محیطی هستند , که خیلی از برنامه ها و اسکریپت ها ازشون استفاده میکنن , در این قسمت بیشتر باهاشون اشنا میشید
    در اصل متغیر های محیطی محلی برای نگه داشتن اطلاعات مربوط به سیشن های شل و محیط کاری هستند
    همچنین این امکان رو به شما میدن تا دیتا ها رو در مموری نگه دارید تا به سادگی توسط برنامه ها و اسکریپت های شل قابل دسترسی باشه
    دو نوع متغیر محیطی در بش شل وجود داره , که بهشون میپردازیم


    global variables و local variables

    نگاهی به متغیر های محیطی گلوبال :
    این نوع از متغیر ها هم از درون شل , و هم از درون همه ساب شل های اون قابل رویت هستند 
    در صورتی که نوع لوکال فقط از درون خود شل دیده میشن
    که این موضوع نوع گلوبال رو برای اپلیکیشن هایی که ساب شل اجرا میکنن با استفاده میکنه
    ( ساب شل هایی که اطلاعات مربوط به پرنت شل رو درخواست میکنن )
    وقتی شما سیشن بش رو فعال میکنید سیستم لینوکس چند متغیر محیطی گلوبال براتون ست میکنه , به اسم متغیر های محیطی سیستمی , که تقریبا همیشه از حروف بزرگ برای اسمشون استفاده میکنن , تا از متغیر هایی که یوزر تعریف میکنه قابل تمایز باشن
    برای دیدن لیست متغیر های محیطی گلوبال از دستور های env و printenv استفاده میکنیم

This is the hidden content, please



    در مثال بالا فقط بخشی از خروجی دستور رو براتون گذاشتم
    نه تنها در هنگام لاگین بخشی از متغیر های محیطی گلوبال براتون ست میشه , بلکه نوع لاگین میتونه تایین کننده باشه در انتخابشون


    با دستور printenv
    میتونید مقدار هر کدومشونم ببینید , اکه البته با دستور
    env شدنی نیست

This is the hidden content, please


    که البته با دستور echo هم میتونید این کارو کنید , که باید از علامت $ قبل از اسم متغیر استفاده کنید

This is the hidden content, please

 

    لازمه بدونید استفاده از علامت $ قبل از اسم متغیر فقط به دلیل دیدن مقادیر متغیر نیست , بلکه این امکان رو هم بهتون میده تا از متغیر به عنوان پارامتر یه دستور هم استفاده کنید
    به مثال زیر دقت کنید

This is the hidden content, please

 

    بالا تر گفتیم که این متغیر ها از درون ساب شل هم دیده میشن
    به مثال زیر دقت کنید
  

This is the hidden content, please


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

دستور set لیست تمام متغیر هایی که برای یک پروسه تعریف شدن رو نمایش میده , که شامل نوع گلوبال , لوکال و نوع تعریف شده توسط یوزر (user-defined) میشه , در مثال زیر بخشی از خروجی دستور رو براتون گذاشتم

This is the hidden content, please


    نحوه تعریف متغیر های  user-defined
    بعد از ران کردن بش شل شما مجازید متغیر های خودتونو تعریف کنید
    برای تعریف متغیر کافیه اسم منتخب رو همراه با علامت = و مقدار متغیر , بدون هیچگونه فاصله کنار هم بزارید
به مثال زیر دقت کنید

This is the hidden content, please


    در صورت وجود فاصله فرایند به مشگل میخوره , مثل :

This is the hidden content, please


    اگه خواستید مقدار متغیر رو رشته ای قرار بدید که حاوی فاصله هم باشه , باید رشته رو بین تک یا دابل کوتیشن بزارید , مثال زیر :
    

This is the hidden content, please


    بدون کوتیشن شل تصور میکرد کلمه بعد از فاصله دستور بعدی شله
    دقت کنید متغیری که ما تعریف کردیم بر خلاف مثال های قبلی با حروف کوچیکه , چون متغیر های سیستمی با حروف بزرگ تعریف شدن هر موقع خواستید متغیری با اسم حروف بزرگ تعریف کنید باید مواضب تشابه اسمی باشید


    وقتی یه متغیر لوکال تعریف میکنید , در هر جایی در داخل پروسه شل خودتون قابل دستیابیه , مشگل زمانی پیش میاد که یه ساب شل ران بشه
    به مثال زیر توجه کنید

This is the hidden content, please


    همونطور که دیدید متغیری که تو پرنت شل تعریف شده بود از داخل ساب شل قابل دسترس نبود
    این موضوع در مورد حالت برعکس این مثال هم صدق میکنه , مثال زیر :

This is the hidden content, please


    میبینید که مقدار خروجی خط خالی قرار گرفته نه مقدار متغیر , چون در این سطح همچین متغیری وجود نداره


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


    این کار با استفاده از دستور export و نام متغیر بدون علامت $ انجام میشه , مثال زیر :

This is the hidden content, please


    دقت کنید که تغیر مقدار یک متغیر گلوبال که در پرنت شل تعریف شده از داخل ساب شل شدنی نیست , مثال زیرو ببینید

This is the hidden content, please


    طبق این مثال متوجه میشید که دستورات از بالا به پایین منتقل میشن , نه برعکس
    ساب شل فقط تونست یه متغیر با اون اسم داخل خودش تعریف کنه
       اکسپورت کردن هم از همین اصل تبعیت میکنه , یه متغیر از بالا اکسپورت میشه که از پایین قابل دسترسی باشه , نه برعکس , مثال زیرو ببینید

This is the hidden content, please


    برای از بین بردن متغیر ها هم باید از دستور unset و نام متغیر بدون علامت $ استفاده کنید

This is the hidden content, please


    میبینید که خروجی خط خالی داد
    که البته طبق اصلی که توصیح دادم , از ساب شل نمیشه تو پرنت شل تغیر ایجاد کرد
    مثال زیر رو ببینید

This is the hidden content, please


    میبینید که فقط توی ساب شل از بین رفت


    متغیر های محیطی پیش فرض شل :
    

    شل بش متغیر های مشخصی رو به صورت پیش فرض قرار میده تا محیط سیستم رو تعریف کنن
    که میتونن برامون مفید باشن , در لیست زیر متغیر هایی رو که بش فراهم میکنه میتونید ببینید

  

This is the hidden content, please

     علاوه بر متغیر های بالا , خود بش هم تعدادی از این متغیر ها توسط خودش تعریف میکنه
    

This is the hidden content, please


    پایان قسمت پنجم از بخش یک
    در قسمت بعد استارت اپ ها و ارایه ها رو توضیح میدم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش اول - قسمت ششم


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

This is the hidden content, please


    فایل /etc/profile استارت اپ فایل اصلی پیش فرضه
    تمام یوزر های سیستم این فایل رو موقع لاگین اجرا میکنن
    لازمه بدونید بعضی از لینوکس ها از 
    pluggable authentication modules  =  PAM
    استفاده میکنن , که در این صورت قبل از اینکه شل بش اجرا بشه پروسه pam file اجرا میشه که باعث تغیر در حالت پیش فرض اجرای استارت اپ ها میشه  

    یک نمونه از محتویات این فایل رو در کادر زیر میبینید

This is the hidden content, please


    هر نوع از لینوکس تنظیمات مختلفی رو در این فایل اعمال میکنه
    مثلا در این نمونه فایلی که با اسم  /etc/bash.bashrc. شناخته شده , حاوی لیست متغیر های موقعیتی هستش


    توجه کنید در مثال پایین از فایل /etc/profile که متعلق به CentOS distribution هستش , به فایلی با اسم  /etc/bash.bashrc اشاره ای نشده

This is the hidden content, please

 

    از بین بقیه فایل های استارت اپ اکثر لینوکس ها فقط یکی دوتاشون رو مورد استفاده قرار میدن

This is the hidden content, please


    دقت کنید که هر چهار فایل با نقطه شروع میشن , که باعث میشه مخفی باشن
    به خاطر اینکه این فایل ها در دایرکتوری هر یوزر هستند , هر یوزر میتونه فقط فایل های خودش رو تغیر بده و متغیر های خودش رو اضافه کنه , که برای هر سیشن بشی که اجرا کنه فعال باشن
  

    ارایه ها :
    نکته جالب در مورد متغیر های محیطی اینه که میتونن به عنوان ارایه هم مورد استفاده قرار بگیرن
    یک ارایه , متغیریه که میتونه چند مقدار رو نگه داره
    برای ایجاد چند مقدار برای یک متغیر (تبدیل به ارایه) فقط کافیه اونارو بین پرانتز قرار بدید و با فاصله از هم جداشون کنید

This is the hidden content, please


    روش مشاهده مقادیر ارایه ها با متغیر ها متفاوته
    شما نمیتونید مقدار ارایه هارو با روش متغیر ها نمایش بدید

 

This is the hidden content, please


    تنها اولین مقدار از ارایه نمایش داده شد
    برای دیدن بخش مورد نظر از ارایه , از روش زیر تبعیت میکنیم

This is the hidden content, please


    به دلیل اینکه مقادیر ارایه از شماره صفر شروع میشن , شماره جایگاه سومین مقدار میشه 2
    برای دیدن تمام مقادیر ارایه از * استفاده میکنیم

This is the hidden content, please


    شما میتونید حتی فقط مقدار مورد نظرتونو تغیر بدید

This is the hidden content, please


    میبینید که مقدار جایگاه شماره 2 به seven تغیر کرد

    شما حتی میتونید با استفاده از دستور unset مقدار مورد نظر رو حذف کنید

This is the hidden content, please

اگه دقت کرده باشید متوجه میشید که مقدار جایگاه شماره 2 پاک شده و خودش تغیر نکرده


    شما میتونید طبق مثال زیر تمام ارایه رو حذف کنید

This is the hidden content, please

 


    پایان قسمت ششم از بخش یک
    در قسمت بعد وارد موضوعات مرتبط با یوزر میشیم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش اول - قسمت هفتم


    هیچ سیستمی کاملا خالی از امنیت نیست , باید حتما مکانیزمی  برای محافظت از فایل ها در برابر تغیر و دسترسی غیر مجاز باشه
    سیستم لینوکس از روش یونیکس برای مجوز دسترسی استفاده میکنه
    اجازه دسترسی تقسیم بندی شده برای یوزر ها و گروه ها بر مبنای تنظیمات هر فایل یا دایرکتوری
    هسته سیستم امنیتی لینوکس یوزر اکانته , میزان دسترسی کاربران سیستم به ابجکت های مختلف بستگی به یوزری داره که باهاش لاگین میکنن
    سیستم لینوکس از فایل های خاصی برای مدیریت یوزر اکانت ها استفاده میکنه , قبل از اینکه در مورد  پرمیشن ها صحبت کنیم لازمه بدونیم لینوکس چجوری یوزر اکانت هارو هندل میکنه


    The /etc/passwd
    سیستم لینوکس برای همخونی دادن login name و uid از این فایل استفاده میکنه , این فایل حاویه هفت بخش اطلاعاتیه , یک نمونشو پایین میبینید

This is the hidden content, please


    یوزر root مدیر سیستم لینوکسه و همیشه مقدار uid صفر رو داره
    میبینید که سیستم لینوکس اکانت های زیادی رو ساخته که در واقع یوزر واقعی نیستن و برای مقاصد سیستمی استفاده میشن که بهشون میگن سیستم اکانت
    سیستم اکانت در اصل یک اکانت مخصوصه که سرویس ها روی سیستم ران میکنن تا به منابع روی سیستم دسترسی پیدا کنن
    تمام سرویس هایی که در حالت بک گراند ران میشن نیاز دارن تحت یک سیستم اکانت به سیستم لاگین بشن 
    اکثر لینوکس ها به سیستم اکانت ها uid زیر 500 میدن (مثال بالا رو ببینید)
    و uid یوزر هارو از 500 شروع میکنن (مثال بالا)


    فیلد های فایل /etc/passwd شامل موارد زیر هستند


    یوزرنیم لاگین

    پسورد یوزر

    مقدار uid یوزرم

    قدار gid یوزر

    مشخصات یوزر

    لوکیشن دایرکتوری home یوزر

    و مقدار اخر هم نوع شل یوزره


    مقدار x که در فیلد پسورد قرار گرفته به معنی پسورد یوزر نیست , سال ها پیش لینوکس پسورد هارو به صورت رمزنگاری شده تو این فیلد میذاشت , که چون خیلی از برنامه ها برای اطلاعات یوزر به دسترسی به این فایل نیاز داشتن , این موضوع یک مشگل امنیتی محسوب میشد
    الان اکثر لینوکس ها پسورد یوزر هارو تو یه فایل جدا به اسم etc/shadow/ قرار میدن
    که فقط برنامه های مخصوصی مثل لاگین بهش دسترسی دارن


    The /etc/shadow
    از این فایل برای نگهداری پسورد ها و اطلاعات مربوط بهشون استفاده میشه
    فقط یوزر root میتونه به این فایل دسترسی داشته باشه
    که باعث میشه امنیت بیشتری نسبت به /etc/passwd داشته باشه
    این فایل برای هر یوزر یه رکورد نگه میداره (مثال زیر)

This is the hidden content, please


    هر رکورد 9 تا فیلد داره , که با هم به ترتیب مرورشون میکنیم
    اسم لاگین
    پسورد به صورت رمزنگاری شده
    اخرین تاریخی که پسورد تغیر کرده
    حداقل روز های موندگاریه پسورد قبل از امکان تغیر
    تاریخ انقضای پسورد
    چند روز قبل از منقضی شدن پسورد هشدار داده بشه
   تعداد روز هایی که , بعد از منقضی شدن پسورد اکانت باید غیر فعال بشه
    تاریخ مربوط به اینکه از چه زمانی اکانت غیر فعال شده
    فیلدی که برای استفاده در اینده تعبیه شده


    در مثال بالا شما شش فیلد فعال میبینید , که حالت نرماله و به ترتیب شش توصیف اول هستن


    اضافه کردن یوزر :
    برای این کار از دستور useradd استفاده میکنیم
    این دستور یک راه ساده برای اضافه کرن یوزر بهمون میده , که از تلفیق مقادیر پیش فرض سیستم و پارامتر های خط دستور برای تعریف یوزر استفاده میکنه
    این مقادیر پیش فرض سیستمی در مسیر زیر قرار دارن
etc/defualt/useradd/
    که برای دیدنشون میتونید از پارامتر D- استفاده کنید ، به مثال زیر توجه کنید :

This is the hidden content, please

 

پارامتر  D- به ما میگه اگه از مقادیر مخصوص خومون موقع ساخت اکانت استفاده نکنیم , به صورت پیش فرض چه جایگزینی براشون در نظر گرفته میشه


    طبق مثال بالا این مقایر به ترتیب میگن که :
    یوزر جدید اضافه میشه به گروه مرسوم با گروپ ایدی 100
    یوزر جدید یک هوم اکانت در دایرکتوری هوم با اسم خودش اضافه میکنه
    یوزر جدید بعد از منقضی شدن پسورد غیر فعال نخواهد شد
    یوزر جدید بعد از مدت زمان معینی منقضی نخواهد شد
    یوزر جدید از شل بش به عنوان شل پیش فرض استفاده خواهد کرد
    سیستم محتوای etc/skel/ رو در دایرکتوری هوم یوزر اضافه میکنه
    سیستم یک فایل در دایرکتوری میل برای یوزر میسازه , تا ایمیل هاشو دریافت کنه


    مقادیر /etc/skel در برخی لینوکس ها :
 

This is the hidden content, please


    شما باید این فایل هارو از قسمت های قبل بشناسید , اینها همون فایل های استاندارد استارت اپ هستند
    شما میتونید این موضوع رو با ساخت یک یوزر اکانت با مقادیر پیش فرض تست کنید

This is the hidden content, please


    در حالت دیفالت دستور useradd دایرکتوری home رو نمیسازه
    که اپشن m- باعث میشه این کارو برامون بکنه


    میبینید که محتوای etc/skel/ در هوم دایرکتوریه جدید هستش
    شما میتونید هنگام ساخت یوزر اکانت هر کدوم از مقادیر پیش فرض رو که خواستید تغیر بدید 


    c comment-

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

    d home_dir- 
    برای جایگزین کردن اسم دایرکتوری با مقدار پیش فرض استفاده میشه

    e expire_date-
    برای تعین تاریخ انقضا اکانت استفاده میشه 

    f inactive_days-
    مشخص میکنه چه مدت بعد از منقضی شدن پسورد اکانت غیر فعال بشه 

    g initial_group- 
    برای مشخص کردن گروپ ایدی یوزر استفاده میشه

    G group-
    برای تعین چند گروه برای یوزر استفاده میشه

    k-
    همراه با m- استفاده میشه , برای کپی کردن مقادیر etc/skel/ تو هوم دایرکتوری

    m-
    برای ساخت هوم دایرکتوری استفاده میشه

    n-
    برای ایجاد یک گروه جدید هم اسم با خود یوزر , برای یوزر استفاده میشه

    r-
    برای ساخت اکانت های سیستمی استفاده میشه

    p passwd- 
    تعین پسورد پیش فرض یوزر

    s shell- 
    تعین شل پیش فرض یوزر

    u uid-

    تعین یک uid مشخص برای یوزر


    طبق چیزی که گفته شد میتونید مقادیر پیش فرض رو در هنگام ساخت یوزر اکانت برای یوزر تغیر بدید
    و یا , میتونید خود حالت پیش فرض رو تغیر بدید
    در این صورت هر اکانت دیگه ای که بسازید با مقایر پیش فرضی که شما تعین کردید ساخته میشه
    برای این کار باید پارامتر D- رو قبل از پارامتر های اصلاحی زیر 
    بزارید
    b default_home- 
    تغیر لوکیشن پیش فرض هوم دایرکتوری
    e expiration_date-
    تغیر مقدار زمان پیش فرض برای منقضی شدن اکانت 
    f inactive- 
    تغیر مقدار زمان پیش فرض برای غیر فعال شدن اکانت بعد از منقضی شدن پسوردش
    g group- 
    تغیر gid پیش فرض
    s shell- 
    تغیر لاگین شل پیش فرض

    به مثال زیر توجه کنید

This is the hidden content, please


    در این مثال مقدار شل پیش فرض برای تمام اکانت هایی که از این به بعد ساخته بشن تغیر کرد


    remove کردن یوزر  

 برای از بین بردن یک اکانت میتونیم از دستور userdel استفاده کنیم
    در حالت پیش فرض این دستور فقط اطلاعات یوزر رو از فایل /etc/passswd پاک میکنه
    اگه از پارامتر r- استفاده کنید
    هوم دایرکتوری و دایرکتوری ایمیل هم پاک میشن
    اگرچه در بعضی لینوکس ها بقیه فایل های اکانت از بین رفته  ، باقی میمونن
    به مثال زیر توجه کنید
 

This is the hidden content, please

 

پایان قسمت هفتم از بخش یک

در قسمت بعد به اصلاحات یوزر و کار با گروه ها و سطح های دسترسی (permissions) میپردازیم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


  • RT3N این موضوع را پین کرد

بخش اول - قسمت هشتم

  (قسمت اخر از بخش اول)  


    تغیرات اصلاحی یوزر اکانت

    لینوکس ابزار های مختلفی برای تغیرات در یوزر ها در اختیارمون میذاره , مثل :


    usermod
    برای تغیرات در فیلد های اکانت یوزر ازش استفاده میکنیم

    passwd
    برای تغیر پسورد یوزر کاربرد داره

    chpasswd
    این دستور با دریافت یک فایل متنی حاوی یوزر ها و پسورد انتخوابی , پسورد تمام یوزر هارو تغیر میده

    chage
    برای تغیر تاریخ انقضای پسورد کاربرد داره

    chfn
    برای تغیر کامنت اطلاعات یوزر استفاده میشه

    chsh
    برای تغیر شل پیش فرض یوزر استفاه میشه

 

    دستور usermod

    اپشن های این دستور باعث تغیر در بیشتر فیلد های فایل /etc/passwd میشن و اپشن ها مشابه اپشن های دستور useradd هستند 


    اپشن هایی مثل c , -e , -g-


    چند تا از اپشن های متفاوتش رو براتون میزارم

    l-
    تغیر اسم لاگین یوزر 

    L-
    قفل کردن یوزر اکانت , بنابراین یوزر نمیتونه لاگین کنه

    p-
    تغیر پسورد یوزر 

    U-
    باز کردن قفل یوزر 

 

    passwd و chpasswd

    دستور passwd
    یک راه سریع برای تغیر فقط پسورده

This is the hidden content, please


    اگه دستور رو به صورت خالی وارد کنید , پسورد یوزر فعلی عوض میشه
    اکه با اسم یوزر وارد کنید , پسورد اون یوزر عوض میشه (البته اگه روت باشید)
    با استفاده از اپشن e- میتونید یوزر رو مجبور به تغیر پسوردش کنید


    در صورت نیاز به تغیر پسورد دسته جمعی میتونید از chpasswd به صورت زیر استفاده کنید

This is the hidden content, please

 

    در فایل متنی اسم های لاگین همراه با پسورد هاشون قرار میگیرین
    که با استفاده از ( : ) از هم جدا شدن , مثل : user:password
    

    chsh , chfn و chage

    دستور chsh طبق مثال زیر برای تغیر شل پیش فرض استفاه میشه

This is the hidden content, please


    دستور chfn یک روش استانارد برای ذخیره اطلاعات در فیلد کامنت در فایل passwd فراهم میکنه
    که به جای اطلاعات معمول از اطلاعات مخصوص استفاده شده در یونیکس فینگر استفاه میکنه


    دستور finger به شما اجازه میده به راحتی در مورد یوزر ها اطلاعات کسب کنید

This is the hidden content, please


    البته به خاطر نگرانی های امنیتی در بیشتر لینوکس ها دستور فینگر غیر فعال شده

    یک نمونه از دستور chfn رو بدون پارامتر در مثال زیر میبینید

This is the hidden content, please

 

This is the hidden content, please


    حالا به مقدار فایل /etc/passwd نگاه کنید

This is the hidden content, please


    دستور chage مقادیر مرتبط با پسورد هارو دریافت و تنظیم میکنه


    d-
    مشخص کرن زمان اخرین تغیر پسورد

    E-
    مشخص کردن تاریخ انقضای پسورد

    I-
    مشخص کردن زمان غیر فعال شدن اکانت بعد از منقضی شدن پسورد

    m-
    مشخص کردن حداقل روز های ثابت موندن پسورد بعد از هر تغیر

    W-
    مشخص کرن تعداد روز هایی که قبل از منقضی شدن پسورد باید هشدار داده بشه


    گروه ها در لینوکس :

    گروه ها هم یکی دیگه از موضوعات امنیتی لینوکس هستن
    لینوکس ها با روش های مختلفی بحث گروه پیض فرض رو پیش میبرن
    بعضی از لینوکس ها یک گروه پیش فرض برای همه کاربر ها تعریف میکنن
    اگه سیستم شما هم همینکار رو میکنه باید مراقب باشید چون فایل هاتون ممکنه برای کاربرای دیگه هم قابل استفاده باشه
    بقیه لینوکس ها برای هر کاربر یک گروه جدا تعریف میکنن که از این مشگل امنیتی جلوگیری بشه
    هر گروه اسم خودش و یک کد منحصر به فرد داره که بهش میگیم gid
    شما میتونید از ابزار هایی برای اینجاد و مدیریت گروه خودتون استفاه کنید


    فایل /etc/group

    درست مثل یوزر اکانت ها , اطلاعات گروه ها هم در یک فایل نگه داری میشه
    این فایل شامل اطلاعات مربوط به هر گروه میشه که در مثال زیر یک نمونش رو میتونید ببینید


  

This is the hidden content, please


    مثل uid ها gid ها هم از الگوی خاصی تبعیت میکنن
    گروه هایی که برای اکانت های سیستمی در نظر گرفته میشه gid زیر 500 دارن و gid یوزر گروه ها از 500 شروع میشه


    محتوای فایل /etc/group از چهار فیلد تشکیل شدن , که به ترتیب :

    اسم گروه
    پسورد گروه
    gid گروه
    لیست یوزر هایی که به گروه تعلق دارن


    گرچه این موضوع مرسوم نیست ولی یوزر ها با استفاده از پسورد گروه میتونن عضو اون گروه بشن


    ایجاد گروه جدید :

    با استفاده از دستور groupadd شما میتونید گروه جدید اضافه کنید

This is the hidden content, please


    وقتی یک گروه جدید میسازید هیچ یوزری در حالت دیفالت عضوش نیست

    برای اضافه کردن یوزر بهش از دستور usermod استفاده کنید

This is the hidden content, please


    و همچنین با دستور groupmod میتونید مقادیر رو اصلاح کنید 
    مثل پارامتر های -n و -g که برای تغیر اسم و gid استفاده میشن

This is the hidden content, please


        فایل پرمیشن ها :

    الان که با یوزر ها و گروه ها اشنا شدید وقتشه بریم سمت فایل پرمیشن ها , که قبلا اونارو در لیست فایل ها و دایرکتوری ها در کنار بقیه مشخصات مشاهده کردید

This is the hidden content, please


    اولین فیلد در لیست بالا پرمیشن های فایل ها و دایرکتوری هارو مشخص میکنه
    و اولین کاراکتر در فیلد هم نوغ اون ابجکت رو مشخص میکنه

This is the hidden content, please


    بعد از اون شما سه تا ست سه تایی میبینید
    که هر کدوم از ست های سه کاراکتری یک سطح دسترسی رو مشخص میکنن

This is the hidden content, please


    اگه یکی از پرمیشن ها گرفته شده باشه به جاش دش قرار میگیره ( - )

    سه تا ست به معنای سه سطح امنیتی برای ابجکته
    ست اول , برای صاحب ابجکته
    ست دوم , برای گروهیه که ابجکت بهش تعلق داره
    ست سوم , برای بقیه یوزر هاست

This is the hidden content, please

 

    مثلا نمونه بالا نشون میده که :

    اولا ابجکتمون فایله , چون اولین کاراکتر دش هستش ( - )

    سه کاراکتر بعدی که متعلق به صاحب فایله میگه که یوزر هر سه اجازه ( خواندن , نوشتن , اجرا ) فایل رو داره
    سه کاراکتر بعدی یا همون ست دوم میگه که گروه فایل هم همون دسترسی هارو داره
    ولی ست اخر که برای سایر یوزر هاست پرمیشن نوشتن رو نداره


    پرمیشن های پیش فرض :

    پرمیشن های پیش فرض از طریق umask اعمال و نگه داری میشن

This is the hidden content, please


    فایل با استفاده از سطح دسترسی پیشفرضی که برامون مشخص شده ساخته شد


    دستور umask پرمیشن های پیش فرض رو مشخص و نمایش میده

This is the hidden content, please


    اولین عدد مشخص شده یک موضوع امنیتیه , به اسم sticky bit
    سه عدد بعدی مربوط به پرمیشن ها میشه

    برای اینکه معادل عددی پرمیشن ها اینجا استفاده میشن نگاهی به جدول زیر بندازید

This is the hidden content, please


    به نحوه کارکرد umask  و مقداری که به دستور میدیم در مثال زیر دقت کنید و برای درک بهتر با جدول بالا مقایسه کنید

    میبینید که اولا مقدار دسترسی ای که به دستور میدیم از فایل گرفته میشه نه اینکه اون مقدار ست بشه

و اینکه این مقدار از عدد شش کم شده نه هفت

This is the hidden content, please


    توجه داشته باشید که مقدار تعریف شده روی دایرکتوری ها هم تاثیر داره

  

This is the hidden content, please

 

    زمانی که لازم باشه مقدار سطح دسترسی یه ابجکت رو مستقیم تغیر بدیم از دستور chmod به شکل زیر استفاده میکنیم

This is the hidden content, please


    میبینید که برخلاف مثال حالت پیشفرض , اینجا دقیقا سطح دسترسی ای که به دستور دادیم اعمال شده

    شما میتونید با استفاده از دستور chown مالکیت یوزر و گروه یک ابجکت رو تغیر بدید

    مثال زیر یوزر فایل رو تغیر میده

This is the hidden content, please


    مثال زیر هم یوزر و هم گروه فایل رو تغیر میده

This is the hidden content, please


    مثال زیر فقط گروه فایل رو تغیر میده , به کاراکتر دات دقت کنید

This is the hidden content, please

  

    البته برای تغیر فقط گروه فایل , میتونید از دستور chgrp هم استفاه کنید    

This is the hidden content, please


    اشتراک فایل ها :

    همونطور که تا الان حدس زدید ایجاد گروه ها راهی برای به اشتراک گذاشتن سطح دسترسی به فایل هاست و به عنوان اشتراک گذاری کاربرد داره

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

    شما یا باید پرمیشن های فایل رو تغیر بدید
    یا باید گروه پیش فرض فایل رو تغیر بدید به گروهی که یوزرا اونجان
    این موضوع میتونه ازاردهنده باشه اگه شما بخواید موارد زیادی رو بسازید و به اشتراک بزارید , که خوشبختانه راه حل مناسبی داره


    سه بیت دیگه هست که لینوکس برای هر فایل و دایرکتوری ذخیره میکنه :

    (The set user id (SUID
    وقتی یک فایل توسط یک یوزر اجرا میشه , برنامه تحت پرمیشن صاحب فایل اجرا بشه

    (The set group id (SGID
    برای فایل : وقتی یک فایل اجرا میشه برنامه تحت پرمیشن گروه فایل عمل کنه , برای دایرکتوری : اگه فایلی داخل دایرکتوری ساخته شد , از گروه دایرکتوری به عنوان گروه پیش فرض استفاده کنه 

    The sticky bit
    فایل بعد از پایان پروسه در مموری باقی بمونه


    بیت SGID برای اشتراک گذاری با اهمیته ,  با فعال کردن این بیت میتونید تمام فایل هایی که در دایرکتوریمون ساخته میشن رو مجبور کنید تا در گروه دایرکتوری قرار بگیرن

    هر کدوم از سه مورد ذکر شده مثل بحث پرمیشن ها با کد شناخته میشن , و این همون عدد اول از چهار عدد umask هستش

    در لیست زیر نمونه کد ها و معانیشون رو میتونید ببینید


    0
    هیچ کدوم از بیت ها ست نشده
    1
    sticky bit ست شده
    2
    SGID bit ست شده
    3
    SGID & sticky bit ست شدن  
    4
    SUID bit ست شده

    5
    SUID & sticky bit ست شدن
    6
    SUID & SGID ست شدن
    7
    همه بیت ها ست شدن


    برای ساخت یک دایرکتوری مخصوص اشتراک گذاری تنها نیاز دارید بیت  SGID  برای دایرکتوری ست بشه

This is the hidden content, please


    پایان قسمت هشتم از بخش اول
    پایان بخش اول

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت اول

در بخش اول درمورد مقدمات و موارد مرتبط با اسکریپتینگ صحبت کردیم , حتی ممکنه به نظر برسه بعضی جاها یکم هم در حال دور شدن از بحث اصلیمون بودیم , ولی جلوتر که بریم متوجه کنترل بیشترتون روی مباحث میشید , معتقد بودم با این روش میتونم روی پیشرفت سطح بخش های بعدی و کنترل شما در یادگیری تعادل برقرار کنم , امیدوارم با پیشروی در بخش دوم این موضوع قابل لمس بشه


    استفاده از چندین دستور :

    یکی از عناصر ماهیت اسکریپتینگ به طور ساده میشه قابلیت استفاده از چندین دستور , و یا استفاده از خروجی یک پروسه یا دستور به عنوان ورودی یه دستور دیگه , شل به شما این اجازه رو میده تا زنجیره وار دستورات رو در یک مرحله اجرا کنید
    برای اجرای همزمان دستورات با هم تنها کافیه اونها رو با هم در یک خط نوشته و با ( ; ) از هم جدا کنید , مثل :

This is the hidden content, please


    شما اولین شل اسکریپتتون رو نوشتید , در خط اول خروجی اولین دستور و در سه خط بعد خروجی دومین دستور چاپ شده , طبق ترتیبی که دستورات نوشته شدن

    با این روش شما میتونید دستورات رو تا 255 کاراکتر در هر خط بنویسید
    که با نوشتن تو یک فایل و اجرای اون دیگه لازم نیست هر بار این عمل تکرار بشه


    ساخت فایل اسکریپت :

    وقتی شروع به ساخت فایل شل اسکریپت میکنید , در وحله اول نیاز دارید تعین کنید فایل با کدوم شل خونده بشه , که این کار رو در اولین خط شل اسکریپتمون انجام میدیم , با استفاده از کد زیر :

This is the hidden content, please


    در یک خط نرمال شل اسکریپت از کاراکتر # برای مشخص کردن توضیحات استفاده میشه و کد های بعد از اون قدرت اجرایی ندارن , هرچند اولین خط از شل اسکریپتمون بحثش جداست

همین موضوع باعث میشه شما حتی اگه توی یک شل دیگه اسکریپت رو اجرا کنید با توجه با مقدار خط اول اسکریپت ما با شل بش اجرا بشه
    بعد از مشخص کردن نوع شل , دستورات خط به خط نوشته میشه و از # هم برای کامنت ها استفاده میکنیم

This is the hidden content, please


    که البته طبق دستورالعمل مثال اول میتونید دستورات رو پشت سر هم بنویسید
    حالا اسکریپت رو تو یه فایل به اسم test1 ذخیره میکنیم
    تقریبا کار تمومه , فقط برای اجرای شل اسکریپتتون باید به نکات زیر توجه داشته باشید

    اگه مثل دستور ها بخواید اجراش کنید نتیجه نمیگیرید , مثال زیر :

This is the hidden content, please


    در این حالت شل فایل اسکریپتمون رو یه دستور قلمداد میکنه , و برای اجرای دستور میره سراغ پیدا کردنش , که محتوای متغیر PATH رو چک میکنه و چون در فایل ادرس چنین دستوری پیدا نمیشه ارور دستور پیدا نشد رو بهمون میده

This is the hidden content, please


    برای پیدا کردن اسکریپت توسط شل دو راه وجود داره

    یا باید ادرس دایرکتوری ای که اسکریپت اونجاست رو به متغیر PATH اضافه کنیم 

    یا باید مستقیما مسیر اسکریپت رو به خود شل بگیم
    در مثال زیر ما از روش دوم استفاده میکنیم
    اگه یادتون بیاد گفته بودیم برای مشخص کردن مسیر فعلی میتونیم از یک دات به صورت تکی استفاده کنیم , مثال زیر :

This is the hidden content, please


    میبینید که شل , اسکریپتمون رو پیدا کرد

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

This is the hidden content, please
This is the hidden content, please


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


    نمایش پیام ها :

This is the hidden content, please


    در صورت استفاده از کوتیشن در متن باید رشته رو بین کوتیشن دیگه ای گذاشت :

This is the hidden content, please

 

استفاده از echo در اسکریپتمون :

 

This is the hidden content, please


    بعد از اجرای اسکریپت بالا :

This is the hidden content, please


    استفاده از متغیر ها :

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

    شما قبلا با متغیر های محیطی اشنا شدید , میتونید از مقادیری که نگه میدارن در اسکریپت استفاده کنید

This is the hidden content, please


    مقدار متغیر های محیطی  USER  &  $UID  &  $HOME$ برای نمایش اطلاعات استفاده شدن

This is the hidden content, please


    برای غیر فعال کردن کاراکتر های عملگرا از بک اسلش استفاه میکنیم

This is the hidden content, please


    در غیر این صورت شل مقدار بعد از $ رو اسم متغیری تصور میکرد که ما قصد نمایش مقدارش رو داریم

    توجه کنید شل برای اسم متغیر ها به حروف کوچیک و بزرگ حساسه

    و شل خودکار نوع مقدار هر متغیر رو تشخیص میده

    

This is the hidden content, please


    شما میتونید حتی مقدار یک متغیر رو به عنوان مقدار به یک متغیر دیگه بدید

This is the hidden content, please


    توجه کنید ما با علامت $ مقدار رو مشخص کردیم , وگرنه اسم متغیر به عنوان رشته مقدار دهی میشد , مثال زیر :

This is the hidden content, please


    اختصاص خروجیه دستور به متغیر :

    این قابلیت یکی از کارامد ترین موارد شل اسکریپت هستش , فرمت و مثال :    

This is the hidden content, please


    یه مثال کاربردی تر :

This is the hidden content, please


    در اسکریپت بالا دستور دیت با فرمت عددی (دریافت خروجی به صورت روز ماه سال جمعا شش رقم) اجرا شده و خروجی دستور به متغیر امروز داده شده , سپس مقادیر دایرکتوری با اطلاعاتشون لیست شدن و خروجی دستور به جای نمایش , در یک فایل ریخته شده , که اخر اسم اون فایل مقدار متغیرمون قرار گرفته

    نکته مهم در مورد این قابلیت اینه که وقتی از این روش استفاده میکنید , دستور در ساب شل اجرا میشه و این باعث میشه به متغیر های لوکال اسکریپت دسترسی نداشته باشه , حواستون باشه که در صورت لزوم متغیر رو ارتقا بدید


    هدایت خروجی :

    ساده ترین حالت هدایت , فرستادن خروجی یک دستور به فایل هستش

    که شل بش از علامت بزرگتر برای این موضوع استفاده میکنه :

This is the hidden content, please


    اگه فایل مقصد از قبل وجود داشته باشه , خروجی روی اون فایل نوشته میشه :
 

This is the hidden content, please


    هدایت ورودی :

    در این حالت برعکس موضوع قبل از علامت کوچکتر استفاده میشه

    که به جای اینکه خروجی یک دستور به فایل هدایت بشه , محتوای یک فایل به عنوان ورودی به دستور هدایت میشه :

This is the hidden content, please


    در مثال بالا دستور فایل رو به عنوان ورودی دریافت کرده و مقدارش رو شمرده , که میگه 2 خط و 11 کلمه و 60 بایت در فایل وجود داره

    روش بعدی ، هدایت ورودی اینلاین نام داره
    که شما مقادیری مثل محتوای یک فایل رو بدون استفاده از فایل مستقیم به خود شل میدید , فرمت و مثال :

This is the hidden content, please



    پایان قسمت اول از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش دوم - قسمت دوم


    استفاده از پایپ ها :

    بعضی وقتا شما نیاز دارید خروجی یک دستور رو به عنوان ورودی به یک دستور دیگه بدید
    این کار از طریق هدایت خروجی و ورودی که قبلا گفتیم شدنیه ولی راه اصلی نیست

This is the hidden content, please


    راه اصلی استفاده از پایپ ها یا همون روش پایپینگه , فرمت و مثال :

This is the hidden content, please

 
    میبینید که خروجی همونه , در این حالت خروجی دستور اول ورودی دستور دومه

    برای پایپینگ میتونید از دستورات بیشتری هم استفاده کنید

This is the hidden content, please

    
    موضوع مهم بعدی که در همه زبان های برنامه نویسی اهمیت داره , ریاضیات هستش

    دو راه برای اعمال ریاضیات در بش اسکریپت وجود داره
    روش اول استفاده از دستور expr

This is the hidden content, please


    این دستور تعدادی عملگر رو میشناسه که در لیست زیر میتونید ببینید

This is the hidden content, please

 

    البته به صورت نرمال نمیتونید ازشون استفاه کنید , چون  اکثرا  این کاراکتر ها در شل معنای دیگه ای دارن , به همین دلیل از بک اسلش استفاده میشه 

This is the hidden content, please


مثال زیر روش دوم برای انجام ریاضیاته که معمولا از اون روش استفاده میکنیم , به همین دلیل روش اول رو صرفا در حد اشنایی توضیح دادم


    روش دوم استفاده از براکت ها :

    این روش ساده تر و جامع تره , مثال زیر رو ببینید

This is the hidden content, please


    میبینید که در این حالت حتی نیازی نیست نگران معنیه کاراکتر ها در شل بشید , خود شل به دلیل اینکه کاراکتر ها داخل براکت هستند هدف مارو تشخیض میده

    نکته بعدی که باید حل بشه محدودیت اعداد صحیح هستش
    شما میتونید از چند روش برای حل کردن موضوع استفاده کنید

    محدودیت اعداد صحیص رو در مثال زیر میتونید ببینید :

This is the hidden content, please


    پر استفاده ترین روش ، استفاده از ماشین حساب داخلیه بش هستش bc

This is the hidden content, please


    نمونه های اعشاری رو که مشاهده کردید , بعد از اتمام کار برای خارج شدن از محیط ماشین حساب باید دستور quit رو تایپ کنید
    اعشار این ماشین حساب توسط یک متغیر درونی کنترل میشه , به نام scale

    شما میتونید با تغیر مقدار این متغیر خروجی محاصباتتون رو جوری که میخواید بگیرید

This is the hidden content, please



    اینجا ما مقدار 4 رو به متغیر دادیم و اعشارمون طبق سفارشمون داده شد

    قبل از شروع کار ، بنر برنامه رو برای تمیز بودن صفحه رد کردیم با اپشن -q

    ضمن مثال بالا , این ماشین حساب متغیر هارو هم میشناسه

This is the hidden content, please


    استفاده از ماشین حساب بش در اسکریپت :

    اختصاص خروجیه دستور به متغیر رو یاتونه ؟ این همون راه استفاده در اسکریپتمونه , فرمت و مثال :

This is the hidden content, please


    همونطور که دیدید , اول مقدار متغیر ماشین حساب رو 4 قرار دادیم , بعد مقدار محاصبه رو وارد کردیم , که تمام این به جای چاپ شدن با استفاده از پایپینگ به عنوان ورودی تزریق شد به ماشین حساب , و خروجی نهایی مراحل انجام شده در متغیر ما ریخته میشه


    شما میتونید به جای خود اعداد از متغیر ها هم استفاده کنید :

This is the hidden content, please

 

This is the hidden content, please


    وقتایی که مقادیر طولانی دارید به ترتیب زیر هم میشه مقادیر رو وارد کرد :
 

This is the hidden content, please


    چک کردن exit status 

    هر دستوری که در شل اجرا میشه یه کد وضعیت اتمام داره که بعد از اتمام پروسه به شل تحویل داده میشه تا نتیجه کارش مشخص بشه

    این کد یه عدد بین 0 تا 255 هستش , شما میتونید از این عدد توی اسکریپت هاتون استفاده کنید

    لینوکس متغیری با نام علامت سوال فراهم میکنه که مقدار کد مربوط به اخرین دستور اونجا نگهداری میشه , شما باید به محض اتمام کار دستور ، از مقدار استفاده کنید :

This is the hidden content, please


    همونطور که میبینید کد وضعیت برای اجرای درست دستور میشه صفر , اگه اجرا با مشگلی مواجه بشه , کد از حالت صفر خارج میشه و بسته به شرایط مقدار میگیره , مثل :

This is the hidden content, please


    چند تا نمونه از کدهای وضعیت خارج از صفر براتون میزارم بهتر اشنا بشید با موضوع


    1
    ارور ناشناخته عمومی

    2
    استفاده نادرست از دستور شل 

    126
    دستور نمیتونه اجرا بشه

    127
    دستور پیدا نشد 

    128

    ارگمان خروج نا معتبر 

    128+x
    ارور مهم با لینوکس سیگنال اکس

    130
    وقتی دستور در حال اجرا بوده کنترل سی انجام شده 

    255 
    کد خارج از محدوده


    در مثال زیر کد 126 میگه که یوزر پرمیشن مناسب رو نداره

This is the hidden content, please


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

This is the hidden content, please


    دستور exit

    با استفاده از این دستور میتونیم به جای کد پیش فرض صفر برای اجرای مناسب , کد خودمونو بزاریم :
 

This is the hidden content, please

 

    البته میتونید از متغیر هم برای مقدار دهی استفاده کنید :
  

This is the hidden content, please

 

    فقط مواضب باشید اینجور موقع ها جواب محاسبات بیشتر از 255 نشه , وگرنه مقدار مونده رو از اول دور میزنه , به مثال زیر توجه کنید :

This is the hidden content, please

 

پایان قسمت دوم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت سوم


    IF - THEN شرط :

    ساده ترین نوع شرط محسوب میشه , که میتونیم برای ایجاد شروط در اسکریپت استفاده کنیم , به فرمتش دقت کنید :

This is the hidden content, please


    در سایر زبان های برنامه نویسی ابجکتی که بعد از if میاد , بیانگر درست یا غلط بودن موضوعه
    اما این روشی نیست که شل بش ازش استفاده میکنه
    در شل بش دستور خط if اجرا میشه و در صورتی که کد وضعیت اجرای دستور صفر بود , دستورات بخش then اجرا میشن , و شل میره سراغ ادامه اسکریپت , fi هم اعلام پایان بخش شرطه , مثال زیر رو ببینید :

This is the hidden content, please

 

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

This is the hidden content, please


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

This is the hidden content, please


    شرط از دستور grep برای سرچ کردن فایل استفاه میکنه , که ایا مقدار متغیر ما در فایل هست یا نه
    در صورتی که مقدار وجود داشته باشه کد وضعیت اجرای دستور صفر داده میشه و دستورات درخواستیه ما به ترتیب اجرا میشن

This is the hidden content, please

 

    مثال زیر نمونه منفی دستور بالاس :

This is the hidden content, please


    IF - THEN - ELSE :

    در نمونه های قبل شما فقط یک اپشن داشتید , فقط در صورتی که کد صفر دریافت میشد دستورات اجرا میشدن  
    در غیر این صورت اسکریپت دستورات بیرون از شرط رو ادامه میداد
    ولی در این بخش شما میتونید دستوراتی رو برای وقتی کد وضعیت غیر از صفر بود تعریف کنید , فرمت و مثال :
 

This is the hidden content, please


    استفاده از شرط ها درون شرط های دیگه :

    بعضی وقتا شما نیاز دارید چند مورد رو در اسکریپتتون چک کنید , مثال زیر :

This is the hidden content, please


    به جای استفاده از if - then های جدا از هم شما میتونید از elif استفاده کنید ,  فرمت و مثال :

This is the hidden content, please


    یک مثال دیگه , این بار همراه با else :

This is the hidden content, please


    شما همچنین میتونید از elif های متوالی استفاده کنید :

This is the hidden content, please


    دستور test برای if :
    تا اینجا شما داخل شرط فقط دستورات ساده بش رو دیدید , حتما فکر کردید ممکنه به جای قرار دادن این ستورات شرط مد نظر خودمون رو بزاریم و درست یا غلط بون شرط ما نتیجه رو مشخص کنه نه کد وضعیت اجرای دستور

    دستور test راهی فراهم میکنه تا شرط های متفاوت با اونایی که تا الان دیدید اعمال کنیم
    اگه شرط هایی که با این دستور گذاشته میشن درست باشن  , دستور با مقدار کد وضعیت اجرای صفر به اتمام میرسه , و چون دستور test داخل if قرار داره
    دستور مثل واسط میانی عمل کرده و کد وضعیت اجرای خودش رو به if میده
    که خروجی این فرایند باعث میشه شرط مثل شرط های سایر زبان های برنامه نویسی عمل کنه

    فرمت کاملا مثل قبل میمونه فقط test اضافه شده , فرمت و مثال :

This is the hidden content, please


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


    و اما روش جایگزین test 
    شما میتونید به جای استفاده از دستور test از براکت ها استفاده کنید
    هر شرطی که داخل براکت باشه مثل استفاده از دستور test عمل میکنه
    حتما باید بین شرط و براکت ها فاصله گذاشته بشه , فرمت :

This is the hidden content, please



    پایان قسمت سوم از بخش دوم

 

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش دوم - قسمت چهارم


برای استفاده از شرط ها میتونیم اونارو لایه بندی کنیم :

This is the hidden content, please


    از نمونه اول برای متصل کردن شروط به هم استفاده میشه , که در صورت اوکی بودن هر دو شرط شرایط به سمتی که میخواید بره

    نمونه دوم میگه هر کدوم از شرط ها اوکی بود قضیه حله


    توضیح دابل پرانتز ها و دابل براکت ها [[   ]] ((   ))

    از دابل پرانتز ها برای محاسبات پیچیده تر عددی استفاده میشه , مثال زیر رو ببینید :

This is the hidden content, please


    و به همین ترتیب از دابل براکت ها برای مقایسات رشته ای استفاده میکنیم , مثلا : 

This is the hidden content, please


    فرمت زیر و فرایند رفتارش برای اجرای شرط های مورد نظر ما و ایجاد کد وضعیت اجرای صفر برای ادامه شرط رو که یادتونه 

This is the hidden content, please


    در این موضوع از سه کلاس رفتاری تبعیت میشه :

    مقایسات عددی
    مقایسات رشته ای
    مقایسات فایلی


    استفاده از کلاس مقایسات عددی :

    مرسوم ترین متد های های این کلاس رو در بخش زیر براتون لیست کرم


    n1 -eq n2
    چک میکنه عدد1 برابره با عدد2 یا نه 

    n1 -ge n2
    چک میکنه عدد1 برابر یا بزرگتره از عدد2 یا نه

    n1 -gt n2
    چک میکنه عدد1 بزرگتره از عدد2 یا نه 

    n1 -le n2
    چک میکنه عدد1 برابر یا کوچکتره از عدد2 یا نه 

    n1 -lt n2
    چک میکنه عدد1 کوچکتره از عدد2 یا نه

    n1 -ne n2

    چک میکنه عدد1 نابرابره با عدد2 یا نه


    این کلاس میتونه هم برای اعداد و هم متغیر های حاوی اعداد استفاده بشه , مثال :

This is the hidden content, please


    نکته مهم در مورد این کلاس اینه که از اعشار پشتیبانی نمیکنه , مثال :

This is the hidden content, please


    یادتون باشه خود شل بش تنها از اعداد صحیح استفاه میکنه

 

    استفاده از کلاس مقایسات رشته ای :

    مرسوم ترین متد های های این کلاس رو در بخش زیر براتون لیست کرم


    str1 = str2
    چک میکنه رشته1 برابره با رشته2 یا نه 

    str1 != str2
    چک میکنه رشته1 نابرابره با رشته2 یا نه

    str1 < str2
    چک میکنه رشته1 کوچکتره از رشته2 یا نه

    str1 > str2
    چک میکنه رشته1 بزرگتره از رشته2 یا نه

    n str1-
    چک میکنه رشته1 طولش بیشتر از صفره یا نه

    z str1-
    چک میکنه رشته1 طولش صفره یا نه

    مثال :

This is the hidden content, please


    همونطور که دیدید مثال بالا برابر بودن دو مقدار رشته ای رو مقایسه کرد , برعکسش میشه مثال پایین :

This is the hidden content, please


    نمونه دیگه از مقایسه رشته ای , این بار مقایسه اندازه :

    توجه داشته باشید به نماد کوچکتر بزرگتر که اینجا استفاده میکنیم
    حتما یادتون میاد که از این نماد ها برای هدایت ورودی و خروجی استفاده میکریم , اگه اینجا با بک اسلش کار اصلیشون رو غیر فعال نکنیم مشگل زیر پیش میاد

This is the hidden content, please


    به دستور شرط و خروجیه جالبش دقت کردید ؟

    ببینید اینجا شرط مدنظر ما به هیچ عنوان انجام نشده , پس چرا ظاهرا مقایسه بین دو رشته صورت گرفته و حتی مقدار درست هم نمایش داده شده ؟؟؟؟؟

    در قسمت شرط شل علامت بزرگتر ما و کلا شرط مدنظر ما رو کاملا انکار کرده و از علامت بزرگتر به عنوان علامت هدایت دیتا استفاده کرده , که یعنی اومده مقدار متغیر اول رو ریخته تو یه فایل که از مقدار متغیر دوم به عنوان اسم اون فایل برای ایجادش استفاده کرده

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

    به جز اینکه میتونیم فایل ساخته شده و مقدارش رو ببینیم
    برای حل این مشگل میتونید از بک اسلش استفاده کنید , مثال زیر :

This is the hidden content, please


    نکته بعدی در رابطه با این نوع مقایسه تفاوت حروف کوچک و بزرگه :

This is the hidden content, please


    از دو مورد اخر لیستمون هم برای اینکه ببینیم دیتایی وجود داره یا نه استفاده میکنیم , مثال زیر :

This is the hidden content, please

 

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

 

    پایان قسمت چهارم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت پنجم


    کلاس مقایسات فایل :

    این متد به شما اجازه میده وضعیت فایل ها و دایرکتوری هارو تست کنید :


    d dir-name-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا دایرکتوریه

    e file-
    چک میکنه ایا چنین ابجکتی وجود داره  

    f file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا فایله

    r file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا قابل خوندنه

    s file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا مقدار داره

    w file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا قابل نوشتنه

    x file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا  قابل اجراست

    O file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا مال یوزر فعلیه

    G file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا با یوزر فعلی هم گروهه

    file1 -nt file2
    چک میکنه ایا فایل1 جدید تره از فایل2

    file1 -ot file2
    چک میکنه ایا فایل1 قدیمی تره از فایل2


    این ابزار ها باعث میشه شما قابلیت چک کردن فایل سیستم رو با شل اسکریپت داشته باشید , مثال ها به ترتیب :


    چک کردن دایرکتوری :
    

This is the hidden content, please


    چک کردن موجودیت یک ابجکت :

This is the hidden content, please

 

    چک کردن فایل :

This is the hidden content, please


    چک کردن قابل خوندن بودن :

This is the hidden content, please


    چک کردن موجودیت مقدار فایل :

This is the hidden content, please


    چک کردن قابل نوشتن بودن :

This is the hidden content, please


    چک کردن قابل اجرا بودن :

This is the hidden content, please


    چک کردن مالکیت ابجکت :

This is the hidden content, please


    چک کردن تعلق به گروه :

This is the hidden content, please


    مقایسه جدید تر بودن و قدیمی تر بودن فایل ها :

This is the hidden content, please



    پایان قسمت پنجم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش دوم - قسمت ششم


    استفاده از دستور case برای کوتاه کردن if-then-else :

    در بعضی شرایط مثل مثال زیر ما میتونیم از گیر دستورالعمل ها دربیایم و میانبر بزنیم یجورایی :

This is the hidden content, please


    الکی تکرار کردن کد هارو در مثال بالا دیدید ؟ حالا کاربرد مثال اصلی رو بهتر متوجه میشید :

    استفاده از  case : 

    فرمت و مثال :

This is the hidden content, please


    مشاهده کردید که چقدر کار ساده تر و تمیز تر انجام شد

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


    حلقه ها :

    با استفاده از حلقه ها یاد میگیرید چطور پروسه هارو تکرار کنید


    دستور for :

    گاهی شما نیاز دارید بعضی دستورات تا زمان خاصی تکرار بشن , با استفاده از این دستور حلقه ای ساخته میشه که این کارو انجام میده , فرمت و مثال :

This is the hidden content, please


    مشاهده کردید که متغیر در هر مرحله یکی از عناصر لیست رو به ترتیب نگه داشته و دستورات رو اجرا کرده و بعد عنصر بعدی
    بعد از اتمام لیست متغیر درون حلقه اخرین مقدار رو نگه میداره مگر اینکه تغیرش بدید , مثال زیر :

This is the hidden content, please


    همینطور میتونید از متغیر ها به عنوان لیست برای حلقه استفاده کنید : 

This is the hidden content, please


    نمونه بعدی , استفاده از خروجی یک دستور به عنوان لیست در حلقه :

This is the hidden content, please


    در مثال بالا مقادیر لیستمون در یک فایل ذخیره شده بوده , و ما اون فایل رو با دستور cat خوندیم , و مقدار خروجی دستور رو به عنوان ورودی دادیم به متغیر داخل حلقه , توجه داشته باشید که در مثال بالا مقدار فایل خط به خط خونده میشه , یعنی مثل متغیر در مثال قبلی مقادیر با فاصله از هم جدا نمیشن بلکه هر کدوم در یک خط جدا قرار میگیرن

 

    جدا کننده فیلد ها :

    متغیر محیطی IFS) internal field separator) مشخص میکنه چه چیزی مرز بین فیلد هاست

    به عنوان مثال به صورت پیش فرض فاصله , تب و خط جدید تعریف شدن
    مثلا اگه شما بخواید فقط خط جدید به عنوان بخش بندی فیلد ها در نظر گرفته بشه , مقدار متغیر رو به مقدار زیر تغیر بدید
    IFS=$'\n'

    اضافه کردن مثال بالا به اسکریپت , باعث میشه شل علامت های فاصله و تب رو به عنوان جدا کننده فیلد قبول نکنه

    در اسکریپت های طولانی ممکنه در هر بخشی مقدار مشخص شده ای رو برای جدا سازی فیلد ها لازم داشته باشید و نیاز به تغیر های متعدد در متغیر فعلی داشته باشید , برای این کار قبل از تغیر در متغیر از مقدارش نمونه گیری میکنیم

This is the hidden content, please


    بسته به نیازتون مقادیر مختلفی میشه تعریف کرد , به صورت تکی یا دسته جمعی

This is the hidden content, please


    خوندن دایرکتوری با wildcard ها :

    شما میتونید با استفاده از for فایل های دایرکتوری رو بخونید
    وقتی اسم کامل فایل یا مسیرش رو نمیدونید این موضوع کاربرد پیدا میکنه

This is the hidden content, please


    دقت کنید در مثال بالا مقدار متغیر فایل رو در شرط ها بین دابل کوتیشن گذاشتیم

    در صورتی که در بخش اموزشش چنین چیزی نگفته بودیم

    ما این کارو کردیم چون در لینوکس فاصله بین اسم ابجکت ها عادیه و این باعث شد در صورت فاصله دار بودن اسم هر کدوم از فایل هایی که مرور شدن , هیچ مشگلی پیش نیاد

    یک مثال پویا تر :

This is the hidden content, please


    استفاه از استایل C برای for :

    در این حالت ما از دستور for در بش به سبک استفاده در زبان C الگو میگیریم

This is the hidden content, please


    متغیر i در مثال بالا نقش شمارنده داره , که در اولین بخش مقدار پیش فرضش رو گرفته
    و در بخش دوم تا زمانی که مقدارش کوچکتر از 10 باشه حلقه ادامه پیدا میکنه
    و در بخش اخر متغیر بعد از هر بار مرور حلقه مقدارش افزایش پیدا میکنه

    و اما حالت زیر مثال اصلیمونه , فرمت و مثال :

This is the hidden content, please


    شما میتونید در این فرمت از چند متغیر هم استفاده کنید , اما فقط یک شرط استفاده میشه , مثال :

This is the hidden content, please



    پایان قسمت ششم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت هفتم


    دستور while :

    این دستور یه چیزی بین IF-Then و For عمل میکنه
    که ما یک شرط تعریف میکنیم که نسبت به اون حلقه تکرار بشه , فرمت و مثال :

This is the hidden content, please


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

This is the hidden content, please


    دستور Until :

    این دستور کاملا برعکس دستور قبل کار میکنه , فرمت و مثال :

This is the hidden content, please


    یک مثال پویا تر با روش بیش از یک دستور :

This is the hidden content, please


    استفاده از حلقه ها داخل یکدیگر :

This is the hidden content, please


    یه مثال دیگه با تنوع نوع حلقه ها :

This is the hidden content, please


    به مثال زیر دقت کنید (ترکیب) :

This is the hidden content, please


    همچنین با ترکیب دو روش حلقه های درون هم و تغیر IFS میتونیم داخل فایل ها رو با حلقه ها مرور کنیم

This is the hidden content, please

 

    پایان قسمت هفتم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش دوم - قسمت هشتم


    کنترل حلقه ها :

    شما ممکنه فکر کرده باشید بعد از شروع کار یک حلقه , تا پایان کارش کنترلی روش ندارید

    که این موضوع حقیقت نداره و با استفاده از دستورات break و continue میتونید اتفاقات درون حلقه رو کنترل کنید


    دستور break :

    این یه دستور ساده برای متوقف کردنه که میتونید داخل هر نوع حلقه ای ازش استفاده کنید , مثال :

This is the hidden content, please


    این روش برای while و until هم استفاده میشه

This is the hidden content, please


    وقتی دارید با حلقه های درون هم کار میکنید , توجه داشته باشید که دستور کجا اجرا میشه , مثال زیر رو ببینید :

This is the hidden content, please

 

    موقعیت هایی وجود داره که شما داخل حلقه درونی هستید و لازمه حلقه بیرونی متوقف بشه , برای این کار از break n استفاده میکنیم

    که n سطح حلقه هارو مشخص میکنه , مقدار پیش فرض یک هستش , که مربوط به حلقه فعلی میشه

    اگه شما مقدار رو برابر عدد دو قرار بدید , دستور یک سطح به سمت حلقه های بیرونی حرکت میکنه , مثال :

This is the hidden content, please


    دستور continue :

    این دستور مثل نمونه قبلی عمل میکنه ولی جالب تر , میشه گفت به تنهایی به جای دو دستور توقف و شروع عمل میکنه , مثال زیر رو ببینید :

This is the hidden content, please


    توجه داشته باشید بعد از اجرای دستور عملیات داخل حلقه متوقف شده , بنابراین مواضب موارد کنترلی عملیات باشید , در مثال زیر یکی از بخش های کنترلی داخل خود حلقه تعبیه شده , مشگلی که به وجود میاد رو ببینید :

This is the hidden content, please


    همونطور که حدس میزنید در این دستور هم میتونیم در حلقه های داخلی سطح حلقه های بیرونی رو برای اجرای دستور مشخص کنیم , مثال :

This is the hidden content, please


    و در نهایت شما میتونید در شل اسکریپتتون خروجیه یک حلقه رو پایپ و یا ریدایرکت کنید

    این کار رو با اضافه کردن علامت بزرگتر به حلقه میتونید انجام بدید , مثال :

This is the hidden content, please


    یک مثال پویا تر :

This is the hidden content, please


    یک مثال از پایپ کردن خروجیه حلقه :

This is the hidden content, please

 


    پایان قسمت هشتم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت نهم


    تا اینجا شما یاد گرفتید چجوری اسکریپت هایی بنویسید که با تمام ابجکت ها تعامل داشته باشند , اما مواقعی هستند که شما نیاز دارید اسکریپتتون با شخصی که اونو اجرا میکنه در تعامل باشه , مثل ابزار هایی از کالی لینوکس که با بش نوشته شدن 

    شل بش راه هایی برای این کار در نظر گرفته , مثل پارامتر هایی که به برنامه اضافه میکنیم , یا اپشن ها و ...


    پارامتر ها :

    ساده ترین راه تزریق دیتا به اسکریپتتون هستند , که در زمان اجرای کد اعمال میشن :

This is the hidden content, please


    شل بش متغیر های مخصوصی رو برای دریافت پارامتر ها تعریف میکنه که بهشون میگن positional parameters
    این متغیر ها اعداد استاندارد هستند , که 0$ اسم اسکریپت رو نگه میداره و 1$ یا 2$ و ... تا 9$ پارامتر هارو نگه میدارن , به مثال زیر توجه کنید :

This is the hidden content, please


    در مثال بالا پارامتر ها مقدار عددی داشتند , شما میتونید از رشته هم استفاده کنید :

This is the hidden content, please


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

This is the hidden content, please


    متوجه شدید که شل برای تمایز بین پارامتر ها از فاصله استفاده میکنه , بنابراین برای استفاده از مقادیر دارای فاصله از کوتیشن تک یا دابل استفاده میکنیم :

This is the hidden content, please


    ما از متغیر های نه گانه ی نگهدارنده پارامتر ها صحبت کردیم
    ولی بیشتر از نه پارامتر هم میشه تعریف کرد , فقط شکل خوندنشون تغیر میکنه , در مثال زیر نحوه خوندن پارامتر های شماره 10 و 11 رو میبینید :

This is the hidden content, please


    خوندن اسم اسکریپت :

    انجام این کار در اسکریپت های چند تابعی کاربرد پیدا میکنه , که به روش زیر انجام میشه :

This is the hidden content, please

 

    طبق مثال های اجرای مختلف اسکریپت مشاهده کردید که متغیر 0$ به چه شکلی عمل میکنه

    برای اینکه فقط اسم اسکریپت رو دریافت کنید (بدون مسیر) از دستور basename استفاده میکنیم :

This is the hidden content, please


    شما میتونید از این تکنیک برای اسکریپت هایی که چند تابعی هستند و توابع بر اسم اسکریپت تکیه دارن استفاده کنید , به مثال زیر توجه کنید :

This is the hidden content, please


    تست پارامتر ها :

    در اسکریپت های پارامتر دار مواضب خطا های مربوط به استفاده نادرست از پارامتر ها باشید , مثال :

This is the hidden content, please


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

This is the hidden content, please


    استقاده از متغیر های مخصوص پارامتر ها :

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

    به جای تست تک به تک پارامتر ها میتونید تعداد پارامتر های وارد شده رو در نظر بگیرید

    بش یک متغیر مخصوص برای این موضوع در نظر گرفته 
    متغیر مخصوص #$ تعداد پارامتر های وارد شده رو نگهداری میکنه , مثال زیر :

This is the hidden content, please


    مثال تست کردن پارامتر ها با این روش :

This is the hidden content, please


    همینطور میتونید فقط اخرین پارامتر وارد شده رو بیرون بکشید :

This is the hidden content, please



    پایان قسمت نهم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت دهم


    قسمت قبل در مورد پارامتر ها , متغیر های نگه دارندشون و یک سری متغیر های مخصوص مرتبط صحبت کردیم

    دو متغیر مخصوص دیگه هستند که برای یک جا جمع کردن تمام پارامتر های ورودی استفاده میشن , متغیر های : *$ و @$ 
    متغیر *$ تمام پارامتر هارو در قالب یک کلمه درمیاره , اما متغیر @$ پارامتر هارو جدا از هم در یک رشته قرار میده , مثال :

This is the hidden content, please


    همونطور که میبینید ظاهرا هر دو خروجی برابر با هم هستند
    تفاوت بنیادی ای که قبل تر گفتم در مثال زیر قابل لمسه :

This is the hidden content, please

   
    دستور shift :

    ابزار بعدی که شل در اختیارتون میزاره این دستوره , که با استفاده ازش میتونید پارامتر هارو یک واحد به سمت چپ بکشید 

    یعنی مثلا : مقدار 3$ در 2$ قرار میگیره , مقدار 2$ در 1$ قرار میگیره , و مقدار 1$ از بین میره , توجه داشته باشید مقدار 0$ که اسم اسکریپته دست نخورده باقی میمونه , مثال زیر رو ببینید :

This is the hidden content, please


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

    شما میتونید با دادن پارامتر به دستور شیفت تعداد واحد ها در هر جابه جایی رو مشخص کنید , مثال زیر :

This is the hidden content, please

 
    با استفاده از روش بالا شما میتونید به راحتی از پارامتر هایی که نمیخواید چشم پوشی کنید


    کار با اپشن ها :

    در کار با بش حتما دستوراتی رو دیدید که هم از پارامتر ها استفاده میکنن هم از اپشن ها , اپشن ها حروفی همراه با یک دش قبلشون هستند که رو رفتار دستور تاثیر میزارن

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

This is the hidden content, please


    فرقی هم نمیکنه ترتیب اپشن ها چی باشه :

This is the hidden content, please

 

    مواقعی وجود داره که شما تمایل دارید از اپشن ها و پارامتر ها به طور همزمان استفاده کنید
    شل از دابل دش برای تشخیص تمام شدن لیست اپشن ها استفاده میکنه
    بعد از دیدن دابل دش اسکریپت شما سایر پارامتر هارو به عنوان پارامتر دریافت میکنه نه اپشن , در مثال زیر به تفاوت دو نوع اجرای اسکریپت دقت کنید :

This is the hidden content, please


    اپشن های مقدار دار :

    بعضی از اپشن ها  به پارامتر نیاز دارن , در این موقعیت ها کامند لاین به این شکل درمیاد :

This is the hidden content, please


    اسکریپت شما باید متوجه باشه چه زمانی یک اپشن به پارامتر نیاز داره و بتونه این موضوع رو به طور مناسب مدیریت کنه , مثال زیر :

This is the hidden content, please


    مثل نمونه قبل در این حالت هم ترتیب مقادیر ورودی اهمیتی نداره :

This is the hidden content, please


    الان شما نمونه ابتدایی ایجاد اپشن در اسکریپت رو یاد گرفتید , ولی این نمونه محدودیت هایی داره مثل عدم ترکیب اپشن ها , مثال زیر :

This is the hidden content, please


    استفاده از دستور getopt :

    با استفاده از این ابزار بهتر میتونیم موارد مرتبط با اپشن ها و پارامتر هارو هندل کنیم

    این دستور میتونه لیست اپشن ها و پارامتر هارو به هر فرمی دریافت کنه و به صورت خودکار تبدیلشون کنه به فرمت مناسب , فرمت :

This is the hidden content, please


    بخش اول فرمت اپشن هارو تعریف میکنه , و حتی مشخص میکنه کدوم اپشن پارامتر میگیره :

This is the hidden content, please


    در این مثال همونطور که در خط دوم میبینید چهار اپشن و دو پارامتر تعریف شدن , که یکی از اپشن ها پارامتر هم میگیره

    در خط اول یک ( : ) جلوی حرف بی میبینید , به این معنی که این اپشن قراره پارامتر هم داشته باشه

    و همینطور میبینید که قابلیت تفکیک اپشن های به هم چسبیده رو هم داره

    اگه در قسمت اول دستور اپشنی که قصد تعریفش رو دارید مشخص نکنید با ارور زیر رو به رو میشید  :

This is the hidden content, please


    که البته با اپشن q- میتونید از نمایش ارور جلوگیری کنید :

This is the hidden content, please


    استفاده از getopt در اسکریپت :

    برای این کار باید خروجی دستور getopt رو بدیم به دستور set در حالی که اپشن دابل دش براش ست شده , مثال :

This is the hidden content, please


    خوب دیدید که خروجی ها طبق انتظار بودن , اما اگه در یک پارامتر فاصله وجود داشته باشه چی ؟

This is the hidden content, please


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

    این یکی از دلایلی هستش که برای کار با اپشن ها و پارامتر ها مارو به سمت یه ابزار پیشرفته تر میکشونه ، که در قسمت بعد بهش میپردازیم


    پایان قسمت دهم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت یازدهم


    پیشروی به سمت getopts 

    فرمت و مثال :

This is the hidden content, please


    به جز تغیر در حالت اسکریپت و ساده تر شدنش , دو تفاوت اصلی بین این دستور و دستور قسمت قبل رو در مثال بالا مشاهده کردید

    اول اینکه دیدید در قسمت تعریف اپشن ها قبل از اسم اپشن ها یک ( : ) گذاشته شده , این علامت به جای اپشن q- در قسمت قبل گذاشته شده تا جلوی نمایش ارور گرفته بشه

    و دومین تغیر نوع تعریف پارامتر برای اپشن , دستور از متغیر محیطی OPTARG برای این کار استفاده میکنه

    این متغیر به صورت خودکار برای اپشنی که پارامتر دار معرفی شده پارامتر رو نگهداری میکنه

    بر خلاف نمونه قبلی در این دستور پارامتر ها میتونن حاوی فاصله باشن :

This is the hidden content, please


    همچنین شما میتونید بین اپشن ها و یا اپشن و پارامتر و یا هر دو حالت همزمان , هیچ فاصله ای نذارید :

This is the hidden content, please


    و همچنین ابزار قدرت تفکیک و تشخیص اپشن های تعریف نشده رو هم داره :

This is the hidden content, please


    ابزار میدونه چه زمانی اپشن ها رو رها کنه و به پردازش پارامتر ها بپردازه
    زمانی که شما نیاز به خوندن پارامتر ها داشتید میتونید از دومین متغیری که این ابزار باهاش کار میکنه با استفاده از شیفت برای رفتن به سمت پارامتر ها استفاده کنید    متغیر محیطی OPTIND شامل مقدار لوکیشن فعلی , داخل لیست پارامترهاست ، مثال :

This is the hidden content, please

  

 استاندارد سازی اپشن ها :

    حالا که شما میتونید اسکریپت های اپشن دار بنویسید , این که چه حروفی برای اپشن ها استفاده بشه به عهده شماست
    اگرچه تعدادی حروف با معانی مشخص جا افتادند که اگه شما هم در اسکریپتتون از این حروف استفاده کنید , ابزارتون قابل استفاده تر میشه , مثال :

    a-
    نمایش همه ابجکت ها

    d-
    مشخص کردن یک دایرکتوری

    e-
    توسعه یک ابجکت

    f-
    مشخص کردن یک فایل

    h-
    نمایش دستورالعمل

    l-
    تولید یک فرمت کامل تر از خروجی

    o-
    مشخص کردن فایل برای دریافت خروجی

    q-
    میشه گفت عدم نمایش ارور ها

    r-
    پروسه های همزمان فایل ها و دایرکتوری ها

    s-
    اجرا در حالت سایلنت

    x-

    اجرای یک ابجکت
    


    دریافت ورودی از کاربر :

    این عمل با استفاده از دستور read انجام میشه , به مثال زیر توجه کنید :

This is the hidden content, please


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

This is the hidden content, please


    این دستور تمام بخش های ورودی رو در یک متغیر قرار میده , برای بخش بندی مقادیر ورودی بین متغیر ها , به صورت زیر عمل میکنیم :

This is the hidden content, please


    اگر برای دستور هیچ متغیری تعریف نکنید , دستور از متغیر محیطی REPLY برای دریافت دیتا استفاده میکنه

This is the hidden content, please


    شما میتونید برای وارد کردن اطلاعات توسط کابر زمان مشخص کنید , تا اگه اطلاعاتی وارد نشد اسکریپت از کارش نیوفته و کاری که جایگزین میکنید رو انجام بده

    این کار با اپشن t- انجام میشه و واحد های ثانیه ای دریافت میکنه ، مثال زیر :

This is the hidden content, please


    همچنین شما میتونید به جای محدودیت زمانی , از مشخص کردن تعداد کاراکتر های ورودی استفاده کنید

    این کار با اپشن n-  و واحد های کاراکتری انجام میشه , مثال زیر :

This is the hidden content, please

 

    عدم نمایش مقدار ورودی کاربر ( مثل وارد کردن پسورد ) :

    این کار با اپشن s- انجام میشه , و مقدار وروردی در مانیتور دیده نمیشه
    در واقع مقدار ورودی در مانیتور چاپ میشه , ولی چون دستور رنگ مقدار رو با رنگ پس زمینه هماهنگ میکنه , نمیتونیم مقدار رو ببینیم :

This is the hidden content, please


    همچنین شما میتونید با این ابزار مقادیر ورودی رو از یک فایل دریافت کنید 
    دستور این کار رو خط به خط انجام میده , به مثال زیر توجه کنید :

This is the hidden content, please



    پایان قسمت یازدهم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


  • 2 هفته بعد...

    بخش دوم - قسمت دوازدهم


    file descriptor ها :

    لینوکس هر ابجکتی رو به عنوان یک فایل هندل میکنه , که شامل پروسه های ورودی و خروجی هم میشه
    همچنین سیستم هر ابجکت فایلی رو با استفاده از یک فایل دیسکریپتر شناسایی میکنه
    فایل دیسکریپتر یک عدده که منحصرا فایل های باز در یک نشست رو شناسایی میکنه , هر پروسه اجازه داره تا 9 فایل دیسکریپتر در یک زمان داشته باشه , که شل بش سه تای اول رو (0,1,2) برای مقاصد مشخصی استفاده میکنه :

This is the hidden content, please


    این سه فایل دیسکریپتر مخصوص , ورودی و خروجی از اسکریپت شما رو هندل میکنن
    که شل ازشون برای هدایت ورودی و خروجی پیش فرض , به محل مناسب استفاده میکنه


    STDIN :

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

    شل مقادیر ورودی با استفاده از کیبورد رو در STDIN دریافت و پردازش میکنه
    وقتی شما از علا مت ( > ) برای ارجاع استفاه میکنید لینوکس فایل دیسکریپتر ورودی استاندارد رو با فایلی که شما ارجاع دادید عوض میکنه , که یعنی اطلاعات فایل به نحوی به شل داده میشه که انگار همون لحضه از طریق کیبورد تایپ شدن

    به نحوه تغیر ورودی گرفتن شل از فایل کاربر دقت کنید :

This is the hidden content, please


    STDOUT :

    این فایل دیسکریپتر کارش ارجاع خروجی استاندارد شل هستش , که در یک رابط کاربری ترمینال خروجی استاندارد مانیتور محسوب میشه    

    تمام خروجی شل , شامل برنامه ها و اسکریپت هایی که شما اجرا میکنید , به خروجی استاندارد هدایت میشن که میشه همون مانیتور
    اکثر دستورات بش خروجیشون رو در حالت پیشفرض به STDOUT هدایت میکنن , که البته میتونید به جایی که میخواید تغیرش بدید :

This is the hidden content, please


    و اما به اتفاقی که در مثال زیر میوفته دقت کنید :

This is the hidden content, please


    وقتی یک دستور باعث ایجاد ارور میشه , بر خلاف تغیر مسیر خروجی , شل ارور رو به سمتی که ما برای خروجی مشخص کردیم هدایت نمیکنه

    شل فایل خروجیه مارو ساخته ولی ارور بهش منتقل نشده
    شل ارور هارو جدا از خروجی نرمال هندل میکنه , اگه شما شل اسکریپتی مینویسید که در بک گراند اجرا بشه اغلب باید به پیام های خروجی ارسالی به یک لاگ فایل متکی باشید

    در این روش , اگه پیام اروری داده بشه روی لاگ فایل قابل رویت نیست , شما باید از روش دیگه ای استفاه کنید


    STDERR :


    شل با استفاده از فایل دیسکریپتر STDERR ارور هارو هندل میکنه
    اینجا جاییه که شل ارور های به وجود اومده در خودش و برنامه ها یا اسکریپت های اجرا شده در شل رو ارسال میکنه

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

    به همین دلیل همونطور که در مثال دیدید , وقتی شما خروجی پیش فرض رو ارجاع دادید , مسیر خروجیه ارور ها تغیری نکردن


    ارجاع ارور ها :

    شما با ارجاع خروجی اشنا شدید , ارجاع ارور ها هم فرق چندانی نداره فقط باید هنگام هدایت STDERR رو تعریف کنید , برای این کار چند راه وجود داره :


    فقط هدایت ارور :

    همونطور که قبلا دیدید عدد تعریف شده برای این فایل دیسکریپتر 2 هستش
    شما میتونید با قرار دادن این عدد کنار علامت هدایت به اسکریپت بگید فقط ارور ها تغیر مسیر بده :

This is the hidden content, please

 

    میبینید که پیام ارور به جای چاپ در مانیتور داخل فایل ما قرار گرفته
    یه مثال دیگه , این بار ترکیب استفاده از STDOUT و STDERR :

This is the hidden content, please


    هدایت ارور ها و دیتا :

    اگه میخواید هم دیتا و هم ارور هارو هدایت کنید باید از دو علامت هدایت استفاده کنید , این کار باعث میشه هر نوع از خروجی در فایل جداگونه ای که بهش میدیم قرار بگیره :

This is the hidden content, please


    اگه میخواید هر دو مقدار خروجی به یک فایل هدایت بشن از نماد & استفاده کنید :

This is the hidden content, please


    اگه شما بخواید مشخصا یک پیام ارور در اسکریپتتون ایجاد کنید , میتونید یک خط مشخص از خروجی اسکریپت رو به STDERR ارجاع بید

    برای ارجاع به فایل دیسکریپتر ها تنها کافیه هنگام هدایت خروجی علامت ( & ) رو به عدد مربوطه اضافه کنید :

This is the hidden content, please


    خروجیه این خط به سمت جایی هدایت میشه که محل مربوط به ارور هاست


    یک مثال پویا تر :
 

This is the hidden content, please


    در این مثال ظاهرا هیچ اتفاقی نیوفتاده , دلیلش اینه که در حالت پیشفرض STDERR به سمت STDOUT هدایت میشه

    نتیجه کار با تغیر مسیر STDERR قابل رویت میشه :

This is the hidden content, please


    برای ارجاع کامل خروجی اسکریپت با استفاده از دستور exec به روش زیر عمل میکنیم : 

This is the hidden content, please


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

This is the hidden content, please


    شما از همین روش میتونید برای هدایت ورودی به اسکریپتتون استفاده کنید , مثال زیر :

This is the hidden content, please


    ساختن فایل دیسکریپتر های متعلق به خودتون :

    وقتی ورودی یا خروجی اسکریپت رو کنترل میکنید محدود به استفاده از سه نوع نام برده نیستید 

    فایل دیسکریپتر های شماره 3 تا هشت هم اماده استفاده در اسکریپتتون هستند
    شما میتونید هرکدوم از اونا رو برای هدایت ورودی و خروجی به یک فایل استفاده کنید , مثال :

This is the hidden content, please


    همچنین میتونید به فایل مقدار اضافه کنید :

This is the hidden content, please


    نکته مهم برگردوندن مسیر پیشفرض فایل دیسکریپتر های استاندارد هستش

    برای این کار قبل از ریدایرکت کردن نوع استاندارد , از یک دیسکریپتر ثانویه برای هدایت به نوع استاندارد استفاده میکنیم , مثال زیر رو ببینید :

This is the hidden content, please


    پایان قسمت دوازدهم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت سیزدهم


    ادامه ایجاد فایل دیسکریپتر های الترناتیو :

    شما میتونید همونطور که در قسمت قبل خروجی الترناتیو تعریف کردید , فایل دیسکریپتر های الترناتیو برای ورودی تعریف کنید , مثال زیر رو ببینید :

This is the hidden content, please


    همچنین شما میتونید یک فایل دیسکریپتر برای دریافت دیتا از یک فایل , و همچنین ارسال دیتا بهش ایجاد کنید 

    در این متد شل از یک اشاره گر داخل فایل استفاده میکنه تا محل کنونی برای ادامه فعالیت مشخص باشه , مثال :

This is the hidden content, please


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

    وقتی قصد استفاده موازی از یک فایل رو دارید باید حتما به این نکته توجه کنید

    همچنین برای بستن یک فایل دیسکریپتر از دستور زیر همراه با شماره مورد نظر استفاده کنید , دستور و مثال :

This is the hidden content, please


    دیدید که به دلیل بسته بودن ارتباط دستور چاپ باعث شد ارور به وجود بیاد
    و خود ارور هم مبنی بر اینه که فایل دیسکریپتر استفاده شده ارجاع نشده

    نکته بعدی که باید در نظر داشته باشید اینه که ارجاع یک فایلی که وجود داره , باعث نوشتن روی دیتا های اون فایل میشه , مثال :

This is the hidden content, please


    برای لیست کردن فایل دیسکریپتر ها و محل ارجاعشون از دستور lsof استفاده میکنیم :

This is the hidden content, please


    در مثال بالا از اپشن  p- برای مشخص کردن PID و از اپشن d- برای مشخص کردن فایل دیسکریپتر استفاده کردیم

    شل PID فعلی رو در متغیر محیطی $$ نگهداری میکنه , که برای مقدار دهی سریع در مثال بالا ازش استفاده کردیم , مثال استفاده در اسکریپت :

This is the hidden content, please


    بعضی وقتا قصد ندارید اسکریپتتون هیچ خروجی ای داشته باشه, مثل وقتایی که قراره بکگراند اجرا بشه 

    برای این کار شما میتونید STDERR رو ریدایرکت کنید به یک فایل مخصوص به اسم null file
    هر اطلاعاتی که شل به این فایل بفرسته از بین میره

    محل استاندارد این فایل در سیستم های لینوکس /dev/null هستش 

This is the hidden content, please


    این یک راه برای چاپ نشدن ارور هاست , مثال زیر رو ببینید :

This is the hidden content, please


    استفاده به عنوان ورودی :

This is the hidden content, please


    فایل های موقت :

   لینوکس از دایرکتوری tmp/ برای نگهداری فایل های موقت استفاده میکنه

    همچنین دستور مخصوصی برای ساخت این فایل ها قرار داده

This is the hidden content, please


    و فایل های ساخته شده میتونن در دایرکتوری مخصوص نگه داری بشن

    ضمنا فایل های ساخته شده از umask پیشفرض تبعیت نمیکنن , این فایل ها دسترسی خوندن و نوشتن و فقط برای صاحب فایل در حالت پیشفرض قرار میدن

    برای ایجاد فایل از دستور مربوطه همراه با شش حرف اکس جلوی اسم فایل استفاده میکنیم
    که این حروف با شش کاراکتر برای اطمینان از واحد بودن اسم فایل جایگزین میشن , مثال زیر رو ببینید :

This is the hidden content, please

 

    شما میتونید با خیال راحت تعداد زیادی فایل با یک اسم تعریف کنید :

This is the hidden content, please


    برای استفاده از این دستور در اسکریپت شما میتونید اسم فایل ساخته شده رو در یک متغیر برای دسترسی راحت قرار بدید , مثال زیر :

This is the hidden content, please


        ساخت فایل موقت در دایرکتوریه مخصوصشون tmp/

    برای این کار تنها کافیه اپشن t- رو به دستور اضافه کنیم
    وقتی با این روش فایل ساخته بشه خروجی دستور مسیر کامل فایله نه فقط اسمش :

This is the hidden content, please


    یک مثال پویا تر :

This is the hidden content, please

 

    پایان قسمت سیزدهم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


بخش دوم - قسمت چهاردهم


    ساخت یک tmp directory :

    اپشن d- به دستور میگه به جای یک فایل , یک دایرکتوری ایجاد کنه

This is the hidden content, please


    بعضی وقتا لازمه خروجی رو , هم به مانیتور و هم به یک فایل برای لاگ برداری بفرستیم

    به جای اینکه خروجی رو دو بار ریدایرکت کنیم , میتونیم از دستور tee استفاده کنیم
    این دستور مثل یک T - connector برای پایپ ها عمل میکنه , که دیتا رو از STDIN به دو مقصد ارسال میکنه

This is the hidden content, please


    دیدید که خروجی دستور همزمان در مانیتور و فایل مورد نظر ذخیره شد

    نکته مهم استفاده از دستور در حالت پیشفرضه که باعث میشه دیتا ها روی هم نوشته بشن : 

This is the hidden content, please

 

    اگه میخواید دیتای جدید به جای جایگزین شدن به فایل اضافه بشه از اپشن a- استفاده کنید

This is the hidden content, please


    استفاده از این تکنیک برای ذخیره اطلاعات و نمایش همزمان به کاربر :

This is the hidden content, please

    

سیگنال ها :

    لینوکس از سیگنال ها برای تعامل با پروسه های در حال اجرا استفاده میکنه
    مثل نمونه هایی که در قسمت های اولیه بخش اول مشاهده کردید , اعم از قطع , وصل و متوقف کردن پروسه ها

    شما میتونید با کد نویسی داخل اسکریپتتون بهش بگید با دریافت هر سیگنال چه کاری انجام بده , و به این ترتیب وقتی اسکریپت در حال اجراست با سیگنال های ارسالی کنترلش کنید

    بیشتر از 30 سیگنال برای تولید توسط سیستم و اپلیکیشن ها در لینوکس تعریف شده , که ما چند نمونه از پر استفاده ترین هاشون در اسکریپت نویسی رو در لیست زیر میبینیم :


    1     SIGHUB
    معلق کردن پروسه

    2     SIGINT
    قطع کردن پروسه

    3     SIGQUIT
    متوقف کردن پروسه

    9     SIGKILL
    حذف پروسه

    15    SIGTERM
    ترمینیت کردن پروسه در صورت امکان

    17    SIGSTOP
    استاپ کردن پروسه

    18    SIGTSTP
    استاپ یا پاز کردن پروسه

    19    SIGCONT
    ادامه دادن پروسه متوقف شده

 

    ایجاد سیگنال ها :

    شل بش به شما این امکان رو میده که سیگنال های ارسالی با استفاده از کلید های ترکیبی کیبورد رو تعریف کنید , این امکان مواقعی به کار میاد که مثلا میخواید یک اسکریپت در حال اجرا رو استاپ کنید

    کلید های ترکیبی Ctrl + C یک سیگنال از نوع SIGINT میسازن و سیگنال ساخته شده رو به پروسه در حال اجرای فعلی ارجاع میدن

    شما میتونید اینو روی یک دستور که در حالت نرمال زمان زیادی میگیره امتحان کنید, مثال :

This is the hidden content, please


    یا مثلا کلید های ترکیبی Ctrl + Z به جای نمونه قبلی یرای توقف موقت پروسه نه قطع کردنش , که این کار با ارسال سیگنال SIGTSTP انجام میشه

This is the hidden content, please


    به خروجی نمونه دوم که دقت کنید , قسمت اول یک عدد بین براکت هاست که جاب نامبر تعریف شده توسط شل هستش , که این اعداد منحصر به فرد هستند و برای دسترسی و کنترل پروسه کاربرد دارن , که به ترتیب از یک شروع میشن , مثلا اگه الان شما یک پروسه دیگه رو استاپ کنید شماره جاب 2 بهش تعلق میگیره

    در این حالت اگه شما بخواید شل رو ببندید به خاطر جلوگیری از منحل شدن فرایند پشت پرده شل بهتون هشدار میده در مورد عواقب بسته شدنش , مثال :

This is the hidden content, please


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

This is the hidden content, please



    ستون S در خروجی دستور وضعیت پروسه رو اعلام میکنه
    اگه با این حال هنوز قصد خروج از شل رو دارید کافیه یک بار دیگه دستور exit رو تایپ کتید
    و یا الان که پروسه ایدی هارو میبینید با استفاده از دستور kill یک سیگنال SIGKILL به پروسه ای که قصد از بین بردنش رو دارید بفرستید :

This is the hidden content, please

 
    شما میتونید به جای اینکه سیگنال هارو مدیریت نشده ازاد بزارید تا روی اسکریپت در حال اجراتون تاثیر بزارن , قدرت اجراییشون رو ازشون بگیرید

    این کار با استفاده از دستور trap انجام میشه , و فرمت استفاده ازش به این صورته :

This is the hidden content, please


    به این صورت که شما در قسمت کامندز دستوراتی که میخواید شل اجرا کنه رو مینویسید , و با یک فاصله اسم و یا شماره ی سیگنال هایی که قصد دارید ترپ بشن رو تایپ میکنید , مثال زیرو ببینید :

This is the hidden content, please


    در خروجی اسکریپت مثال بالا  مشاهده کردید که قدرت اجرایی سیگنال مربوط به کلید های ترکیبی Ctrl + C که مرتبط با قطع روند پروسه محسوب میشه , ازش گرفته شده

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


    پایان قسمت چهاردهم از بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


  • 2 هفته بعد...

بخش دوم - قسمت پانزدهم


    خوب دوستان میریم سمت ادامه بحث سیگنال ها و Trapping :

    در Trap کردن Script Exit شما به جای استفاه از این تکنیک در اسکریپتتون , در پایان فرایند اسکریپت ازش استفاده میکنید
    که یعنی به محض اتمام فرایند اسکریپت , دستور ما اجرا میشه , برای این کار سیگنال EXIT رو به دستور Trap میدیم , مثال :

This is the hidden content, please


    همونطور که مشاهده کردید با پایان کار اسکریپت دستور ما اجرا شد , این اتفاق میتونه در صورت اجبار اسکریپت به اتمام هم رخ بده :

This is the hidden content, please


    برای مدیریت Trap مشخص شده , در بخش های بعدی اسکریپت , به راحتی میتونید با مقادیر جدید در ادامه اسکریپت Trap رو تغیر بدید , مثال :

This is the hidden content, please


    تغیرات توضیح داده شده رو میتونید در خروجی اسکریپت ببینید :

This is the hidden content, please


    شما همچنین میتونید با اضافه کردن ( - ) یا ( -- ) و سیگنال مورد نظر Trap مرتبط رو پاکسازی کنید , و رفتار سیگنال رو به حالت پیشفرض تغیر بدید , مثال :

This is the hidden content, please

 

    اجرای اسکریپت در حالت بک گراند :

    بعضی وقتا اجرای اسکریپت در کامند لاین به صرفه نیست , مثلا وقتی فرایند اسکریپت زمان زیادی میبره , شما میتونید با اجرای اسکریپت درحالت بک گراند همون موقع کنترل کامند لاین رو دوباره به دست بیارید , بدون اینکه منتظر اتمام اسکریپت باشید , و اسکریپت هم پشت پرده به کارش ادامه میده


    برای اینکه به شل دستور بدید اسکریپتتون رو در حالت بک گراند اجرا کنه کافیه علامت ( & ) رو بعد از دستور قرار بدید , مثال :

This is the hidden content, please


    میبینید که خروجی job number و PID بعد از زدن اینتر داده میشه , که عدد داخل براکت ها شماره جاب و کد بعد از اون ایدی پروسه هستش
    و بدون معطلی برای اتمام فرایند اسکریپت ، کنترل شل به دست شما برمیگرده ( ولی اسکریپت در حالت اجرا قرار داره )

    بعد از اینکه فرایند اسکریپت در حال اجرا ( در بک گراند ) به اتمام برسه , یه پیام مشابه کد زیر نمایش داده میشه , که شامل job number , job status و اسم پروسه ای که در حالت بک گراند اجرا شده بود هستش :

This is the hidden content, please

 
    توجه داشته باشید که وقتی پروسه ای در حالت بک گراند داره اجرا میشه , همچنان برای STDOUT و STDERR از مانیتور استفاده میکنه , مثال :

This is the hidden content, please


    به همین دلیل وقتی خروجیه اسکریپت در حال چاپ شدنه شما میتونید بدون تداخل با فرایند اسکریپت دستورات خودتونو اجرا کنید , مثال :

This is the hidden content, please


    شما میتونید در همون تایم تعداد بیشتری پروسه رو وارد حالت بک گراند کنید , مثال :

This is the hidden content, please


    میبینید که با هر بار فرستادن پروسه ها به بک گراند , یک جاب نامبر و پروسه ایدی جدید برای هر پروسه چاپ شد , که میتونید با دستور ps لیستشون کنید :

This is the hidden content, please


    پایان قسمت پانزدهم از بخش دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


    بخش دوم - قسمت شانزدهم

( قسمت اخر از بخش دوم )


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

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

    این دستور یک بلاک کننده دستور اجرا میکنه که جلوی سیگنال SIGHUB در صورت ارسال گرفته بشه , این کار باعث عدم جلوگیری از ادامه فرایند اسکریپت بعد از بستن سیشن ترمینال میشه

    فرمت استفاده از دستور :

This is the hidden content, please


    به دلیل اینکه بعد از کاربردی شدن دستور فوق دیگه ترمینالی برای تعامل و مخصوصا خروجی وجود نداره , تمام مقادیر STDOUT و STDERR اسکریپت مستقیما ارجاع داده میشه به فایلی به نام nohub.out 

    در صورت استفاده مکرر از متد بالا تمامی خروجی های اسکریپت ها به همون فایل ساخته شده ارجاع داده میشن , بنابراین مواضب اجرای اسکریپت های مختلف به این روش ( در یک دایرکتوری ) باشید , ممکنه نتایج گمراه کننده بشن

This is the hidden content, please


    کنترل کرن جاب ها :

    قبل تر شما نمونه ای از این کارو مشاهده کردید ( Ctrl + C ) که باعث جلوگیری از ادامه روند پروسه میشد , که بعدش شما میتونستید پروسه رو kill یا restart کنید

    در کل استفاده از function های start , stop , kill رو job Control مینامیم , با جاب کنترل شما کنترل کامل روی پروسه های در حال اجرای محیط شل دارید

    کلید اصلی برای job controling دستور jobs هستش , که باعث میشه شما جاب های فعال در شل رو ببینید :

This is the hidden content, please


    توجه داشته باشید ( $$ ) نگه دارنده ی مقدار پروسه ی فعلی هستش ( خود اسکریپت به محض اجرا ) شما میتونید از کلید های ترکیبی Ctrl + Z برای stop کردن پروسه استفاده کنید :

This is the hidden content, please


    دوباره همون اسکریپتو اجرا میکنیم , این بار در بک گراند همراه با هدایت خروجی :

This is the hidden content, please


     حالا وضعیت رو با تفاوت جاب ها میتونیم ببینیم :

This is the hidden content, please


    میتونیم با اپشن l- پروسه ایدی هاشون هم ببینیم :

This is the hidden content, please


    این دستور اپشن های دیگه ای هم داره که چند تا از پر کاربرد هاشون رو براتون میزارم :

    l-
    نمایش pid همراه با job number

    n-
    فقط جاب هایی رو لیست میکنه که وضعیتشون نسبت به اخرین وضعیتی که شل نمایش داده بود تغیر کرده

    p-
    فقط pid های جاب هارو نمایش میده

    r-

    فقط جاب های در حال اجرا رو نمایش میده


    s-
    فقط جاب های stop شده رو نمایش میده


    وقتی جاب هارو نمایش میدیم کنار دوتا از جاب ها علامت های مثبت و منفی داخل براکت قرار داره , که میتونن جالب باشن 

    جابی که کنارش علامت مثبت قرار داره جاب پیشفرض محسوب میشه و جابی که کنارش علامت منفی قرار داره جانشین جاب پیشفرض محسوب میشه , مثال زیرو ببینید :

This is the hidden content, please


    در جاب کنترل شما میتونید جاب های استاپ شده رو چه در بک گراند چه در حالت نرمال ری  استارت کنید

    برای شروع مجدد یک جاب در حالت بک گراند از دستور bg استفاده میکنیم , مثال :

This is the hidden content, please


    مشاهده کردید که به دلیل اینکه جاب مورد نظر جاب پیشفرض بود دستور bg خودش جاب رو شناسایی کرد

    در حالت های دیگه باید از شماره جاب برای مشخص کردنش استفاده کنید , مثال :

This is the hidden content, please


    برای شروع مجدد جاب استاپ شده در حالت نرمال به جای بک گراند میتونید از دستور fg استفاده کنید :

This is the hidden content, please


    در سیستم های multitasking مثل لینوکس , کرنل موظفه CPU time هر پروسه رو مشخص کنه , که بر اساس یک مقدار عددی از 20- تا 20+ مقدار دهی میشه ، که مقدار پیشفرض برای پروسه های اجرا شده توسط شل بش 0 قرار داره

    نکته مهم در مورد درجه های تنظیم گفته شده برعکس بودنشونه , به این صورت که هرچی عدد پایین تر یا زیر صفر منفی تر باشه , اولویت بالاتری تنظیم میشه 

    برای تغیر مقدار پیشفرض یک پروسه از دستور nice استفاده میکنیم

    برای اینکه یک دستور با مقدار اولویت متفاوتی اجرا بشه از اپشن n- برای دستور nice استفاه میکنیم و عدد مورد نظر رو قرار میدیم , مثال :

This is the hidden content, please


    در خروجی دستور ps و در ستون ni مقدار تغیر داده شده رو مشاهده میکنید

    اما اگه بخواید مقدار اولویت رو افزایش بدید ( عدد کمتر یا منفی ) با پیام زیر مواجه میشید :

This is the hidden content, please


    دستور nice به یوزر های معمولی اجازه افزایش اولویت رو نمیده , عدم موفقیت در مثال بالا به این دلیل بود , اما با این حال میبینید که جلوی اجرای دستور گرفته نشده

    شما میتونید به جای استفاده از اپشن n- فقط از کاراکتر ( - ) قبل از عدد مربوط به سطح اولویت استفاده کنید , مثال :

This is the hidden content, please


    متوجه گمراه کنندگی موضوع در این سبک از استفاده شدید ؟

    عدد مورد نظر چون بعد از علامت دش قرار گرفته با عدد منفی اشتباه گرفته میشه , در صورتی که در ستون ni در خروجی دستور ps عدد مثبت قرار داره

و برای مقدار دهی منفی باید از دو علامت دش استفاده بشه , حالا این موضوع به اضافه ی برعکس بودن عدد اولویت دهی میتونه کاملا گمراه کننده باشه , به همین دلیل سعی کنید خیلی ساده از همون اپشن n- استفاده کنید

    تا اینجا ما مقدار دهی رو هنگام اجرای دستور یا اسکریپت اعمال کردیم , اما اگه بخوایم مقدار اولویت دستوری که در حال اجراست رو تغیر بدیم چی ؟ یا مثلا بخوایم از مقداری که دادیم صرف نظر کنیم و مقدار رو افزایش یا کاهش بدیم ؟

اینجا از دستور renice استفاده میکنیم 

    طرز استفاده به همون شکله ولی چون خود دستور یا اسکریپت قبلا اجرا شده از پروسه ایدی ابجکت برای تغیرش استفاده میکنیم , مثال زیر رو ببینید :

This is the hidden content, please


    توجه داشته باشید از اونجایی که افزایش اولویت و تغیر در پروسه های دیگر کاربر ها محدود شده , برای کنترل کامل روی ابزار از یوزر روت استفاده کنید


    پایان قسمت شانزدهم از بخش دوم

    پایان بخش دوم

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • ایجاد مورد جدید...