PDA

View Full Version : قدرت و کارایی عالی خط فرمان در گنو/لینوکس



Folaani
پنج شنبه 10 آبان 1386, 10:04 صبح
در اینجا میخوایم در مورد قدرت و کاربردهای عملی خط فرمان گنو/لینوکس و شاید بطور کلی سیستمهای یونیکسی (شباهت تنها از لحاظ استانداردها و ساختارهای پایه هست) صحبت کنیم.
بعضی فکر میکنند خط فرمان یک رابط منسوخ شده هست که متعلق به عهد بوقه و باید بدور انداختنش!
بعضی هم فکر میکنن فقط باید با یکی از دو رابط گرافیکی یا خط فرمان عمدهء کارها رو انجام داد.
اکثریت ویندوزیها و حتی خیلی از لینوکسیهایی که بقدر کافی حرفه ای نیستن و خط فرمان و زبان و برنامه هاش رو بقدر کافی بلد نیستن واقعا شدت تفاوت خط فرمان در ویندوز و لینوکس و همچنین کاربردهای مسلم و منطقیش رو خوب درک نکردن.
اینجا نمیخوام یک بحث سیستماتیک و کلاسی رو پیگیری کنم، نمیخوام از صفر چیزی رو یاد بدم، تاپیک آموزش خط فرمان و شل و برنامه ها نیست و در اینطور موارد رفرنسهای کافی موجود هستن که باید بقدر کافی کاربر حرفه ای و انگلیسی دان بود و به رفرنسهای مربوطه مراجعه کرد.
البته هر نوع سوالی رو میتونید بپرسید و اگر بنده یا شخص دیگری بلد بودیم میتونیم جواب بدیم یا رفرنسی معرفی کنیم و غیره. البته تعهدی برای اینکار نیست و شاید وقت و انرژی کافی نباشه چون واقعا اینطور مقولات گسترده هستن. فقط خواستم بگم که تاپیک حالت آزاد و متنوع داره و محدودیت و چهارچوب سختگیرانه ای نداره.

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

اینجا احتمالا چیزی که مطرح کنم و درواقع یکی از اهداف این تاپیک بوده، مطرح کردن مثالهای عملی و کاربردهای واقعی ای هست که برای خودم در جریان کارها و زمینهء فعالیتم (عمدتا کاربری و مدیریت سیستم/برنامه نویسی وب ...) پیش اومده. ممکنه برای حرفه ایها ساده و نه چندان ارزشمند بحساب بیاد و ممکنه هم نه. ولی مسلما برای مبتدیها/نه چندان حرفه ایها و ویندوزیهایی که میخوان دید بهتری نسبت به لینوکس و خط فرمان و اینطور چیزها پیدا کنن و جواب سوالاتشون دربارهء این محیط عجیب و غریب و رعب آور هکری رو بدونن بدون فایده نیست.

قول هم نمیدم که وقت زیاد بتونم بذارم، یا با فاصله و برنامهء منظم پیگیری کنم. اینها هم مثل محتوی تاپیک آزاد و متنوع هست!! فعلا فقط استارت اولیه و احتمالا نظرات سایر دوستان.
اوه راستی فراموش نشه که بنده فقط یک استارتر هستم و نه رهبر و سخنگوی اصلی تاپیک. از دوستان و استادان و سروران گرامی که تجربه و دانشی در این زمینه ها دارن دعوت میکنم آزادانه در این تاپیک نظرات و تجربیات خودشون رو در اختیار دیگران بذارن. اصولا اینطور تاپیک واقعا محتوی لازم رو پیدا میکنه، چون بخش عمدهء اون تجربهء شخصی میتونه باشه که مشخصه با افزایش تعداد کمیت و کیفیتش بسیار بالاتر میتونه بره. ضمنا بازهم تکرار میکنم که بحث آزاد هست و از تئوری تا عملی و مثال و نمونه و نظر و ایده و غیره، خلاصه میتونید هرچیزی رو مطرح کنید.
بهرحال ما یه کاری کردیم؛ کوچیک یا بزرگ و مفید و بیهوده، در آینده مشخص میشه. چنین تاپیکی در جای دیگه ندیدم و بنظر من جاش خالی و مورد نیاز و مفید بود. حقش هم نیست برای چنین قدرت و برجستگی ای در لینوکس بحثی نشه و فقط به چیزهای مد روز مثل معادل برنامهء فتوشاپ و فلان محیط ویژوال بپردازیم. چون همونطور که گفتم این تاحدودی بخاطر/ایجاد کنندهء یک تصور غلط هم هست که فکر میکنیم غیبت کلی چنین چیزی در محیط ویندوز دلیل بر کم اهمیتی و بدون کاربرد بودن اون هست.

فعلا بدرود.

Inprise
پنج شنبه 10 آبان 1386, 10:45 صبح
سعی کن در مورد مسئله مورد نظرت صحبت کنی و دائما از قیاس بین ویندوز و لینوکس پرهیز کنی چون اگر این قیاس فنی باشه مفید است ولی چون اغلب اینطور نیست باید منتظر باشیم بعد از درس شماره یک یه نفر بیاد و یه لیست از کارهای مشابهی که میشه روی ویندوز انجام داد و تو نمیدونستی و نتیجه گرفتی نمیشه رو به تاپیک اضافه کنه و بعد مثل اون بحث فایرفاکس ، مسئله بطور کل منحرف بشه . اگر دنبال صحبت کردن در مورد شل هستی فقط در مورد شل صحبت کن .

Folaani
جمعه 11 آبان 1386, 14:41 عصر
سعی کن در مورد مسئله مورد نظرت صحبت کنی و دائما از قیاس بین ویندوز و لینوکس پرهیز کنی چون اگر این قیاس فنی باشه مفید است ولی چون اغلب اینطور نیست باید منتظر باشیم بعد از درس شماره یک یه نفر بیاد و یه لیست از کارهای مشابهی که میشه روی ویندوز انجام داد و تو نمیدونستی و نتیجه گرفتی نمیشه رو به تاپیک اضافه کنه و بعد مثل اون بحث فایرفاکس ، مسئله بطور کل منحرف بشه . اگر دنبال صحبت کردن در مورد شل هستی فقط در مورد شل صحبت کن.

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

==============================================

خب خلاصه یک راست میریم سر بحث شیرین تکنیکی و عملی!!
چون دیروز یک چیزی رو تازه خودم امتحان کردم که قبلا شنیده بودم ولی تجربه نکرده بودم و مطلب جالب و سرگرم کننده ای هست اون رو الان شرح میدم؛ اگر قبلا تجربش رو داشتم در پست آغازین تاپیک بهش اشاره میکردم.
حکایت از این قراره که در محیط متن و خط فرمان لینوکس حتی میشه فیلم نگاه کرد.
تاجایی که میدونم این قابلیت با استفاده از تکنیکی بنام Linux framebuffer صورت میگیره که بنابراین اگر سیستم شما مجهز به این قابلیت و فعال باشه میتونید در خط فرمان ویدئو داشته باشید.

یه قسمت مفید و مختصر از مقالهء ویکی پدیا:


The Linux framebuffer (fbdev) is a graphic hardware-independent abstraction layer to show graphics on a console without relying on system-specific libraries such as SVGALib or the heavy overhead of the X Window System.

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

یک خط فرمان نمونه بسادگی:


mplayer /media/data/video/g11-1-128.mpg

البته اگر در محیط گرافیکی باشید، با وارد کردن این فرمان یک پنجرهء جداگانه برای نمایش فیلم باز میشه.
اگر در محیط متنی باشید فیلم بصورت فول اسکرین نمایش داده میشه.
در توزیع فدورا، بنده میتونم با کلید ctrl+alt+f5 یا ctrl+alt+f1 به محیط تماما متنی وارد بشم و با کلید ctrl+alt+f7 برمیگردم به محیط گرافیکی.
موقع پخش فیلم با کلید p میتونید فیلم رو نگه دارید؛ با کلید q یا ESC هم پخش متوقف میشه و به خط فرمان برمیگردید. چند کلید دیگه هم هست که کارهای مختلف مثل عقب و جلو بردن، تنظیم ولوم و نمایش یا عدم نمایش نشان دهنده های وضعیت (کلید o) رو انجام میدن.
بهرحال همونطور که ابتدای تاپیک گفتم هدف ما اینجا آموزش و ذکر جزء به جزء نیست و فقط سرنخها رو بدست میدیم و قابلیتها و کارهای جالب و مفید و پیشرفته در محیط متن لینوکس رو لیست میکنیم.
البته بنده کم نمیذارم و بهترین چیزهایی رو که میدونم تاجایی که توان و وقتم اجازه میده براتون میگم. امیدوارم در ادامه دوستان دیگر هم مطالب ارزشمند و تجربه های شخصی خوبی رو در اختیار همگان بذارن.

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


mplayer -vo aa /media/data/video/g11-1-128.mpg

اینجا توسط آپشن vo (ظاهرا مخفف video output) میگیم که ویدئو رو با استفاده از درایور ASCII ART نمایش بده که فکر میکنم بیشتر شما بدونید چی هست، ولی برای مبتدیها و تازه واردها بگم که فیلم در این حالت با کاراکترهای معمولی اسکی نمایش داده میشه که دیدنش خالی از لطف نیست! میتونید با این روش صحنه های مناسب دلخواه از فیلمهاتون رو به چنین فرمی دربیارید (در نقطهء مورد نظر متوقف و تبدیل به عکس کنید).
اگر بجای aa عبارت caca رو وارد کنید فرم دیگری از همین رو نمایش میده که از تعدادی رنگهای مختلف محدود استفاده میکنه و نمایش رنگی شاید جذابتر و واضحتری خواهید داشت.
سعی میکنم تصویری از این نوع رو ضمیمه کنم.
درایورهای دیگه که تست کردم شامل gif89a , jpej , png هست.
بغیر از خروجی gif89a، اون دوتای دیگه هر فریم فیلم رو تبدیل به تصویری جداگانه میکنن و در دایرکتوری جاری میریزن. پس مواظب تعداد زیاد فایلهای ایجاد شده باشید! فکر نمیکنم زیاد بدردتون بخوره.
اما خروجی gif89a جالب هست که ویدئوی شما رو تبدیل به یک تصویر گیف متحرک میکنه. احتمالا ازش بشه استفاده های عملی کرد. مثلا قسمت کوتاه جالبی از یک فیلم رو که جداکردیم با این روش میتونیم به تصویر متحرک تبدیل کرده و روی وب و کاربردهای دیگه که دنبال چنین چیزی هستیم استفاده کنیم. البته سعی کنید ذوق زده نشید و افراط نکنید! اینها تنها ابزارهایی هستن که وجود دارن و باید موقع لازم ازشون استفاده بشه. معمولا برای کارهای تخصصی تر و استفادهء مستمر و گسترده خب ابزارهای مخصوص و پروفشنال تری وجود دارن، اما برنامه های لینوکس اینقدر گسترده و متنوع و هرکدوم با ویژگیهای جالب خودشون هستن که واقعا از همشون در شرایط خاص میشه استفادهء عملی کرد و گاهی برای کاری ساده یا خاص یک ابزار ساده بهتر و مناسبتر یا از معدود گزینه های معقول/شدنی هست.
اگر با gif89a خواستید کار کنید متوجه افزایش شدید حجم عکس باشید؛ برای تست توصیه میکنم حدود یک ثانیه از یک فیلم رو تست کنید. یعنی با کلید q یک ثانیه بعد از شروع نمایش، از فیلم خارج بشید.
ضمنا میدونید که کیفیت تصویر گیف بخاطر محدود بودن تعداد رنگهاش به فکر میکنم ۲۵۶، کمتر از تصاویر ویدئوی اصلی خواهد بود.
حال این رو تست کنید:


mplayer -ao pcm /media/data/video/g11-1-128.mpg

این خط فرمان توسط آپشن ao (مخفف audio output) صدای فیلم شما رو به فایل wav تبدیل میکنه! (فایل در دایرکتوری جاری ریخته میشه که با فرمان pwd میتونید دربارش اطلاع حاصل کنید).
پس به همین راحتی و خوشمزگی میشه صدای یک فیلم رو ازش استخراج کرد. کاری که یادمه بعضی براش دنبال نرم افزار ویرایش فیلم میگشتن.
ضمنا شما میتونید با درایوری با نام null برای هرکدوم از آپشنهای ویدئو و صوت، اون خروجی رو نابود کنید. یعنی فیلم بدون تصویر یا صدا پخش بشه (البته برای پخش بدون صدا از آپشن -nosound هم میتونید استفاده کنید).
این برنامهء خط فرمانی جزیی از یک خانواده/پکیج هست که مثلا برنامه ای بنام mencoder هم داره که ظاهرا روی سیستم بنده نصب نیست. منوال رو الان نگاه کردم؛ واقعا مفصل هست! با mencoder ظاهرا میتونید فرمتهای مختلف فیلم رو به هم تبدیل کنید، اونهم با امکانات ویرایشی مختلف (فرضا از کجا تا کجا تبدیل بشه و غیره)؛ توضیح مفصلش در منوال mplayer آمده که دیگه بنده مطالعه نکردم.

اگر میخواید بطور حرفه ای با این برنامه (mplayer) آشنا بشید، حتما بقیهء آپشنهای خط فرمان و منوالش رو بدقت بررسی کنید. خیلی کارهای دیگه هم انجام میده؛ فرضا میشه تعداد فریم در ثانیه رو تنظیم کرد (مثلا شاید برای کاهش حجم تصاویر گیف متحرک مفید باشه). تنظیمات و انعطاف و قابلیتهای بسیار بیشتر از چیزی که اینجا گفتیم درش هست. اما بنده دیگه بهشون نمیپردازم. تازه با این برنامه آشنا شدم وگرنه احتمالا منوالش رو دقیق میخوندم و چیزهای بیشتری برای گفتن داشتم.
بعنوان اولین برنامه خط فرمان مطرح شده این برنامه رو گفتم ولی امیدوارم زیاد به زرق و برق و جنبهء سرگرمی پرداخته نشه و تاپیک از مسیر/گرایش فنی و تخصصی خودش خارج نشده باشه. بهرحال اینجا فروم برنامه نویسی هست و هدف و محتویات درنظر گرفته شده برای این جستار هم بی ارتباط با این زمینه نیستن و اکثرا برای کاربرهای خانگی معمولی و غیر متخصص کاربرد چندانی ندارن، اما متخصصان و حرفه ایها و برنامه نویسان در جریان پیشرفت تاپیک احتمالا متوجه خواهند شد که ابزارها و قابلیتهای مطرح شده چقدر جالب و مفید هستن برای کارهای مختلفی که برای این قشر افراد کم پیش نمیان.

-----------
تصویر ضمیمهء ذیل حاصل استفاده از caca (libcaca) video output driver هست:

oxygenws
جمعه 11 آبان 1386, 14:57 عصر
فقط به هدف مجتمع بودن مطلب در مورد mplayer، پیشتر مطالبی در مورد mencoder نگاشته بودم که در سه قسمت منتشر شد و از سه لینک زیر در دسترس است:

http://oxygenws.com/blog/archives/43-.html
http://oxygenws.com/blog/archives/44-unknown.html
http://oxygenws.com/blog/archives/48-DVD.html

Folaani
یک شنبه 13 آبان 1386, 13:01 عصر
خب در این پست هم بذارید یه برنامهء مالتی مدیای دیگه رو معرفی کنم! مثل اینکه افتادیم توی بحث مالتی مدیای خط فرمان!! بهرحال کاربرد این برنامه در بخشهای دیگه هم میتونه باشه و ترجیح میدم بعنوان توالی منطقی و مکمل بحث پیشین مطرحش کنم.

این برنامه اسمش هست SoX و البته در خط فرمان با sox باید اجراش کنید (نام فایلها در سیستم عاملهای یونیکسی حساس به کوچکی و بزرگی حروف هست).

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

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


sox - Sound eXchange : universal sound sample translator

با این برنامه میشه یک سری افکت جالب توجه و بدردبخور رو به صوت/موسیقی اضافه کرد.


SoX is a command line program that can convert most popular audio files to most other popular audio file formats. It can optionally change the audio sample data type and apply one or more sound effects to the file during this translation.


البته کار کردن با این برنامه در حالت حرفه ایش نیاز به خوندن منوالش داره؛ ولی خیلی کارهای ساده و متداول رو میتونید بسادگی انجام بدید.

بنده تنها مواردی رو که بعنوان یک کاربر غیرمتخصص در صوت و موسیقی، و برای کارهای عادی استفاده/تست کردم میگم؛ افکتها و گزینه های مختلف این برنامه زیاد هستن و اغلب تخصصی هستن و شرح و توضیحشون نیاز به تخصص لازمه داره. مثلا فیلتر بالاگذر چی هست، بعضی افکتها که اسمهای تخصصی دارن دقیقا چی هستن و غیره. بنابراین بنده وارد این جزییات نمیشم و مطلب رو خلاصه میکنم. برای آشنایی کاملتر به منوال مراجعه کنید. البته بعضی مواردی رو هم که متداول هست و شخصا میفهمم میگم.

با این برنامه میتونید بطور مثال sampling rate فایلها رو تغییر بدید؛ فکر کنم بدرد تغییر حجم و کیفیت میخوره.
میشه یک فایل رو چند بار تکرار کرد. مثلا میخواید یک صدا یا آهنگی که در فایلی هست بصورت دوبار یا هرچند بار پشت سرهم ضبط بشه. بنظرم این خیلی جاها میتونه بدرد بخوره! مثلا شما میخواید ساعتی توسط یکسری بوق پشت سرهم، مثل این ساعتهای قدیمی که ساعت رو با تعداد صدای ناقوس اعلام میکردن، اعلام بشه. خب اینکار رو براتون براحتی انجام میده! البته این فقط یک مثاله.
توجه کنید که صدای تولید شده میتونه در یک فایل ذخیره نشه و بلکه مستقیما پخش بشه! این قابلیت میتونه در خط فرمان و جاهای دیگه خیلی بدرد بخوره؛ یعنی شما میتونید صداهایی رو بصورت دینامیک و On the fly تولید کنید.
افکت reverb اگر آشنا باشید.
افکت vibro که ظاهرا معروف هست، ولی بنده نمیدونم چیه.
افکت reverse؛ یعنی فایل شما انگار از انتها به ابتدا پخش بشه! مثل یک نوار کاست که با دور برعکس پخش بشه.
برداشتن سکوت (صدایی با شدت کمتر از یک حدی که تعریف میکنید) از ابتدا یا انتهای فایلها.
افزایش یا کاهش سرعت (مثل پخش کردن یک نوار کاست با سرعت بالاتر یا پایینتر موتور).
جابجا کردن کانالهای صدا.
ساخت صدا (درمورد این امکان جالب و مفید بعدا صحبت میکنیم).
حذف قطعه/مدت زمان معینی از ابتدا یا انتهای فایل.
تغییر شدت/ولوم صدا.
افکت fade.
انواع فیلترهای مختلف (بالاگذر، پایین گذر، ...؟).
... (افکتهای متعدد دیگه)

ضمنا قابلیت میکس (مخلوط) کردن چند فایل صوتی با هم، توسط برنامهء soxmix وجود داره. البته بعضی مشخصات فایلهای ورودی در این حالت باید باهم یکی باشه؛ مثلا sample rate و data type اونها.

مثالها:


sox ~/.add/oo.ogg -t alsa default synth 2 square 2000-100

این فرمان صوتی با فرکانس ۲۰۰۰ هرتز رو تولید میکنه که در مدت ۲ ثانیه به ۱۰۰ هرتز میرسه. شکل موج صوت از نوع مربعی هست؛ مواظب باشید که به این علت صدای بلند و کاملا تیزی رو تولید میکنه! ولوم اسپیکرهای خودتون رو کم کنید که یک وقت از اهل خانواده بد و بیراه دریافت نکنید!!
توجه کنید فایل ورودی در این حالت تقریبا هیچ نقشی نداره اما مبجور به ذکر اون هستیم. البته طول/مدت زمان صدای این فایل باید حداقل به اندازهء زمانی که برای خروجی درنظر گرفتیم باشه، و این تنها خصیصه ای هست که مهم/موثر هست. البته تکرارهایی که بوسیلهء افکت repeat انجام میشن به این زمان اضافه نمیشن.
این فایل ورودی رو هم میتونید با همین برنامه خیلی راحت تولید کنید.



sox ~/.add/oo.ogg -t alsa default synth 1 square 500-3000 repeat 2

صوتی با فرکانس از ۵۰۰ تا ۳۰۰۰ در مدت یک ثانیه؛ این جریان دوبار هم تکرار میشه و بنابراین ما سه تا از این صوت یک ثانیه ای رو خواهیم داشت.


sox ~/.add/oo.ogg -t alsa default synth square 350

صوتی با فرکانس ۳۵۰ که به اندازهء طول فایل ورودی هست.
جلوی synth زمان مورد نظر به ثانیه رو بدید یا بصورت hh:mm:ss.frac.


sox file1.wav file2.ogg

فایل شمارهء یک با فرمت wav در فایل شمارهء دو با فرمت ogg ذخیره میشه.
تبدیل فرمتها به همدیگه میتونه به همین سادگی باشه و برنامه از روی پسوندهایی که میشناسه فرمت مورد نظر رو شناسایی میکنه. اگر پسوند کارگر نشه فکر میکنم اقدام به تلاش برای شناسایی از طریق هدرهای فایل بشه. اگر موفق نباشه باید پارامترهای نوع فایل رو در خط فرمان به برنامه بدید.
ضمنا بدیهی هست که برای تبدیل، برای مشخصات مختلف فایل (مثل sample rate و data type) از مقادیر فایل اول، مقادیر پیش فرض و انتخاب خودکار استفاده میشه، مگر اینکه شما مقدارهای دیگری رو در خط فرمان صریحا مشخص کنید.
ogg فرمتی هست که میشه اون رو جایگزین مناسبی برای فرمت انحصاری mp3 دونست. فشرده سازی و کیفیتی مشابه یا نزدیک (گویا کمی بیشتر) ام پی تری داره.


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

راستی اگر اون فرمانهای ساخت صدای بالا روی سیستم شما کار نکرد، بجای -t alsa default یک فایل خروجی بدید، و بعدش فرمان پخش اون فایل رو میتونید بدید. مثلا:


sox ~/.add/oo.ogg out.wav synth 1 square 100-350; play out.wav

نکته اینکه، فرمان play هم که در اینجا آمده، درواقع شل اسکریپتی هست که sox رو بکار میگیره. بنابراین تمام فرمتهای اون رو پشتیبانی میکنه؛ وگرنه با فرمان aplay میتونید فایلهای wav رو پخش کنید.


soxmix music.wav voice.wav mixed.wav

میکس کردن با استفاده از soxmix. از خط فرمان واضح و مبرهن است که فایل موسیقی و فایل صدای آدمیزاد ! باهم میکس/مخلوط شده و در فایل آخر، یعنی mixed.wav، ذخیره میشن.
هرچندتا فایل رو که بخواید میتونید با این روش میکس کنید. آخرین فایل، فایل خروجی و مخلوط تمام فایلها هست.
ضمنا ظاهرا موقع میکس کردن میتونید افکتها و تنظیمات مختلفی رو برای هر فایل بطور جداگانه اعمال کنید!
بهرحال بنده وارد جزییات اینها نمیشم و بیشتر موضوع درمورد برنامه sox هست که باهاش بیشتر کار و بسیاری گزینه هاش رو تست کردم.

این برنامه کارهای بیشتری میکنه و هرکدوم از این کارها هم با گزینه ها و خصوصیات مختلفی قابل انجام هستن (فرضا موج مثلثی، سینوسی، ... و حتی انواعی از noise !! بجای مربعی در افکت synth - حذف نویز ...).

خب دوستان اگر بنده چیز مهمی رو یادم رفته/از قلم انداختم لطفا تذکر بدید.
با تشکر از توجه شما.

Folaani
چهارشنبه 16 آبان 1386, 20:27 عصر
بعضی کارها رو در شل لینوکس با یک خط فرمان میشه انجام داد؛ اما نتیجه واقعا مهم و موثر هست و شاید به این راحتی ها نشه در رابط گرافیکی معادلی براشون گیر آورد؛ یا شاید اصلا نباشه.
یک نکته ای رو باید دقت کرد که شل درواقع یک ابزار برنامه نویسی هم هست و زبان برنامه نویسی ای درش تعبیه شده:


What is a shell?

At its base, a shell is simply a macro processor that executes commands. A Unix shell is both a command interpreter, which provides the user interface to the rich set of GNU utilities, and a programming language, allowing these utilitites to be combined. Files containing commands can be created, and become commands themselves. These new commands have the same status as system commands in directories such as `/bin', allowing users or groups to establish custom environments.

منبع: رفرنس رسمی BASH
(This is Edition 2.5b, last updated 15 July 2002, of The GNU Bash Reference Manual, for Bash, Version 2.05b)

پس اینکه انتظار داشته باشیم تمام قابلیتهای شل و کاربردهاش رو در برنامه های با رابط گرافیکی معادل ببینیم، انتظار تقریبا عبث و بی معنایی هست. چون به این معنا، شل یک روش قدیمی برای انجام همهء کارها نیست، بلکه یک ابزار برنامه نویسی مخصوص تعبیه شده در سیستم عامل هست که مثل زبانهای برنامه نویسی دیگه (مثلا سی++، جاوا، بیسیک...) همیشه بوده و هست و احتمالا خواهد بود. نقص یک سیستم عامل در شل و یوتیلیتهای خط فرمان لازم، نقصی اساسی هست.
بطور کلی رابطهای گرافیکی اغلب برای انجام مجموعه کارهایی خیلی معمول، روزمره، مشترک، و نسبتا ساده (اما ممکنه تکراری و خسته کننده) ساخته شدن، و انجام کارهای ترکیبی و پیچیده و بصورت ساختار یک برنامه در حیطهء وظایف و گاهی حتی ظرفیتشون نیست (یعنی تقریبا غیرممکن هست - مثل اینکه شما بخواید کلا بصورت ویژوال یک برنامه نویسی واقعی بکنید و دست به کدنویسی نبرید و با اینحال با این روش همه گونه برنامهء سفارشی کاملی رو بسازید).
پس شل و محیط گرافیک مکمل همدیگر هستن. میشه گفت که شل بیشتر کارها رو میتونه انجام بده، درحالیکه رابط گرافیکی چنین نیست. اما از سویی انجام یکسری کارها با استفاده از محیط گرافیکی سرعت و راحتی بسیار بیشتری داره.
در قدیمترها که رابط گرافیکی نبود یا خیلی کمیاب تر و بدوی تر بوده، اجبارا تمام یا بیشتر کارها با رابط خط فرمان و محیط متنی انجام میشده، اما بعدا بسیاری کارها در رابط گرافیکی هم قابل دسترس شدن و انجام بسیاری کارها اغلب با خصوصیات مذکور در بالا، در رابط گرافیکی ممکن و معمول شد. بعضی اشتباها نتیجه گرفتن که شل یک روش قدیمی و منسوخ بوده برای انجام تمام/بیشتر کارها. درحالیکه عملا اینطور نیست. بلکه محیط گرافیک مکمل مناسبی برای شل شد. ضمنا اگر منظور از تمام یا بیشتر کارها، کارهای یک کاربر عادی خانگی و غیرمتخصص باشه، میشه گفت بله تاحدود زیادی!
اما برای کاربرهای حرفه ای و متخصص شل ابزاری غیرقابل جایگزینی هست و حتی خیلی وقتها رابط محبوب و ترجیح داده شده که خیلی کارها رو باهاش سریعتر و راحتتر از یک رابط گرافیکی انجام میدن (چون به اون راحتی با یک رابط گرافیکی امکان پذیر نیستن).
یک کاربر عادی خانگی خیلی کارها رو به روش خودش نمیتونه انجام بده و خیلی مسایل رو حل کنه یا بصورت خودکار دربیاره. خب این مسلم هست؛ مثل مقایسهء یک برنامه نویسی حرفه ای با یک اپراتور ساده.

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

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


echo -e "new line at begining.\n$(cat file.txt)\nnew line at end." > file.txt

خب این خط فرمان چیکار میکنه؟
پاسخ: یک خط مورد نظر رو به ابتدا و یک خط دیگه رو به انتهای یک فایل متن اضافه میکنه.
در این خط فرمان برخلاف دو مورد قبلی که مطرح شد، بیشتر از قابلیتهای شل (BASH) استفاده شده و تنها برنامهء بکار رفته که برنامهء ساده ای هست، برنامه ای بنام cat هست که برای چاپ کردن و استخراج کل محتویات فایلها بکار میره.
با اینطور فرمانها میشه تعداد زیادی فایل رو با یک خط فرمان با سرعت زیادی آپدیت کرد (البته برای تعدادی فایل، تغییرات کوچکی در هرمورد لازم هست - این فرمان درج شده روی یک فایل عمل میکنه). فرضا تعداد زیادی فایل اچ تی ام ال داریم که حالا یادمون افتاده که خطی به ابتدا یا انتها یا هردو قسمت اونها اضافه کنیم؛ مثلا یک کامنت.

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


umount /dev/hdc; cdrdao disk-info --device /dev/hdc

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

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

اگر این فرمان در سیستم شما کار نمیکنه، احتمالا باید /dev/hdc رو با مسیر مربوط به درایو مورد نظر خودتون جایگزین کنید.

Folaani
یک شنبه 20 آبان 1386, 22:06 عصر
از قضا در این پست هم به بررسی یک برنامهء خط فرمان میپردازیم.
اسم این برنامه bc هست و چنانچه در سیستم شما نصب شده باشه با همین نام در خط فرمان اجراش کنید. البته بحث ما درمورد پیاده سازی GNU این برنامه هست.


`bc' is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language. A standard math library is available by command line option. If requested, the math library is defined before processing any files. `bc' starts by processing code from all the files listed on the command line in the order listed.


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

فایلهایی رو محتوی دستورات نوشته شده با این زبان (که میتونن بسادگی نوشتن جمع و تفریق تا حلقه و شرط و گرفتن ورودی از کاربر باشن) میشه در خط فرمان به این برنامه پاس کرد، در نهایت وارد خط فرمان این برنامه میشیم که در اونجا میتونیم عملیات ساده مثل چهار عمل اصلی، تا عملیاتی پیچیده تر و چند مرحله ای رو انجام بدیم. چنانچه این برنامه رو با آپشن l فراخوانی کرده باشیم یک سری توابع ریاضی استاندارد مثل سینوس و کسینوس و لگاریتم طبیعی و چند تابع دیگه لود شده و در برنامه در دسترس قرار میگیرن.
تا اینجا تنها گفتیم که این برنامه عملیات ریاضی انجام میده و البته یک زبان برنامه نویسی مخصوص و خیلی مختصر (دربرابر زبانهای با کاربرد برنامه نویسی عادی) برای انجام برنامه های مخصوص محاسباتی چند مرحله ای درش تعبیه شده؛ اما نکتهء دیگه ای که ذکرش در اینجا لازم بنظر میرسه اینه که با این برنامه میشه روی اعداد بسیار بزرگ و همچنین با دقت (تعداد ارقام اعشار) بسیار زیاد کار کرد. محاسبات شما میتونن اعداد فوق العاده بزرگ و فوق العاده دقیقی رو تولید کنن.
شما در این برنامه حلقه دارید، شرط، تابع، متغییر (دو نوع معمولی و آرایه)، عملگرهای مقایسه ای و منطقی (البته نتیجه برگردانده شده، بجای true و false، صفر و یک هست)، و یکسری تابعهای مخصوص از پیش تعریف شده و همچنین توابع ریاضی ای که گفتیم با آپشن l در دسترس قرار میگیرن.
ضمنا مقادیر ورودی و خروجی این برنامه میتونن در مبنای تعیین شده توسط شما باشن. حالت پیشفرض، مبنای ۱۰ برای ورودی و خروجی هست.

خب وقت مثال رسیده:

pi=$(echo "scale=10; 4*a(1)" | bc -l)
این مثال از خود منوال هست.
توجه کنید که این فرمان رو در خط فرمان شل نوشتیم و اجرا کردیم، و نه در خط فرمان bc.
کاری که این دستور میکنه اینه که فرامین محاسباتی مناسبی رو که جهت محاسبهء عدد پی با ده رقم اعشار هست به برنامهء bc ارسال میکنه و نتیجهء نهایی در متغییر شل pi قرار میگیره (با دستور echo $pi میتونید مقدارش رو در خط فرمان شل ببینید).
فرامین مورد نظر ارسالی، دو فرمان هستن که با سمیکالن از هم جدا شدن.
فرمان scale=10 به bc میگه که محاسبه با دقت ده رقم اعشار رو میخواد
فرمان بعدی 4*a(1) هست که معناش ضرب ۴ در آرک تانژانت ۱ هست، که عدد پی رو نتیجه میده. توجه کنید که بعلت استفاده از این تابع، bc رو با آپشن l که توابع استاندارد ریاضی رو لود میکنه اجرا میکنه، فراخوانی کردیم.
bc این فرمانها رو اجرا کرده و خروجی خودش رو به خروجی استاندارد که صفحه‌ ترمینال هست میفرسته.
ساختارویژهء شل، یعنی علامت دلار در ابتدای پرانتز باز و بسته، که کل این فرامین رو احاطه کرده، باعث میشه که هر خروجی استاندارد تولید شده در داخل این پرانتزها، بجای کل این ساختار قرار بگیره، مثل اینکه اونجا تایپ شده باشه. با این روش مقدار خروجی bc بجای چاپ شدن، در متغییر pi قرار میگیره. به این ساختار مفید و پرکاربرد شل، Command substitution گفته میشه.
البته فرم دیگر این ساختار (فرم قدیمی اون)، قرار دادن فرامین مورد نظر در علامتهای Back tick هست (`).

خب حالا ما وارد bc میشیم:


[root@localhost ~]# bc -l
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

و در خط فرمانش، دستوراتی رو اجرا میکنم:


scale
20
مقدار دقت (ارقام اعشار) رو بررسی میکنیم؛ خروجی ۲۰ یعنی تعداد ارقام اعشار ۲۰ است. چون bc رو با آپشن l فراخوانی کردیم دقت اعشاری داریم، ولی بدون این آپشن مقدار پیشفرض برای scale صفر هست. یعنی خروجی نتیجهء بعضی محاسبات (تقسیم) بطور معمول بصورت صحیح هست. بنابراین شما در هنگام استفاده از این برنامه (bc) با پاس کردن فرمانها بهش یا در داخل فایلهای نوشته شده با این زبان که میخواید نتایج اعشاری با دقت دلخواه داشته باشید، باید فرمان scale=x رو بدید، که ایکس تعداد ارقام اعشار مورد نظر شما هست.


scale=50
456/3.3
138.1818181818181818181818181818181818181818181818 1818
تعداد ارقام اعشار رو ۵۰ قرار میدیم (۲۰ تا کم بود برامون!!)
محاسبهء ۴۵۶ تقسیم بر ۳.۳.
نتیجه رو با ۵۰ رقم اعشار ملاحظه میفرمایید.


scale(456/3.3)
50
تابع ویژهء scale، تعداد ارقام اعشار یک محاسبه یا عدد رو برمیگردونه.


scale(5.54*2.4)
3
scale(5/2)
50
scale(4/2)
50
خواستم بگم اگر از اینطور توابع ویژه استفاده میکنید به این تفاوتهای ظریف توجه داشته باشید. این تابع بسادگی تعداد همون ارقام اعشاری رو که در حالت عادی نمایش داده میشه برمیگردونه، گرچه همه صفر باشن!



2^3000
12302319221611171769315588132767525146407138957368 337157661180291600\
58800614672948775360067838593459582429649254051804 908512884180898236\
82358508248206534833123495935035584501741302332011 136066692262472823\
97568804164344783156936750134130907572086903767932 966588106629418244\
93488451726505303712916005346747908623702673480919 353936813105736620\
40235274477690384047788365110032240930198348836380 293054048248790976\
34840982539407286851320444088637347542712125924717 786439494866885117\
21051561970432780747454823776808464180697103083861 812184348565522740\
19579668262220551184551208055201031005025580158934 964592800113374547\
42207150136834139075427790637598338761013542351842 450966700421607206\
29411581502371248008430447184842098610320580417992 206662247328722122\
08851364368390767036020916265367064113093699700217 050067550137472399\
87660058275793007232534748906122501351718891748990 799112915123997738\
72178519018229989376
دو به توان ۳۰۰۰.


length(2^3000)
904
خب، کنجکاو شدیم ببینیم عدد قبلی چند رقمی بوده!
تابع ویژهء length، تعداد ارقام بکار رفته در عدد یا نتیجهء محاسبه ای رو برمیگردونه.


length(5/2)
51
توجه کنید که اگر عدد اعشار داشته باشه، اعداد بعد از اعشار هم به حساب میان؛ نقطهء اعشار شمرده نمیشه.


(2994563.034*((3-5.04)^-10)*sqrt(456))/-.23
-222733.9250047657708432689434658077776431986131019 8677173
یک عبارت پیچیده تر پرانتز گذاری شده که قابلیت محاسبهء توان و جذر رو هم بکار گرفته.


define f (x) {
if (x <= 1) return (1);
return (f(x-1) * x);
}
f(100)
93326215443944152681699238856266700490715968264381 621468592963895217\
59999322991560894146397615651828625369792082722375 825118521091686400\
0000000000000000000000
تعریف تابع فاکتوریل (از نوع بازگشتی)، و محاسبهء مقدار ۱۰۰ فاکتوریل با استفاده از این تابع.
در مثالهای قبلی هم دیدید که خطهای طولانی شکسته میشن و در انتهای خطوط شکسته شده بک اسلش قرار میگیره. البته طول سطرهای خروجی قابل تنظیم هست (با متغییر محیطی (در شل) BC_LINE_LENGTH):


[root@localhost ~]# BC_LINE_LENGTH=25; export BC_LINE_LENGTH; echo '2^1024' | bc
17976931348623159077293\
05190789024733617976978\
94230657273430081157732\
67580550096313270847732\
24075360211201138798713\
93357658789768814416622\
49284743063947412437776\
78934248654852763022196\
01246094119453082952085\
00576883815068234246288\
14739131105408272371633\
50510684586298239947245\
93847971630483535632962\
4224137216
یک مثال برای مشخص کردن چگونگی تعیین طول خطهای خروجی. البته معمولا طول خطوط رو نیاز داریم به دلایل مختلفی افزایش بدیم و نه کاهش، ولی اینجا برای نشان داده شدن مثال، طول خطوط رو کم کردیم.


scale=10
obase=2
456/3.3
10001010.0010111010001011101000101110100010
تعداد ارقام اعشار رو روی ۱۰ قرار میدیم.
مبنای خروجی رو روی ۲ قرار میدیم.
فرمان محاسبهء 456 تقسیم بر 3.3 رو صادر میکنیم.
نتیجه در مبنای ۲ مشاهده میشه.
قابل توجه هست که تعداد ارقام اعشار، در مبنای ده سنجیده میشه و نه مبنای خروجی.


obase=1010
10001010.0010111010001011101000101110100010
138.1818181817652657628059387207031250
مبنای خروجی رو ۱۰ قرار میدیم. توجه کنید که چون مبنای ورودی رو روی ۲ گذاشته بودیم، هر عددی که وارد میکنیم بعنوان عدد مبنای دو دیده میشه و بنابراین ما باید عدد ۱۰ رو هم به مبنای ۲ وارد کنیم. پس همینطور برای تغییر مبنای ورودی هم باید عدد مبنای مورد نظر رو در مبنای فعلی ورودی وارد کرد.
حالا میتونیم ببینیم عدد مبنای ۲ محاسبهء قبلی، در مبنای ۱۰ چی میشه.


obase=10
length(10001010.0010111010001011101000101110100010 )
100101
obase=1010
100101
37
مبنای خروجی رو روی ۲ قرار میدیم.
طول عدد رو مجددا در این حالت بررسی میکنیم.
مبنای خروجی رو مجددا به ۱۰ میبریم.
طول بدست آمده در مبنای ۲ رو وارد کرده و حاصل رو در مبنای ۱۰ دریافت میکنیم.
پس به این نتیجه میرسیم که طول یا درواقع تعداد ارقام هر عدد پاس شده به این تابع، همواره برابر تعداد ارقام اون عدد در مبنای ۱۰ هست (در واقع این عملکرد در تابعهای دیگه هم دیده میشه؛ پس حواستون به این مسئله باشه).



obase=1010
ibase=1010
خب دیگه خسته شدیم! مبناهای ورودی و خروجی رو به ۱۰ برمیگردونیم.


scale=3
2.000000000001*2
4.000000000002
2.0000000000000*1
2.0000000000000
توجه کنید که بعضی حالات مثل این (ضرب)، چنانچه دقت اعداد ورودی ما بیشتر از مقدار scale باشه، دقت مقدار ورودی مورد استفاده قرار میگیره و نه scale.


f=1; for(i=1; i<=10; i++) f*=i; f
3628800

محاسبهء ۱۰ فاکتوریل با استفاده از حلقهء for.


ibase=16
FF
255
نکته: در مبنای ورودی بالاتر از ۱۰ (مبنای ورودی حداکثر تا شانزده امکان داره)، از حروف بزرگ A تا F برای نمایش ارقام بزرگتر از ۹ استفاده کنید.


obase=17
100
05 15
در مبناهای خروجی بالاتر از ۱۶، معادل هر رقم در اون مبنا، در مبنای ۱۰ و در یک ستون مجزا نوشته میشه.
۵ * ۱۷ + ۱۵ = ۱۰۰

خب فکر کنم کافی باشه!
برای اطلاع دقیقتر از این برنامه و زبان مخصوصش و نکات و قابلیتهای کاملش، به منوالش مراجعه کنید.
در خط فرمان info bc، در آدرسبار مرورگر/فایل منیجر کانکرر info:bc یا صورت اختصاری ##bc رو، برای دستیابی به منوال این برنامه میتونید بکار ببرید.

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

Folaani
چهارشنبه 23 آبان 1386, 12:54 عصر
بازم یک برنامهء جالب دیگه، و البته مختصر، رو معرفی میکنیم: text2wave

قبل از هر چیز تذکر بدم (نمیدونم قبلا گفتم یا نه) که تمام این تستها و تجربیات و برنامه ها در این محیط انجام شده و نتایجش دراختیار شما سروران گرامی قرار گرفته: Fedora 5 GNU/Linux
چون بعضا بین توزیعها و حتی نسخه های مختلف یک توزیع تفاوتهای ریز و درشتی میتونه باشه. البته نه لزوما به معنای ناسازگاری، اونهم در چنین مواردی. بلکه بیشتر یکسری پیکربندیها، برنامه های نصب شده، و ویژگیهای اونها هست. بهرحال گنو/لینوکس یک محیط حرفه ای و مجهز و بسیار غنی هست، و بهای این مزایا نیاز به حداقل کاربر حرفه ای هست. متخصصان و برنامه نویسان طراز اول و هکرها هم که مشخصه این محیط براشون ایدئال هست (حتما شنیدید که میگن گنو/لینوکس بهشت برنامه نویسان!).
پس کاربر باید بتونه از پس حل این تفاوتها و نصب برنامه ها و پیدا کردن پیکربندیهای هر محیط و ویژگیهای اختصاصی هر نسخه و توزیع و برنامه بربیاد.

خب کار این برنامهء text2wave چیه؟ از اسمش باید پیدا باشه. یک متن رو گرفته و به صوت تبدیل میکنه که میشه این صوت رو در یک فایل ذخیره کرد یا بطور مستقیم پخشش کرد.

تست کنید:

echo 'On the fly' | text2wave | aplay
عبارت پاس شده تبدیل به صوت شده و مستقیما پخش میشه.


echo 'On the fly' | text2wave -o ~/Desktop/out.wav; aplay ~/Desktop/out.wav
عبارت پاس شده تبدیل به صوت شده و در فایلی در دسکتاپ شما ذخیره شده (~ در شل یونیکسی به معنای Home directory کاربر جاری هست) و سپس این فایل پخش میشه (بنابراین اگر نمیخواید الان پخش بشه، میتونید فرمان aplay ~/Desktop/out.wav رو بر دارید).

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

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


file $(type -p command);
اگر این فرم کار نکرد، فرم دیگش رو بکار ببرید:

file `type -p command`

بجای command شما اسم برنامهء مورد بررسی خودتون رو قرار میدید و این فرمان بهتون اطلاعات مفیدی راجع به اون برنامه میده؛ البته درصورت موفقیت (بعضی حالات جواب نمیده؛ مثل Shell builtin ها).
مثال:


[root@localhost ~]# file `type -p sh`
/bin/sh: symbolic link to `bash'

[root@localhost ~]# file `type -p text2wave`
/usr/bin/text2wave: Bourne shell script text executable

[root@localhost ~]# file $(type -p festival)
/usr/bin/festival: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

اگر بخواید میتونید این فرمان رو به یک تابع تبدیل کنید (کاری که خودم تاحالا نکرده بودم و حالا کردم!):


what () { file $(type -p $1); };
میتونید این تابع رو در .bashrc قرار بدید تا با هر بار ورود به یک ترمینال با شل BASH، بطور خودکار این تابع هم تعریف شده و در دسترس قرار بگیره.
بعد بجای تایپ کردن اون خط فرمان قبلی، بسادگی اینطور این تابع رو بکار میبرید:


what command
مثال:

[root@localhost ~]# what file
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

حالا که صحبتش کشیده شد، به فرمان مفید file هم میپردازیم.
این فرمان (یک برنامه هست) نوع فایلهای پاس شده بهش رو با بررسی قسمتهایی از محتویات و هدرهای اون فایلها مشخص میکنه. شناسایی فایل بدون توجه به پسوند و خصیصه های دیگرش و تنها از روی محتویات انجام میشه؛ ضریب قطعیت و تعیین و خطاناپذیری ۱۰۰٪ نیست با این روش (چرا که استاندارد عام و تعهد وجود تمهیدات ویژه و بطور مثال شناسه های یکتا در داخل فایلها برای شناسایی اونها از طریق محتویات وجود نداره!)، اما بقدر کافی اطمینان و کاربرد داره برای بیشتر کارها و میتونه در مواقعی بسیار مفید باشه (بطوریکه بنده به Context menu ی KDE هم اضافه کردمش).
اگر لازم باشه شما حتی میتونید انواع جدیدی از فایلهای مورد نظر خودتون رو در دیتابیس مخصوص این برنامه تعریف کنید تا برنامه قادر به شناسایی اونها هم باشه؛ البته نیاز به خوندن منوال مربوطه (file وmagic) هست و یادگرفتن زبان تعریف محتویات مورد بررسی برای تشخیص فایلها.
این برنامه، انواع فایل از سورسهای برنامه نویسی تا فرمتهای تصویری مختلف و حتی فایلهای اجرایی ویندوز رو تشخیص میده. به این روش میتونید براحتی از محتویات واقعی یک فایل اطلاع حاصل کنید، بدون اینکه پسوند یا مشخصات دیگرش درست یا گویا باشن.

Folaani
شنبه 26 آبان 1386, 15:09 عصر
بازهم معرفی یک برنامهء خط فرمان.
نام این برنامه xwd هست. فکر میکنم برخلاف یکسری برنامه هایی که قبلا مطرح شدن، این برنامه در اکثر توزیعها باید موجود و نصب باشه بطور پیشفرض.
با این برنامه میشه اسکرین شات گرفت.


Xwd is an X Window System window dumping utility. Xwd allows X users to store window images in a specially formatted dump file. This file can then be read by various other X utilities for redisplay, printing, editing, formatting, archiving, image processing, etc. The target window is selected by clicking the pointer in the desired window.

یک برنامهء مکمل دیگه هم هست که تصاویری رو با فرمتی که برنامهء xwd ایجاد میکنه، میتونه نمایش بده و ما در مثالهامون از این برنامه کمک میگیریم برای تست سریعتر. اسم این برنامهء نمایش دهنده، xwud هست.

خب سریع میریم سر مثالهای عملی:



xwd | xwud
این فرمان رو وقتی صادر کنید، برنامه منتظر میمونه تا شما روی بخشی از صفحه کلیک کنید؛ وقتی کلیک کردید تصویر اون پنجره ای که روش کلیک کردید گرفته میشه (حتی پنل شما یک پنجره به حساب میاد در این حالت). در حالت پیشفرض xwd خروجی خودش رو به stdout یا خروجی استاندارد که معمولا ترمینال هست میفرسته. مشخصه که شما روی ترمینال چیزی جز مقدار زیادی کاراکترهای عجیب و غریب که نتیجهء خروجی باینری هست نمی بینید.
پس ما در این خط فرمان این خروجی رو به برنامهء xwud پاس کردیم و این برنامه تصویر رو به شما نشون میده. برای خروج از این برنامه باید روی تصویر نمایش داده شده کلیک کنید. یا میتونید کلید q یا Ctrl+c رو بزنید و یا پنجره رو با کلیک روی دکمهء مربوطه ببندید. پس از بسته شدن این پنجره، خط فرمان تازه برمیگرده.
البته نمایش یک تصویر به اینصورت برای ما فایدهء چندانی نداره (چون جایی ذخیره نمیشه) و بیشتر به منظور تست و نمایش کاربردهای مختلف xwd با تنظیمات مختلف، اینجا بکار میبریمش.


xwd -frame | xwud
این فرمان فرقش با قبلی اینه که تصویر فریم پنجره رو هم میگیره (فریم چهارچوب دور یک پنجره هست که مثلا دکمهء X یا همون Close روش هست).


xwd -name 'StarDict' | xwud
این فرمان از پنجره ای با عنوان (Title) مشخص که StarDict هست (یک دیکشنری بسیار خوب برای لینوکس که دیتابیس فارسی خوبی هم براش تهیه شده) تصویر گرفته و نمایش میده.
شما عنوان هر پنجره ای رو که بدید از همون تصویر گرفته میشه. و پنجره باید مریی/حاضر باشه.



xwd -name 'StarDict' | xwud -scale
این فرمان هم تنها فرقش اینه که آپشن -scale رو به xwud دادیم که باعث میشه بعد از نمایش تصویر بشه سایز پنجره رو به دلخواه تغییر داد و تصویر درون اون به همون شکل کشیده یا منقبض بشه.


xwd -out ~/Desktop/out.xwd
با پارامتر آپشن -out به xwd میگیم که تصویر رو در فایلی به نام out.xwd، روی دسکتاپ کاربریمون ذخیره کنه.
برای نمایش این تصویر توسط xwud هم به این صورت عمل میکنیم:

xwud -in ~/Desktop/out.xwd

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

xwd -out ~/Desktop/out.xwd; xwud -in ~/Desktop/out.xwd

خب اما این فرمتی که تصاویر ما درش ذخیره میشه، توسط هر برنامه ای قابل خواندن و استفاده نیست. میتونیم با استفاده از هر برنامهء ویرایش و تبدیلی که این فرمت رو پشتیبانی میکنه، تصویر رو به فرمت متداول و ضمنا فشرده ای در بیاریم. توجه کنید که فرمت xwd فشرده شده نیست و مثل تصاویر BMP، حجم زیادی داره.

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


xwd -out ~/Desktop/out.xwd; convert ~/Desktop/out.xwd ~/Desktop/out.png; rm -f ~/Desktop/out.xwd; display ~/Desktop/out.png
تصویری از پنجرهء کلیک شده گرفته میشه؛ تصویر به فرمت png تبدیل میشه؛ فایل حجیم و بی استفادهء xwd که در مرحلهء اول ایجاد شد پاک میشه؛ تصویر توسط برنامهء display (اینهم جزیی از پکیج ImageMagick هست) نمایش داده میشه.
راستی ظاهرا با کلیک روی این تصویر نمایش داده شده، میتونید ویرایشهایی رو روش اعمال کنید. (البته دیگه هیچ ربطی به این تاپیک که دربارهء خط فرمان و برنامه های خط فرمان هست نداره).


xwd -root | xwud
ببخشید، فراموش کرده بودم که فرمان اسکرین شات (از کل صفحهء نمایش) رو بگم؛ این همون فرمان هست.

جالب اینکه حتی برنامهء display هم میتونه ورودی خودش رو از stdin (ورودی استاندارد ترمینال) بگیره:

xwd -root | display

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

تا مجالی دیگر بدرود.

Folaani
دوشنبه 28 آبان 1386, 19:05 عصر
خب فکر کنم فعلا دیگه از دست معرفی صرف برنامه های مفصل راحت شدیم و کمی میپردازیم به معرفی کاربردهای مفیدی که عملا از بعضی برنامه ها و امکانات محیط شل بدست آوردیم. بقول معرف کارهای هر روزه.
این مبحث دیگه تجربه و نیاز هرکس هست و چیزهایی که بنده میگم تنها نمونه های کوچکی از نیازهای خودم هست، نه چیز دیگه، که برای نشون دادن کاربردهای عملی و مستند خط فرمان و شل و برنامه های کامل و قدرتمند گنو/لینوکس ذکر میکنم.
اینها میتونن قدرت کاربری و استفادهء بهینهء شما از سیستم رو بشدت افزایش بدن (بیشتر برای متخصصان و برنامه نویسها البته) و متوجه میشید که چطور میشه از مزایای برنامه نویسی حرفه ای در محیط غنی گنو/لینوکس بهره برد. چون بخش بزرگی از این غنا در واقع در پشت خط فرمان پنهان شده.

بعنوان مثال این فرمان رو یک زمانی برای تست ارسال ایمیل در پی اچ پی بصورت لوکال بکار میبردم؛ مقداری تست راجع به Header Injection لازم داشتم که با این فرمان به سرعت و سادگی و با خودکار کردن یکسری عملیات تکراری انجام میدادم. پس این فرمان فقط یک نمونه از برتری و کاربردهای بجای خط فرمان در مقابل رابط گرافیکی رو نشون میده و لزوما مورد عمومی یا مورد نیاز شما نیست:


alias chkmail='clear; echo %%%%%%%%%%; mailx -u test </dev/null; echo "%%%%%%%%%%"; mailx -u test2 </dev/null; echo %%%%%%%%%%; if [[ -n $(ls /var/mail/) ]]; then rm -f /var/mail/*; else echo There are no files in mail directory!; fi'

البته تذکر بدم که این فرمان بصورت سردستی و برای یک کاربرد موردی، با سرعت نوشته شده و لزوما بهینه ترین حالت و خیلی هوشمندانه نوشته نشده.
این فرمان یک alias با نام chkmail درست میکنه؛ یعنی در هربار فقط با اجرای فرمان chkmail تمام فرمانها و عملیاتی که به این نام اختصاص داده شده اجرا میشه. اگر از پست قبلی یادتون باشه، کاربرد alias، خیلی شبیه به توابع شل هست. اما بهرحال تفاوتهایی دارن، و بنابراین هرکدوم موارد کاربرد و یا ترجیح خاص خودشون رو دارن.
فرمانهایی رو که به این alias اختصاص داده شدن به ترتیب ذکر میکنم (فرمانها با سمیکالن از هم جدا شدن).
- ابتدا صفحه پاک میشه. برای تر و تمیزی و راحتی چشم و اشتباه نشدن با خروجیهای قبلی خیلی مفید هست.
- بعد یک خط جداکننده چاپ میکنیم که بازهم در کار نظم و خوانایی کمک خوبی هست.
- صندوق ایمیل کاربری بنام test رو چک میکنیم (یک کاربر عادی سیستم هست). اگر ایمیل یا ایمیلهایی داشته باشه توسط برنامهء mail با مقداری اطلاعات، مثل عنوان ایمیل، چاپ میشه.
- باز یک خط جداکنندهء دیگه چاپ میکنیم.
- صندوق ایمیل (Inbox) کاربر دیگر بنام test2 رو هم با برنامهء mail تست میکنیم؛ نکته اینکه روی سیستم بنده mailx یک سیمبلیک لینک (symbolic link - تقریبا معادل فایلهای شورتکات ویندوزی) به برنامهء mail بود، اما توجه داشته باشید که باوجود یکی بودن برنامهء هدف، گاهی ممکنه فراخوانی یک برنامه با نامهای مختلف نتایج مختلفی رو دربر داشته باشه (مثلا به علت رعایت استانداردهای مختلف و تطابق رفتار با نسخه های مختلف یک برنامه یا برنامه های متفاوتی که ممکنه در یک برنامه ادغام شده باشن).
توجه کنید که ورودی استاندارد برنامهء mail رو از /dev/null (دیوایس تهی؛ معادل nul در داس و فکر میکنم شل ویندوز) به اصطلاح ریدایرکت کردیم که باعث میشه برنامه تنها با گزارش لازم خارج بشه و داخل خط فرمان برنامهء mail باقی نمونیم (که نیاز به ورودی دستی برای خروج داره). البته گاهی برنامه ها ممکنه خودشون تمهیداتی برای این نوع عملیات داشته باشن و نیازی به اینکار نباشه و از طریق آپشنهای برنامه با فرم تمیزتر و استانداردی قابل انجام باشه.
- چک میکنیم که دایرکتوری ذخیرهء ایمیل ها حاوی فایل (هایی) هست یا خیر (ایمیلهای هر کاربر در فایلی با نام کاربری خودش در این دایرکتوری ذخیره میشن). مکانیزم این فرمان و تست شرط رو دیگه توضیح نمیدم؛ به رفرنس-منوال BASH مراجعه کنید.
- اگر ایمیل وجود داشت (درواقع ادامهء فرمان و ساختار شرط قبلی هست) تمام فایلهای ایمیل رو پاک میکنیم. توجه کنید که کل محتوای دایرکتوری ایمیل پاک میشه. این خط فرمان ساده سردستی و با استفادهء موردی نوشته شده؛ براحتی میشه کاملتر و هوشمندترش کرد. خلاصه گفتم نکنه یک وقت با این فرمان تمام ایمیلهای روی سیستمتون رو (تمام کاربران) پاک کنید و فردا به بنده بد و بیراه بگید!! بنده سیستم تک کاربره ای دارم و سیستم مثلا سرور نیست؛ بنابراین میتونم براحتی هرچی داخل دایرکتوری هست، که برای تست هم ایجاد شدن، پاک کنم.
- بازهم ادامهء فرمان شرطی هست که اینبار درصورت عدم صحیح بودن شرط، یعنی درصورت عدم وجود فایل در دایرکتوری ایمیل، اجرا میشه و بسادگی پیغامی رو مبنی بر خالی بودن دایرکتوری میل چاپ میکنه تا دقیقا بفهمیم وضعیت چی بوده (و مثلا اشتباها ایمیلی به کاربر دیگه ای ارسال نشده)، وگرنه از خروجی چاپ شده توسط برنامهء mail هم میشه بیشتر اطلاعات لازم رو فهمید.

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

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

mail user
user نام کاربری هست که ایمیل براش ارسال میشه.
بعد از اجرای این فرمان وارد خط فرمان برنامهء mail میشید که در اونجا موضوع/عنوان و بدنهء ایمیل رو تایپ میکنید؛ با وارد کردن یک خط فقط محتوی یک نقطه، یا زدن Ctrl+d، پایان متن ایمیل رو اعلام کنید. اگر درخواست ورودی Cc (ارسال نسخه های کپی به کاربران دیگر) شد میتونید Enter رو برای صرفنظر از این گزینه بزنید.


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

خب امیدوارم از این مطلب خوشتون اومده باشه.
تا مجالی دیگر بدرود.

Folaani
پنج شنبه 01 آذر 1386, 13:55 عصر
یک مثال دیگه از کاربرد و تجربیات شخصی:


if /usr/sbin/apachectl restart; then play -v 3 /root/.add/KDE_Beep_Digital_2.ogg; else play -v 5 /root/.add/KDE_Beep_Car.ogg; fi;

این خط فرمان، باعث استارت/ریستارت وب سرور آپاچی میشه؛ تنها یک شرط سادهء شل بهش اضافه شده که با استفاده از برنامهء play (شل اسکریپتی از پکیج sox)، درصورت استارت موفقیت آمیز آپاچی یک فایل صوتی رو پخش میکنه، و درصورتیکه استارت آپاچی موفقیت آمیز نبود یک فایل صوتی و صدای دیگری رو پخش میکنه. آپشنهای v در فرمانهای play هم، ولوم صدای پخش شده رو تنظیم میکنن.
این خط فرمان رو در قسمت فرمان یک Button در پنل KDE (معادل Taskbar ویندوز) درج کردم. یعنی درواقع این خط فرمان مستقیما در محیط متنی درج نمیشه و نیازی به داشتن یک پنجرهء ترمینال محتوی شل نیست در این حالت.
منظورم این هست که پیوند و کارایی محیط متنی و شل رو با محیط گرافیک نشون بدم. درواقع شما حداقل گهگاه، از کارایی شل و برنامه های غنی خط فرمان میتونید در محیط گرافیکی هم استفاده کنید و قابلیتها/امکانات رابط گرافیکی سیستم عامل رو با امکانات برنامه نویسی شل و ترکیبش با برنامه های قدرتمند خط فرمان، افزایش بدید.
میتونید تاحدی محیط گرافیکی خودتون رو هم برنامه نویسی و ترکیب (منجمله با برنامه های خط فرمان) و تنظیم کنید و ارتقا بدید؛ تاجایی که میدونم امکان پخش صدا برای یک دکمه (اونهم بصورت شرطی که اطلاعات مفید اضافه ای رو به ما میده) در دسکتاپ KDE وجود نداره (حداقل بطور پیشفرض و در نسخهء مورد استفادهء بنده).
حال این یک استفادهء کوچک (و در عین حال مفید و خوشایند) بوده و از ساده ترین انواع. اگر لازم باشه میشه کاربردهای مفصلتر و پیچیده تری رو ایجاد کرد.

علت استفاده از این کاربرد هم زمانی بود که روی رفرنس آپاچی و پیکربندیهای مفصل و نسبتا پیچیدهء اون کار میکردم و تست و بررسی انجام میدادم. اگر پیکربندی شما دچار خطا باشه (عمدتا از لحاظ سینتاکس)، آپاچی استارت/ریستارت نمیشه و در خط فرمان با یک خطا خارج میشه.
گرچه با خط فرمان میشد کار کرد، ولی گذاشتن یک دکمهء گرافیکی روی پنل مزایای قابل توجهی داشت مثل عدم نیاز به تغییر دید و پنجره برای رفتن به محیط متنی ترمینال، سرعت عمل و تشخیص راحت.
بجای تغییر تمرکز و دید و انتظار برای دیدن پیام خروجی، تنها کافی هست که دکمه رو کلیک کنیم تا جواب بصورت صوتی اعلام بشه؛ اگر بعللی تاخیر زمانی اندکی هم در این فاصله وجود داشته باشه نیازی به انتظار و بیکاری و از دست دادن تمرکز نیست و گرفتن پاسخ فراموش هم نمیشه و میشه به اعمال ویرایش و تجزیه و تحلیل پیکربندیها ادامه داد.

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


#!/bin/bash
echo -e "$1:\n"
rpm2cpio $1 | cpio -t
echo
read -p 'Extract? (y/n): ' -n 1
echo
if [ $REPLY = y ]; then
mkdir -vp ${1/%.rpm}
cd ${1/%.rpm}
name=$(echo $1 | grep -o '[^/]*$')
rpm2cpio ../$name | cpio -iduV
read -n 1 -sp 'Hit any key to quit...'
echo
fi

این شل اسکریپت رو شخصا روی توزیع فدورا ۵ که برنامه ای ویژهء دیدن و استخراج محتویات پکیجهای RPM نداره استفاده کردم. شاید هنوز هم روی فدورا چنین برنامه ای نباشه و این شل اسکریپت بدرد دیگران هم بخوره.
این شل اسکریپت رو میشه در دایرکتوریهای فایلهای اجرایی قرار داد و همیشه براحتی ازش در خط فرمان استفاده کرد. یک راه دیگر (هم) اضافه کردن این فرمان به Context menu ی محیط گرافیکی هست (بنده به KDE اضافه کردمش)؛ در این صورت اخیر، موقعی که روی فایلی با پسوند rpm کلیک راست کنید در زیرمنوی Open With گزینه ای برای دیدن و استخراج محتویات پکیج RPM شما موجود خواهد بود که البته محتویات رو در دایرکتوری ای در دایرکتوری جاری میریزه. برای اجراش البته یک پنجرهء ترمینال باز میشه که پاسخ شما رو برای عمل استخراج در همون پنجره دریافت میکنه.
این گرچه یک ابزار حداقلی (بدون امکان تعیین دایرکتوری یا استخراج انتخابی) هست، اما بقول معروف راه دست و برای اغلب اینطور کارهایی که گهگاه لازم داریم کافی هست. میشه بعضی قابلیتهای دیگر رو هم بهش اضافه کرد، ولی نسبت به پیچیدگی و زحمتش نمی ارزه.
تاجایی که مطالعه کرده بودم، منابع موجود در وب راه دستی و وارد کردن چند فرمان پی در پی رو برای استخراج محتویات این پکیجها معرفی کرده بودند که کار سخت تر و وقتگیرتری هست که ممکنه با اشتباهاتی همراه باشه، بنابراین بنده این اسکریپت رو طراحی کردم که مراحل رو بصورت خودکار دربیاره.
نکته: البته مواظب Overwrite شدن فایلهای موجود باشید!
این برنامه در هربار یک دایرکتوری با نام خود پکیج (بدون پسوند rpm) ایجاد میکنه (درصورت عدم وجودش) و محتویات پکیج رو در اون میریزه.

راستی اگر خواستید فرمان این اسکریپت رو به محیط گرافیکی اضافه کنید، یادتون باشه گزینهء Run in terminal رو فعال کنید (در دسکتاپ KDE این اسمش هست).

Folaani
یک شنبه 04 آذر 1386, 19:35 عصر
شل و برنامه های گنو/لینوکس، تمهیدات و امکانات بسیار غنی ای در زمینهء پردازش و دستکاری رشته ها داره. این درواقع بخش قابل توجه و بسیار مهمی از کاربردهای ضروری و اساسی ای هم هست که در محیط سیستم عامل و بخصوص مقوله هایی مثل مدیریت و خط فرمان و شل بهش نیاز داریم.
و اصولا بخش قابل توجهی از کاربرد و پردازش رایانه ها، کار با متن و پردازش رشته ها و فایلهای متشکل از کاراکتر هست. از سطح مدیریت گرفته تا اپلیکیشنها.
همونطور که گفتم بنده در این جستار تنها موارد تجربه و کاربرد عملی خودم رو بیان میکنم؛ بیش از این منوال و رفرنس خوندم، ولی بعلت محدودیت منابع و اولویت‌هام نمیتونم کاری مشابه ترجمه یا حتی اشارهء فراگیر به این برنامه ها رو انجام بدم.
بهرحال کاربردهای بنده، حداقل تاحد زیادی، برای همه، کاربردی و عمومی هست. گرچه خیلی بیش از اینها جای پرداختن هست و هرکس بنا به محدودهء فعالیت خودش ممکنه به انواع دیگری از این برنامه ها و عملیات نیاز داشته باشه.
بسیاری از این برنامه ها هست که هرکدوم دنیای کوچکی هستن (و حتی زبان و فرهنگ و مرجعی برای ساخت زبانهای برنامه نویسی مختلف شدن گاهی) برای خودشون و بعضی اندازهء یک کتاب کوچک رفرنس و منوال دارن.
بهرحال بنده همونطور که در ابتدا اعلام کردم، از همکاری و همفکری و تبادل تجربیات دیگر دوستان به شدت استقبال میکنم؛ وگرنه فکر میکنم بیش از اینها دیگر به تنهایی مطلب و وقت و انرژی چندانی ندارم که در اختیار دوستان بذارم؛ پس کتاب داره بسته میشه، بدون اینکه داستان حتی به نیمه های خودش رسیده باشه! چون داستان شل و برنامه های خط فرمان و کاربردهاشون بیش از اینها هست.
اگر بریم روی وادی آموزش و شروع از پایه ها که دیگه خودش یک مبحث بسیار غنی و بزرگی هست.
به دوستانی که میخوان کار اصولی و حرفه ای با شل و برنامه های خط فرمان بکنن و در این وادی تازه کار هستن، توصیه میکنم ابتدا رفرنس-منوال BASH رو که پایه هست بطور کامل مطالعه بکنن و با قابلیتهای این شل مجهز و قوی بقدر کافی آشنا بشن (البته توصیهء بنده بنا بر مطالعهء رفرنس رسمی اون هست - از کیفیت فرضا خودآموزهای دیگه اطلاعی ندارم).

خب سخن کوتاه؛ سریع و مختصر میریم سر اصل مطلب و رویهء مثال عملی و توضیحش:


find . -iregex '.*\.htm[l]?' -execdir sed -r -i.bckup 's#file:///c:/windows/desktop/manual#..#ig' {} \;

این فرمان رو بنده برای اصطلاح اشتباهی که در منوال مرحله سازی یک بازی ! کرده بودن (آخه تهیه کنندگانش حرفه ای نبودن دیگه؛ ظاهرا کم سن و سال هم بودن!!) بکار بردم.
داستان از این قرار بود که بعضی آدرس لینکهای منوال رو که به فرمت HTML بود بصورت مطلق داده بودن. همونطور که مشاهده میکنید مثلا آدرس دسکتاپ ویندوز خودشون رو! اونم ویندوزهای قدیمی تری که با ویندوزهای امروزی آدرس دسکتاپشون زمین تا آسمان تفاوت میکنه (اگر یادتون باشه این آدرس دسکتاپ ویندوزی مثل ۹۸ هست).
خب این لینکها بسادگی روی سیستم دیگران کار نمیکرد.

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

فکر کنید شما تعداد زیادی فایل دارید که میخواید یک خط یا قسمتهای معینی از اونها رو، درصورت وجود، با مقدار دیگری تعویض کنید.
مشخص هست که باز کردن جداگانهء هرکدوم از این صفحات در یک ادیتور و Replace کردن مقدار مورد نظر، همچین هم کار آسان و سریعی نیست و حوصلهء آدم رو سر میبره!! بخصوص که فایلها در دایرکتوریهای مختلفی پراکنده باشن. ضمنا امکان اشتباه و جاانداختگی هم همیشه وجود داره، ولو هرچقدر دقت به خرج بدیم بازهم طبق تجربه، با احتمال نه چندان ناچیز امکان انواع اشتباهات اجتناب پذیر و اجتناب ناپذیر ! وجود داره. فکر کنید تعداد فایلها اگر خیلی زیاد بود چطور!
خب این از اون مسایلی هست که اصولا ذاتش بدرد حل در خط فرمان میخوره.
روش خط فرمان بسیار سریع و راحت و کمتر مستعد خطا و از قلم اندازی هست. اما بهرحال باید بهش مسلط باشید و بدونید دارید چیکار میکنید و تدابیر امنیتی و محتاطانهء کافی رو بکار ببندید تا این مزایا رو باهاش بدست بیارید. اصولا خط فرمان برای افراد مسلط و حرفه ای هست، وگرنه میتونه حتی صدمه ای بیشتر از روشهای دیگه بزنه درصورت کاربرد غلط. مثلا شما با یک خط فرمان میتونید به سرعت تعداد زیادی فایل رو بطور غیرقابل برگشت یا حداقل «به سختی بسیار قابل برگشت»ی نابود یا غیرقابل استفاده کنید.
اما همین امر بخاطر قدرت و سرعت بالای خط فرمان هست. مثل سلاح یا ابزاری نیرومند که اگر آدم کاردان ازش استفاده کنه استفادهء بهینه و فراوان ازش میبره و اگر دست آدم ناشی بیفته و خطای خطرناکی بکنه، ممکنه فاجعه ببار بیاره.

خب، فرمان ما در بالا درواقع ترکیب دو برنامهء خط فرمان هست.
برنامهء find که در دایرکتوری جاری و تمام زیردایرکتوریهای اون میگرده و فایلهایی رو با نام مطابق با الگوی regex (همون رگولار اکسپرشن معروف) داده شده که بسادگی فایلهایی با پسوند htm یا html رو معرفی میکنه، پیدا کرده، بعد این فایلها رو به برنامهء sed معرفی میکنه (برنامهء sed رو با این پارامتر اجرا میکنه).
یک regex هم به sed داده شده که الگوی مورد جستجو در فایل رو معرفی میکنه (file:///c:/windows/desktop/manual) و یک عبارت جایگزین (..) که بجای هرمورد یافت شده جانشین میشه.
نتیجه این هست که تمام فایلهای ما درجا و به سرعت بالایی اصلاح میشن.
البته ما با دادن آپشن i به sed گفتیم که فایلها رو درجا ویرایش کنه. وگرنه بصورت عادی/پیشفرض اینطور کار نمیکنه.
با پارامتری که به این آپشن داده شده، یعنی .bckup بهش گفتیم که از نسخهء اصلی هر فایل یک بکاپ با این پسوند تهیه کنه (این فایلها در دایرکتوری ای که هر فایل قرار داره ایجاد میشن). این یک تمهید احتیاطی هست که درصورت اشتباه و خرابی نتیجه، بتونیم فایلهامون رو برگردونیم.
برگرداندن این فایلها هم با فرمانهای مربوطه براحتی امکان پذیر هست. همچنین بعد از اینکه کارمون تمام شد و همه چیز رو تست کردیم و مطمئن شدیم که اشتباهی رخ نداده و فایلهای ویرایش شده کاملا صحیح و قابل استفاده هستن، میتونیم با فرمان دیگری تمام این فایلهای پشتیبان رو به سرعت پاک کنیم.
البته خوب هست که اینطور فرمانهای مکمل رو هم اینجا لیست کنم، ولی بنده تا اینطور چیزها رو تست نکنم و صددرصد کار نکنه درج نمیکنم و فعلا وقت هم ندارم.

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

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

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

oxygenws
چهارشنبه 07 آذر 1386, 00:39 صبح
CLI Magic: Video conversion with mencoder
http://www.linux.com/feature/121385

Folaani
جمعه 09 آذر 1386, 09:07 صبح
for f in *;
do
if (($(echo "$f" | grep -i -c '\.mid$'))); then
name=$(echo "$f" | grep -i -o '.*\.')
mv "$f" "${name}mp3"
fi
done;

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

Folaani
شنبه 10 آذر 1386, 19:37 عصر
#!/bin/bash

clear

if [ $# = 1 ]; then

num=$(echo $1 | grep -c -e '^[1-9][0-9]*$')

if (($num)); then

declare -i num=$1

while [ -f L1p$num.html ]; do num=num+1; done

while [ ! $num -eq $1 ]
do num=num-1
echo Renaming \'L1p$num.html\' to \'L1p$((num+1)).html\' ...
mv L1p$num.html L1p$((num+1)).html
done

else

echo Error: Invalid argument!

fi

else

echo Error: No argument!

fi



خب اینهم یک کاربرد مفید و جالب دیگه که تقریبا یادم رفته بود مطرح کنم.
یک موقعی یک پروژهء تبدیل کتاب چاپی به کتاب الکترونیکی با فرمت اچ تی ام ال گرفته بودم.
یک جزء استانداردی که داده بودن این بود که هر صفحهء کتاب اچ تی ام ال رو که باید صفحات/فایلهای مجزا میبودن با یک عدد پست سرهم شماره گذاری میکردم.
این یک نمونهء عملی از این شماره گذاری هست:

L1p1.html L1p2.html L1p3.html L1p4.html L1p5.html L1p6.html
یعنی مثلا فصل اول صفحهء یک، دو و الی آخر.
اغلب پیش می آمد که نیاز داشتم یک صفحه رو بین صفحه های دیگه اضافه کنم. مثلا بعلت اضافه کردن یکسری مطالب اضافه و توضیحات و تجدید نظر یا حتی تقسیم کردن یک صفحه به دو صفحه. اینطور کارها کاملا عادی بود و در جریان کار طبیعتا پیش میامد، بخصوص که استانداردهای محدود کننده ای هم برای حجم و شکل صفحات داشتم.
خب حالا موضوع این هست که اضافه کردن یک صفحهء شماره دار در بین یکسری صفحهء دیگر که شماره های پشت سرهم دارن، مستلزم تغییر نام تمام صفحات از اون شماره و ببعد به یک شماره بالاتر هست. این کار بصورت دستی و با استفاده از عملکرد عادی محیط گرافیکی سیستم عامل، کاری وقت گیر و خسته کننده هست و ضمنا مستعد خطا. تعداد صفحات ممکنه خیلی زیادتر از این مثال ارایه شده که تنها قسمتی از فایلهای یک فصل هست باشه.
فکر کردم چطوره اینکار رو برای بقیهء کار بصورت خودکار دربیارم.
حاصلش این شل اسکریپت هست. شما یک شماره در خط فرمان بهش میدید. مثلا:

./shift.sh 3

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

نتیجهء عملی فرمان بالا رو مشاهده بفرمایید:

L1p1.html L1p2.html L1p4.html L1p5.html L1p6.html L1p7.html

حالا جای اضافه شدن یک فایل و شماره بعد از فایل صفحهء دوم وجود داره.

Folaani
پنج شنبه 29 آذر 1386, 12:34 عصر
حتما همه دیدید که چطور بعضی برنامه های متنی مثل انواعی از ادیتورهای محیط متنی یا همون ترمینال لینوکس، متن رو بصورت رنگی نمایش میدن (اعم از زمینه و پیش زمینه)، بحالت چشمک زن، بحالت معکوس (رنگ زمینه و پیش زمینه جابجا میشه)، حتی زیرخط دار و حالتهای دیگهء موجود و ترکیبی از هرکدوم از اینها. شاید نمیدونستید که این قابلیتها در دسترس کاربر عادی سیستم هم هست و فقط از طریق برنامه نویسی، مثلا به زبان سی، بدست نمیاد. درواقع در اون برنامه ها و زبانهای برنامه نویسی هم کار اصلی (نمایش متن با خصوصیات مورد نظر) رو خود ترمینال هست که انجام میده؛ فقط کافیه یکسری رشته های کنترلی رو که برای ترمینال معنای خاصی دارن قبل از هر خروجی، مثل خروجیهای دیگه ارسال کنیم تا خروجی ارسال شدهء بعد از اون با اون ویژگیهای مورد نظر که توسط توالی کنترلی ارسال شده تعیین شدن نمایش داده بشه. البته تغییر حالت نمایشی کاراکترها، تنها قابلیت و کاربردش نیست و قابلیتهای دیگه ای داره که شاید بعضی جاها بهشون نیاز باشه و تقریبا به هیچ روش دیگه ای نشه حلشون کرد یا از راههای دیگه خیلی سختتر و پیچیده تر و حجیمتر ممکن باشه. بطور مثال فکر کنید شاید یک شمارنده، درصد و هرچیز متحرک یا مستلزم تغییر مثل اینها رو بخواید در میان یک متنی نمایش بدید در شل اسکریپت خودتون؛ با ترفندهای عادی کاری مشکل و وابسته به مکان اون قسمت در میان متن هست، حال اینکه با رشته های کنترلی میتونین مکان شروع کاراکترهای مورد نظر رو ذخیره و موقع لازم بازیابی کنید که این کار رو بسیار ساده و شدنی میکنه؛ فرقی نمیکنه که بقیهء متن رو تغییر بدید و جای شمارنده در صفحه تغییر بکنه. البته این یک مثال بالبداهه بود که گفتم و مطمئن نیستم کاملا مناسب و دقیق و معقول بوده باشه.

برای اطلاعات کامل راجع به توالیهای کنترلی موجود به این منبع مراجعه کنید:

http://en.wikipedia.org/wiki/ANSI_escape_code

اینهم یک مثال سادهء قابل اجرا برای درک سریع چگونگی بکار گیری (تست شده در BASH در Konsole):



echo -e "\n \0033[0mA\0033[7mB\0033[5mC\0033[32mD\0033[0m\0033[34mE\0033[47m\0033[4mDFG\0033[0m \0033[35mHIJ\0033[4mK\0033[0m\n";



قابل توجه هست که این قابلیت در داس و محیط متنی ویندوز هم بطور محدودتر و ناقصی وجود داره؛ به شکل لینوکس و بطور پیشفرض و Built in نیست و توسط درایوری بنام ansi.sys و لود کردنش توسط فایلهای پیکربندی مربوطه قابل دستیابی هست (بنده قدیم باهاش کار کرده بودم، ولی فکر میکردم امکاناتی از خود داس و جزو اون هست).
محیط لینوکس بنظر من در مجموع خیلی بهتر و مناسبتر و کاملتر این پشتیبانی رو ارایه داده که بصورت Built in و مطمئن و همیشگی درش وجود داره؛ بنابراین برنامه های تهیه شده، اعم از باینری اجرایی و شل اسکریپت و فرمان، با اطمینان و گستردگی خیلی بهتری در محیطهای مختلف کار میکنن و میتونیم این رو ویژگی ای عمومی فرض کنیم؛ حال اینکه در داس (مرحوم) و محیط متنی ویندوز عملا این قابلیت قابل تکیه نیست و بنابراین متروک و فراموش گشته.

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

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

msvbgod
سه شنبه 14 اسفند 1386, 12:45 عصر
دوست عزیز از مطلبی که نوشتید متشکرم.
اما من یه سئوال از کسانی که از خط فرمان استفاده می کنند دارم. چطوری 20000000 تا گزینه خط فرمان هر برنامه رو حفظ می کنند؟؟؟
بعد از یه بررسی کوتاه متوجه شدم که در حدود 100 برنامه رو در اکثر اوقات به کار می برم. حالا در نظر بگیرید که همشون هم خط فرمان داشته باشند. یه نگاهی به راهنمای خط فرمان بعضی از برنامه ها مشخص می کنه که خط فرمان بیشتر به درد کارهای batch و کارهایی که خیلی استفاده می شوند داره. مثلا irfanview یا winrar که اکثر امکاناتشون مفید هست. کی می تونه اون همه سوییچ رو حفظ کنه؟؟؟
خودم یه 3 سالی با لینوکس کار کردم ولی هنوز تعجب می کنم وقتی یه نفر برای ادیت فایل از vim استفاده می کنه. یه مدتی از این سیستم عامل دور بودم و باز بعد از 2 سال که برگشتم کوچکترین سوییچ هایی رو هم که حفظ بودم فراموش کردم.
1- اگر من آلزایمر دارم یه دکتر خوب معرفی کنید.
2- اگه از روش خاصی (مثل جعبه لایتنر و...) برای یادگیری سوییچ ها استفاده می کنید روند کار را در اختیار دیگران هم قرار بدهید.
متشکرم

whitehat
سه شنبه 14 اسفند 1386, 13:12 عصر
اگه کمی از یک دستور را حفظ هستید کافیه حرف اول یا چند حرف بعد آنرا بزنید و بعد دو بار کلید تب را فشار دهید خط فرمان به شما دستوراتی که می توانید تایپ کنید را نشان می دهد

rezaTavak
سه شنبه 14 اسفند 1386, 21:07 عصر
ls --help
در لینوکس
dir /?
در ویندوز

eshpilen
چهارشنبه 05 خرداد 1389, 09:40 صبح
معرفی چند فرمان جدید که شاید بدردتون بخوره (بدرد من که خوردن!):


echo; declare -i c=0; for i in 30 31 32 33 34 35 36 37 90 91 92 93 94 95 96 97; do for j in 40 41 42 43 44 45 46 47 100 101 102 103 104 105 106 107; do echo -en "\0033[${i}m\0033[${j}m $i-$j \0033[0m "; c=c+1; done; done; echo -e "\n\nCombinations: $c\n";

این فرمان تمام ترکیبات رنگ پیش زمینه و پس زمینه رو برای ترمینال شما نمایش میده. اعداد مربوط به هر رنگ پیش زمینه و پس زمینه در داخل محل نمایش رنگها نوشته میشه. به این روش میتونید ترکیب رنگ مورد علاقه و خوانای خودتون رو به سرعت شناسایی کنید.
توضیح این فرمان برای آشنایی/یادگیری:
- ابتدا با فرمان echo یک خط خالی رد میکنیم.
- یک متغییر (c) از نوع عدد صحیح تعریف کردیم (تا با عبارت ریاضی ساده در خط فرمان بتونیم براحتی مقدارش رو تغییر بدیم) با مقدار اولیهء صفر؛ این متغییر قرار هست تعداد ترکیبهای رنگ رو بشماره.
-- دو حلقهء تودرتو داریم که حلقهء خارجی رنگ پیش زمینه رو تعیین میکنه (از شمارهء ۳۰ تا ۳۷ (رنگ نرمال) و از ۹۰ تا ۹۷ (نسخهء روشن)) و حلقهء داخلی رنگ پس زمینه رو (از ۴۰ تا ۴۷ و از ۱۰۰ تا ۱۰۷).
- رنگ مورد نظر رو توسط دستور اکوی داخل حلقهء داخلی تعیین میکنیم (برای اطلاع از فرمت این دستور به مقالهء ویکیپدیا دربارهء ANSI escape code که در پست های قبلی معرفی کردم میتونید مراجعه کنید).
آپشنهای e و n در دستور اکو به ترتیب برای روشن کردن backslash escape که برای فرستادن مقدار اسکی کاراکتر کنترلی ESC (که ۲۷ در مبنای ده و ۳۳ در مبنای هشت میشه) جهت استفاده از ANSI escape code بهش نیاز داریم، و (آپشن n) برای جلوگیری از رد کردن خط توسط هر دستور اکوی جداگانه هستن. چون میخوایم برای هر ترکیب رنگ یک خط جداگانه رد نشه و رنگها در کنار هم نمایش داده بشن.
- پس از هربار اجرای دستور اکو - تکرار حلقهء داخلی - مقدار شمارندهء ترکیب رنگ رو یکی افزایش میدیم.
ضمنا دو shell keyword با نام done هم درواقع هرکدام جزو یک ساختار حلقهء for ما هستن و انتهای این حلقه ها رو مشخص میکنن.
- در پایان با دستور اکو تعداد ترکیبات نمایش داده شده رو چاپ میکنیم. بازهم استفاده از آپشن e بخاطر نیاز به تفسیر \n که معادل کاراکتر New line هست میباشد. چون خواستیم قبل از نمایش تعداد ترکیبات دو خط خالی رد کنیم و بعدش هم یکی اضافه تر که با خط خالی ای که خود دستور اکو رد میکنه میشه دوتا. اگر از این آپشن استفاده نمیکردیم احتیاج به استفاده از سه دستور اکوی خالی مجزا داشتیم برای اینکار.

===============================


echo "$(cat target_file | grep 'pattern')" > target_file

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

توضیح چگونگی کارکرد خط فرمان:
محتویات فایل مورد نظر توسط برنامهء cat و از طریق لوله کشی خروجی این برنامه به ورودی برنامهء grep ارسال میشه و این برنامه تنها خطوطی رو که ما مشخص کردیم که حاوی pattern مورد نظر باشن به خروجی میده.
مجموعهء این فیلتر طراحی شدهء ما در یک ساختار شل که جانشین سازی فرمان (Command Substitution) نام داره قرار داره که باعث میشه خروجی این مجموعه در مکان قرارگیریش، یعنی یک آرگومان فرمان echo درج بشه.
خروجی فرمان echo رو هم که مجددا به خود فایل مورد پردازش فرستادیم؛ در نتیجهء محتویات قبلی این فایل با محتویات جدید فیلتر شده جایگزین میشه.


============================


sed -ri 's/(^.*$)/\1\n/g' target_file

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

============================

همهء فرمانهای مورد بحث کاربرد عملی داشتن و پاسخ نیاز و مشکلی بودن؛ اما بعلت دراز شدن بیش از حد مطلب، در درج و توضیح خود موارد صرفنظر کردم.

سرعت، قدرت، راحتی! درصورت کاربرد صحیح و ماهرانه و بهینهء خط فرمان، همهء این پارامترها رو خواهید یافت. براحتی درمیابید که چرا هکرها اینقدر خط فرمان رو دوست دارن و چطور خط فرمان برای بسیاری کارها بر رابطهای گرافیکی پیشی میگیره.
فراموش نکنید که خط فرمان در گنو/لینوکس، با وجود برنامه های پیشرفتهء غنی و شل قدرتمند مجهز به زبان مخصوص، عملا یک محیط برنامه نویسی آماده و همیشگی هست که میشه کارهای پیچیده و موارد زیادی با ویژگیهای خاص رو باهاش انجام داد و کارهای ترکیبی و پیچیدهء زیادی رو بصورت خودکار درآورد. بخصوص درصورت تکرار این کارها، مزیت زیادی خواهد داشت.
این محیط محیط برنامه نویسی ای هست که انگار مجهز به کتابخانه های مجهز برای بسیاری کارها هم هست. جز مهمی از این کتابخانه ها همان برنامه های خط فرمان هستند که در گنو/لینوکس بسیار زیاد و قدرتمندند.

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

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

eshpilen
چهارشنبه 05 خرداد 1389, 09:40 صبح
پیشنهاد میکنم اعلان شل خود را رنگی کنید!
بطور نمونه:

PS1='\[\033[30m\033[43m\][\u@\h \W]\$\[\033[m\] '
این دستور را میتوانید به فایل ~/.bashrc اضافه کنید.
رنگی بودن اعلان شل، بر اساس تجربهء شخصی، کمک بزرگی درجهت خوانایی و پیدا کردن سریع ابتدا و انتهای خروجی فرمانهای مختلف است و در صرفه جویی در وقت و انرژی و کاهش فشار روی چشمان ارزشمند شما بطرز کاملا مشهودی موثر است.
بخصوص وقتی فرمانی خروجی طولانی و شاید چند صفحه ای دارد.
وقتی در محیط ترمینال امولیتور بوسیلهء اسکرولبارها دنبال ابتدا و انتهای خروجی مشخصی میگردیم این نیاز بشدت احساس میشود.

--------------------------------------

یک تابع ساده که بازهم میتوانید به ~/.bashrc اضافه کنید:

hlp () { $1 --help | less; };

و در خط فرمان بدین صورت نمونه از آن میتوانیم استفاده کنیم:


hlp diff

بجای diff هر برنامهء دیگری که پارامتر --help را میپذیرد میتواند قرار بگیرد.

این تابع ساده شما را از تایپ خط فرمان تکراری و طولانی تری مثلا بصورت diff --help | less رها میکند.

در محیط less، میتواند با کلیدهایی مثل PgDown و PgUp میان صفحات مختلف خروجی حرکت کنید، با کلید q نیز از این محیط خارج شوید.

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

eshpilen
چهارشنبه 05 خرداد 1389, 09:41 صبح
بازم یک نیاز جدید پیش آمد و تصمیم گرفتم با امکانات خط فرمان حلش کنم.
در فکر یک برنامه بودم که آلارم زماندار باشه؛ یعنی سر زمان معینی آدم رو خبر کنه.
طراحیش وقت و انرژی زیادی برد؛ ولی عوضش بارها قابل استفاده هست و مزایایی داره. ضمنا هدف تسلط و شناخت بیشتر نسبت به شل قدرتمند و برنامه های گسترده و مجهز و قابل انعطاف محیط گنو/لینوکس هم بوده. در مدتی که روی این برنامه کار میکردم چیزهای مفید و جالبی یاد گرفتم و با ساختار پایهء تحسین برانگیز گنو/لینوکس بیشتر آشنا شدم.

زمان زیادی با رایانه کار میکنم و بارها کارهای دیگری رو که داشتم و باید در زمان بخصوص یا با تاخیر معینی انجام میدادم یادم رفته؛ آخرینش خطر انفجار یک قوطی کنسر لوبیا روی اجاق گاز بوده!! حیف شد لوبیاها همه نیم سوخته شده بودن و انداختمشون دور.
شاید شما هم با همین مشکلات برخورد کرده باشید!

عرضم به حضور شما که در محیط گرافیکی برنامه های قابل توجهی هست همونطور که میدونید. در زیرمنوی PIM فدورا هم هست.
ولی مزایا و معایب خودشون رو دارن. باید بگم با نیازی که بنده دارم مزایای اونها خیلی بدردم نمیخوره یا مهم نیستن.
درمقابل به یک چیزی ساده، سریع، مطمئن، کم مصرف و سخت جون و مطمئن نیاز دارم. البته در عین داشتن انعطاف بقدر کافی.
این برنامه های گرافیکی در عین مجهز بودن چندان صرفه هم ندارن روی سیستم ضعیف ما! فقط یک رابط گرافیکی و کلی قیافه دارن که عملا برامون فرقی نمیکنه و منابع سیستم رو بیخودی پاش هدر میکنیم. موقعی که سیستم سنگین شده کمی طول میشکن تا بیان بالا فقط.
ضمنا در محیط تماما متنی هم کار نمیکنن.
خب سخن کوتاه!
از اینرو شد که این برنامه رو نوشتیم که به شکل یک تابع شل هست. اون رو در bashrc قرار میدیم و تمام. البته نسخهء فایل اسکریپتش رو هم تست کردم و شدنی هست (البته با حالت تابعش کمی فرق میکنه و چیزهایی باید بهش اضافه بشه). اینطوری میشه یک اسکریپت در مسیر اجرایی قرار داد که فرضا بشه از کادر run هم براحتی اجراش کرد.
اما بهرصورت خیلی اوقات بنده یک شل باز دارم؛ ضمنا ترمینال امولیتور هم که تقریبا همه جا هست؛ از kate تا konqueror.

خب این برنامهء ما حتی نسبت به اون برنامه های گرافیکی مزایایی هم داره واقعا!
مجموعا کار کردن باهاش برای کاربردهای بنده (و شاید بعضی افراد دیگه) فکر میکنم راحتتر و سریعتر باشه.
یک مزیت این برنامه هم اینه که درصورتیکه حتی محیط گرافیکی بسته یا ریستارت بشه (که خودتون میدونید بعضی وقتا پیش میاد یا لازم میشه)، لاگ آوت یا سویچ کاربر کنید به هر علتی، آلارم ما از بین نمیره و به کار خودش ادامه میده؛ حتی در حالتیکه شما هنوز لاگین مجدد نکردید!
شما میتونید در محیط تماما متنی و محیط گرافیکی بطور یکسانی بکار بگیریدش، بدون اینکه به محیط دسکتاپ وابسته باشید و دچار بی ثباتی و تغییراتش باشید.
البته بنده با صوت مشکلاتی داشتم که فکر میکنم کاملا مربوط به خود سیستم هست تا این برنامه. یعنی در بعضی اکانتها که کاملا لاگ آوت میکنیم و دیگه با اون کاربر هیچ کجا روی سیستم نیستیم، صدا پخش نمیشه (گرچه بقیهء بخشها اجرا میشن)؛ بعضی وقتها ورود به یک اکانت دیگه باعث قطع صدا در اکانت دیگر میشه.
همونطور که گفتم اینها مربوط به سیستم هست و ارتباطی با این برنامه نداره. یعنی در محیط گرافیکی هم این قضیه صادق هست و چه درمورد برنامه های خط فرمان و چه برنامه های مالتی مدیای گرافیکی همینطور هست.
بهرحال این نکته رو گفتم بعنوان یک تجربه، که حواستون باشه به این قضیه و ازش مطمئن بشید قبل از اینکه روی پخش صدا در هر حالتی اتکا کنید.
البته ممکنه سیستم شما اصلا چنین اشکالی نداشته باشه.
بهرحال اگر داره یا نداره؛ اگر فهمیدید علتش چیه و/یا چطور میشه حلش کرد، به بنده هم اطلاع بدید لطفا.

این برنامه در خط فرمان انعطاف و هوشمندی نسبتا خوبی هم داره و میتونه برای کاربردهای متنوعی بکار بره.
استفاده از برنامهء date به ورودیش انعطاف خوبی داده. میشه هر فرمتی رو که برنامهء date میپذیره بهش داد (تنها حالت بدون آرگومان رو به تاخیر زمانی صفر ثانیه نگاشت کردم؛ یعنی اگر برنامه بدون آرگومان اجرا بشه حاصلش اجرای فوری آلارم هست (این با تاریخ تعیین شده توسط برنامهء date فرق داره)).
برنامه رو با آرگومان help فراخوانی کنید تا اطلاعاتی راجع به کارکردش بده.
کدها هم خوب داکیومنت شدن. حجمش زیاد شده بخاطر توضیحاتی که در کد داده شده؛ میشه برای کاربرد عملی تمام کامنتها رو برداشت (توصیه میشه؛ فکر میکنم منابعی مصرف میکنن).


alarm() {
#this is a function for reminding you things while working
#(but you can also use it for delayed execution of some tasks)
#havent you ever lost an overheated conserve while working with computer, like me? ;D
#many other things (of course sometimes more serious)
#may happen due to forgetting some jobs in their time.
#I have forgotten them many times because of being
#intensively concentrated on other activities while I had been working on the computer.

#I think I have self-documented this code good.
#explanatory comments are below of each corresponding line or functionally separate part of the code.
#this program is tested in this environment: Fedora 5 GNU/Linux;
#it runs in BASH, utilizes the `date', `mesg', `write', `nice', `sox', `id', `stat', `find, and `sleep' programs;

local usage="usage: alarm [time [alert_message [external_program]]
examples:
alarm 30min 'calling joe'
alarm '1 hour 20 min' '' 'halt -p'
alarm 21:30
alarm 60sec
alarm '120 secondes'
alarm 10min 'hello\\\\n this is a test\\\\n how are you?'
alarm 'tomorrow 5:30 am'
alarm 1min30sec
note that arguments containing spaces must be quoted.
invoking with no args executes an immediate alarm."
#this variable contains usage help message with some examples
#note that `local' is a BASH builtin

if [[ $1 = --help || $1 = -h || $1 = help || $1 = -help ]]
then echo -e "$usage\n
this is a program for setting a reminder alarm at the specified time.
time can be a certain time/date or delay in any format which
the date program accepts (see its manual for detailed explanations).
you can specify a custom alert message, and also a command
to be ran at the specified time, if you want."
return; fi
#if user requested help with with some of its common styles,
#we show him a help message (including the usage message)
#the `return' command causes exiting the alarm function/stoping execution of the next commands.

if [[ $# -gt 3 ]]; then echo -e "too many arguments!\nprobably you must quote some args (do they contain spaces?)\n\n$usage"; return; fi
#number of arguments has exceeded the maximum meaningful (probably some args must be quoted).
#we print an appropriate error message with the usage message.

if [[ $# != 0 ]]; then local t="$1"; else local t=0; fi
#if there are no args specified at all, sets the sleep time to 0, i.e. immediate alarm.

if [[ $# != 0 ]]; then
#---------------------------------
#if there were no args, we should not calculate and display alarm time.
#in this case, wait time is set to 0.
#but if the user has specified an equivalent 0 wait time (e.g. `0sec'), we should calculate it
#and also display it to him (I think we should; think of a script that utilizes our prog,
#and also redirects its output to a file for example) .

echo -n "current time: "; date

echo -n 'alarm time: '
if ! date -d "$t"; then echo -e "\n$usage"; return; fi
#we check to see if the first arg (time/delay) is acceptable by the date program;
#note that probably all possible forms/values of the date's arg
#are not very meaningful for our little job and may be just mistakes.
#but this check seems to be sufficient for our job. its as simple as required to be really worth doing.

local now=$(date '+%s')
#its really necessary! we put current timestamp into a variable.
#calculating it directly in the arithmetic below sometimes
#results in bogus negative value (that causes `time in the past' error)
#due to a race condition (only in cases of the 0 wait times)
t=$(($(date -d "$t" '+%s')-$now))
#we must convert anything specified by the user to a delay in secondes;
#because we need seconds for passing to the sleep program.
#date program with -d and %s will convert anything to secondes past the epoch.
#(I think it is what is often called a unix timestamp).
#so indeed one important step (converting input, regardless of its format, to secondes) is done this way.
#we get the current moment timestamp, convert user specified time to timestamp,
#and finally the difference between them is what we want!
#we pass that difference to the `sleep' and the `sleep' will sleep so many secondes!

if [[ $t -lt 0 ]]; then echo -e "calculated time is in the past!\n\n$usage"; return; fi
#do you want an alarm in the past?!!

echo -n 'that is '
if [[ $t != 0 ]]; then
if [[ $t -ge 3600 ]]; then echo -n "$(( $t / 3600 )) hour(s) "; fi
if (( $t % 3600 >= 60 )); then echo -n "$(( $t % 3600 / 60 )) minute(s) "; fi
if (( $t % 60 )); then echo -n "$(( $t % 60 )) second(s) "; fi
echo 'later.'
else echo 'now.'
fi
echo
#now we have seconds to be elapsed from the present time;
#with some div and mod arithmetics we convert it to
#hours, minutes, and secondes and display it to the user.

fi
#---------------------------------

local tty=$(tty)
#we are on which tty dev file?
local tty_owner=$(stat -c '%U' $tty)
#gets the tty dev file owner.
#note that this may be different from `whoami/id -un' output; you may have used su.
#in those cases, tty owner is the original user, not the su-ed user.
#having several shells with several users (at least your ordinary user account besides the root)
#is not rare at all. for example in recent times I have had three users at the same time for testing & learning
#the cvs system (I am now reading its manual; and indeed developing this program with it).

local f= xtty=n p=-99999999999
#we want that pts which writing to it brings a box
#with our message within, to the user. (I discovered it lonely! :D)
#according to my tests, it is the pts file with the oldest creation time
#that of course belongs to the user.
#we set xtty's value to n, that is an indication of an unreal value (real pts files are started at 0).
#by checking its value after executing the compare loop
#we can know if any pts-es were existent at all (we might be on a real terminal only).
#likewise, p is an unreal timestamp value.
for i in $(find /dev/pts/ -mindepth 1 -user $tty_owner -printf '-%C@ %f '); do
#this find command line brings the names of all the relative
#(same owner as the tty owner) existing pts files into the looping values of the `for' command.
#we prefix change times with minus (that effectively makes them negative numbers)
#so that they can be recognized from the pts file names (>=0)
if [[ $i -lt 0 ]]; then
#i<0 means that $i is the file's change time
if [[ $i -gt p ]]; then p=$i; f=y; fi
#if the current timestamp is bigger from the previous one
#(bigger negative number means smaller positive number (absolute value)),
#we set previous to current and also set a flag indicating that the next loop variable's value
#that is a file name should be set as the xtty (oldest found so far).
elif [[ $f ]]; then xtty=$i; f=
#if $i isnt less that zero (is a file name), and assignment flag is on (1), set xtty and reset the flag.
fi
done
#we have the oldest (according to its change time - is it the right way? I am not sure!) pts file now.

if [[ $xtty != n && $(mesg) =~ 'n' ]]; then
mesg y 2>/dev/null
#2>/dev/null is redirecting the command's error output (written to the stderr) to the `null' device
if [[ $(mesg) =~ 'n' ]]; then
echo -e "warning: cant enable the message sending.
thus we may not send a message to the X tty at the specified time.
probably you su-ed before invoking the alarm.
if so, change the user to the tty owner (login user) and then execute the alarm again
or enable mesg (with the 'mesg y' command).
probably you must exit from the current user or use the sudo to do so.\n"
else mesg n
fi
fi
#if tty owner isnt the current user (we have su-ed) sending message with the `write' program
#would fail if the tty's message receiving/sending is disabled; another user cant change that
#(but superuser always can!).
#we only issue a warning to inform the user and continue.
#note: you can put the `mesg y' command in your bashrc file (user or system-wide) to solve this problem.

if ! sox -q -t nul /dev/zero -v 0 -t alsa default synth 0.01 2>/dev/null; then
echo -e 'warning: apparently alarm sound cant be played.\ncheck if you can play sounds under this user.\n'
fi
#you must have `sox'! our program uses `sox' to generate an alarm sound on the fly.
#although you may replace it with another method/program if you wish; I think it is not hard at all.
#since I had sound problems with my system (when several accounts are involved concurrently)
#I wrote this test so that before going to the sleep we can inform ourselves and the user of that
#the alarm sound cant be played. sound is really important! but again we dont stop and continue.
#you can solve the sound problem (if you succeed please tell me too),
#change the user (probably with su), or you may havent sound at all.

(
#this open brace creates a command group containing
#all of the commands after it and before its corresponding close brace.
#commands are executed in a subshell;
#that will be run in the background (because of the `&' after the closing brace) as one job.
#note: process id of this job will be printed by the shell on the terminal;
#you can use it to kill the job to cancel the alarm.

: hmalarm
#this command does nothing.
#its rule is just as an identifier for the `disown' command to refer to.

alert="\a\n\n${2:-<<<<<<<>>>>>>>\n<<< Alarm! >>>\n<<<<<<<>>>>>>>}\n"
#set the alert message which will be sent to the terminal and via the write program.
#its value is choosed from the 2rd command line argument
#or a default value if no (non-empty) command line message argument is specified.
#it also includes a terminal beep! (\a)

sleep $t
#wait $t seconds. next lines are not executed until sleep is finished.

echo -e "$alert"
#its time to wake up!
#we send alert message to the attached terminal, if any
#(terminal may be closed before sleep was finished; even the user may be logged out).

f=
xtty=n
p=-99999999999
for i in $(find /dev/pts/ -mindepth 1 -user $tty_owner -printf '-%C@ %f '); do
if [[ $i -lt 0 ]]; then
if [[ $i -gt p ]]; then p=$i; f=y; fi
elif [[ $f ]]; then xtty=$i; f=
fi
done
#we search for xtyy again (after sleep)
#see a detailed explanation of this code above.
#user may have done some actions during the sleep time.
#e.g. logged out, logged in (with X) for the first time after invoking alarm, logged out
#and after some other users logged in (thus its xtty would probably be different).
#we dont want to send its alert message to another user.

#-----------------------
if [[ $xtty != n ]]; then
#we will attempt to send the alert message to ourselves via the first pts (that brings a box in X).
#or no (condition=false) if no pts related to the alarm invoking user were found.
if [[ $(mesg) =~ 'y' ]]; then mesg='y'; else mesg='n'; fi
#we want to send an alert message to ourselves;
#so we must turn mesg on before doing so (although it may be on already).
#note that this has an effect only when attached tty isnt closed yet.
#thus we save its current setting, so that we can restore it to its previous setting after doing our job.
mesg y 2>/dev/null
#enables the message receiving/sending (we need only sending)
echo -e "$alert" | write $tty_owner /dev/pts/$xtty 2>/dev/null
#sends the alert message with the `write' program.
mesg $mesg 2>/dev/null
#restores the mesg setting
fi
#------------------------

if [[ $(id -u) != 0 ]]; then sox -q -t nul /dev/zero -t alsa default synth 2 square 100-4000 repeat 2 2>/dev/null &
else nice --7 sox -q -t nul /dev/zero -t alsa default synth 2 square 100-4000 repeat 2 2>/dev/null &
#if alarm is executing under superuser its better to increase its scheduling priority with the nice program
fi
#generating an alarm sound on the fly, thanks to sox.
#nice increases its process priority so that it dosnt play interrupted.
#at least my system is so weak that such command line generated sounds are interrupted easily.
#but if we have not executed it under superuser privileges, we cant set a negative niceness.

if [[ $3 ]]; then eval "$3 &"; fi
#executes an optional arbitrary external command passed via the 3rd argument on the command line.
#note that if you dont specify that `&', the subshell will remain until the external program exits (see its process tree).
#regardless of it, we need quoting too, even if we havent an `&' (test with something like "echo '1 2 3'").

) &
# this `&' causes the command group to be ran in the background;
#and your shell's prompt will be ready immediately.

disown '%?hmalarm'
#the final small, but important command.
#we disown this job (command group identified by 'hmalarm')
#so that exiting the shell dosnt kill our alarm process.
#it survives independently almost in every (normal) situations
#(whats an exception to this? do you know? if so please tell we too).
#even if the user has logged out, yet the alarm process runs.
#but at least in my system there was some problems with the alarm sound in these situations;
#so check it carefully before relying on it;
#as a special case also check to see if other GUI logins with other user accounts have any effects on it.
#of course the user can kill the alarm process with some administrative tool if he wants
#(e.g. with the `kill' program, process management GUIs of DEs, etc.)
}


این برنامه حداکثر ۳ پارامتر میگیره که همه اختیاری هستن.
پارامتر اول زمان هست؛ پارامتر دوم پیغامی هست که نمایش داده میشه (موقعی که زمان تعیین شده میرسه)؛ و پارامتر سوم یک خط فرمان هست که میتونیم تعیین کنیم تا موقع رسیدن زمان تعیین شده اجرا بشه (میتونه هر خط فرمان و برنامه ای در محیط متنی یا گرافیکی باشه).
اگر هر پارامتری که میخواد تعیین بشه، فاصلهء خالی یا بقیهء کاراکترهای جداکنندهء خاص رو داره، باید در کوتیشن قرار بگیره.
برنامه بدون پارامتر هم کار میکنه؛ اما صرفا بدون تاخیر عملیات آلارم (اطلاع رسانی) رو انجام میده.
اطلاع رسانی هم از چند طریق بطور همزمان هست: یک پیغام بسادگی با فرمان echo به ترمینالی که آلارم رو set کرده فرستاده میشه (که اگر این ترمینال هنوز باز باشه، پیغام درش دیده میشه)؛ یک پیغام توسط برنامهء write به خود کاربر ارسال میشه که طوری که روی سیستم بنده هست و تست کردم در محیط گرافیکی توسط یک پنجرهء مربوطه به اطلاع کاربر میرسه؛ یک صدای آلارم قوی پخش میشه؛ در نهایت اگر برنامه ای برای اجرا تعیین شده باشه اونهم اجرا میشه.
توجه کنید که این برنامه در محیط فدورا ۵، با BASH تست شده.
برای کارایی مطمئن تر با این برنامه، احتمالا باید فرمان mesg y رو هم به bashrc خودتون اضافه کنید.
البته این فقط درحالتی مهم هست که شما از خط فرمان کاربران su شده میخواید آلارم رو اجرا کنید؛ چون در اینصورت اگر mesg فعال نباشه، برنامه نمیتونه فعالش کنه و پیغام رو بفرسته (چون tty owner نیست)؛ البته درصورتی که کاربر جاری superuser نباشه. البته در نهایت این فقط یک پیغام هست و نه چیز دیگه، ضمن اینکه این پیغام روی ترمینالی که برنامه ازش اجرا شده هم فرستاده میشه، صدا هم که پخش میشه اگر مشکلی با پخش صوت نداشته باشیم.

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

eshpilen
چهارشنبه 05 خرداد 1389, 09:42 صبح
همه ما در ویندوز با نرم‌افزارهای دریافت websiteکار کرده‌ایم، دست‌کم اسمWebZip یا WebsiteDownloader به‌گوشمان خورده است و کمابیش با کارشان آشنایی داریم.
اما برای دریافت کامل یک وبگاه در لینوکس چه طور می‌توان این کار را کرد؟

برای دریافت کامل یک website، به‌منظور مشاهده آفلاین یا هر چیز دیگری، با کمک wget می‌توان کار را پیش برد.




wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=windows --domains website.org --no-parent www.website.org/tutorials/html/



این دستور وب‌سایت زیر را به طور کامل دانلود می‌کند.

www.website.org/tutorials/html/

انتخاب‌هایی (Option) که در این دستور استفاده کردیم، بدین شرح است:

recursive -- : تمام وب‌سایت را دانلود کن.

domains website.org-- : لینک‌های خارج از دومین website.org را دنبال نکن.

page-requisites --: تمام عناصر موجود در صفحه را دریافت کن (تصاویر، css و از این دست چیزها).

html-extension --: فایل را با پسوند .html ذخیره کن.

convert-links--:لینک‌ها را طوری تبدیل کن که بشود به‌طور آفلاین ازشان استفاده کرد.

restrict-file-names=windows --: اسم فایل‌ها را طوری عوض کن که در ویندوز هم کار کنند.

no-clobber--:هیچ فایلی را بازنویسی نکن (در مواردی به‌کار می‌رود که دانلود قطع شده باشد و بخواهد مجدداً از سر گرفته شود).

no-parent --: یعنی مسیرهای بالاتر از/tutorials/html را باز نکن.
پیوند خبر:
http://www.jamejamonline.ir/papertext.aspx?newsnum=100949685508

==========

نقل شده از: http://foss.ir/modules.php?op=modload&name=News&file=article&sid=2182&mode=thread&order=0&thold=0

eshpilen
چهارشنبه 05 خرداد 1389, 09:43 صبح
افراد مسلط به شل و خط فرمان، ماهیت و قدرت واقعی شل و برنامه های خط فرمان لینوکس رو نشون دادن.

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

با برنامه find در خط فرمان هم فایلها مورد نظری رو پیدا میکردم (که اسمشون الگوی خاصی داشت)، بدون اینکه چیزی از قلم بیفته (اگر خودمون با چشم نگاه میکردیم یا حتی در محیط گرافیکی سیستم عامل جستجو میکردیم امکانش خیلی بیشتر بود)، و هم با آپشن -printf برنامهء find خروجی رو طوری فرمت میکردم که مستقیما بصورت فرمت آرایهء جاوااسکریپت مورد نظر باشه و کوتیشن و کاما هم برام تایپ شده باشه و از همون محیط کنسول مستقیما کپی کرده و داخل فایل HTML پیست کنم و لازم نباشه خودم با کلیدهای مکان نما اینور و اونور برم و کوتیشن و کاما اضافه کنم.
تعداد این فایلها و دایرکتوریها اونقدری زیاد بود که تمام این عملیات صرفه جویی قابل توجهی در وقت و انرژی ایجاد کنه. ضمنا فکر کنید با یک کاراکتر کم و زیاد و پس و پیش میتونه مشکل پیش بیاد؛ مشکلاتی که گاهی قابل تشخیص هم نیستن، چون ظاهرا خطایی پیش نمیاد، اما برنامه ناقص یا باگدار میشه.
مثلا آرایه های من مربوط به Preload کردن تصاویر منوهایی بودن که اگر هم اسم تصاویر درست تایپ نشده بودن یا چیزی از قلم افتاده بود لزوما تشخیص داده نمیشدن، چون ظاهر صفحه چیزی رو نشون نمیداد و حتی تمام بخشهای صفحه ظاهرا درست کار میکرد. یک تست جامع و دقیق عملی هم صرف نظر از امکانات و هوشمندی لازم برای ایجادش، برای تشخیص چنین مواردی علاوه بر اینکه خودش مستعد خطا هست وقت و انرژی زیادی صرف میکنه.

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

خب اینبار بازهم من کار رفع نقص کدهای دیگران رو انجام دادم (واسه سایت داییم!). اما حالا اگر روزی خودم خواستم سایتی رو طراحی کنم و چنین شرایطی داشتم میگم: خب Preload رو توی دفترچهء یادداشتم مینویسم تا دست آخر با خط فرمان خیلی سریعتر و راحتتر درستش کنم!!

تمام اینا که گفتم بخاطر این بود که:

۱- بعضی فکر میکنن اون خط فرمان بی ریخت و بدوی چیست و بعضیای دیگه لابد مرض دارن یا قدیمی پسند هستن که باهاش کار میکنن؛ درحالیکه قضیه خیلی وقتها میتونه چیز دیگه ای باشه و بعکس افرادی که در سوی دیگر هستن حق دارن فکر کنن که دیگران بدون خط فرمان چطوری با مشقت زندگی میکنن!!

۲- قابلیت ها و امکانات و روش های قدرتمند و پیشرفتهء استفاده از خط فرمان در برنامه نویسی رو متذکر بشم.

maryam126
چهارشنبه 04 خرداد 1390, 18:57 عصر
سلام.
محیط اجرایی shell programming کجاست؟
shell programming چیه؟
توروخدایکی جوای بده.

eshpilen
چهارشنبه 04 خرداد 1390, 19:35 عصر
محیط اجراش در خط فرمان لینوکس هست. چیزی شبیه به پنجرهء خط فرمان یا بقول بعضیا پنجرهء داس که در ویندوز حتما دیدید.
منتها خط فرمان لینوکس خیلی شاخه و از قدیم یه چیز اساسی و اصلی در لینوکس بوده و توش میشه تقریبا تمام کارها رو انجام داد (و شیرینی و سرعت و راحتی این کارها هم به شرط تسلط میتونه حتی از محیط گرافیکی هم بیشتر باشه) بغیر از کارهایی مثل طراحی گرافیک که ذاتا نیاز به محیط گرافیکی دارن.
فرمانها رو میشه در یک فایل هم ذخیره کرد و با اجرای اون فایل اون فرمانها که میتونن شبیه یک برنامهء کامل باشن اجرا بشن.

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