نوشته شده در January 7, 2008 و موضوع نکات و ترفند ها ویندوز توسط رضا مقدری

معرفی Cygwin شبیه ساز محیط اجرائی خطوط دستور در یونیکس بر روی ویندوز / قسمت 2



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

لیست کردن فایل ها
در پست قبلی که هدف اصلی معرفی چند دستور ساده بود، یکی از دستورهایی که معرفی گردید ls بود این دستور به شما کمک می کرد تا لیستی از فایلهای درون یک دایرکتوری را مشاهده نمائید. برای کسانی که روزهای اول درگیری شان با خطوط دستور است بایستی متوجه این نکته بشوند که هر دستوری یا هر برنامه یی که در Command line یا اصطلاحا cmd اجرا شود یک سری زیر دستور یا گزینه های جانبی نیز بعضا داراست، این گزینه های جانبی با مثلا افزوده شدن یک حرف یا یک عبارت به دستور اصلی قابل بهره برداری می شوند. برای مثال ls فقط لیستی از فایلهای درون یک دایرکتوری را نشان می داد ولی حالا ls -l یک فایل لیست طولانی تر و کامل تر که حاوی اطلاعاتی از قبیل تاریخ ایجاد فایل، حجمش و سطوح مختلف دسترسی به آن است را نمایش می دهد. می توانیم حالا این دستور را با زیر دستوری کامل تر اجرا کنیم و آن را به صورت ls -lh تایپ می کنیم، l که در دستور قبلی هم بود برای افزوده شدن گزینه ی long listing است به دستور ls که گفتیم حاصلش هم چه می شود ولی h- اینبار گزینه ی دیگری با عنوان "human readable" file sizes را نیز برای دستور ls فعال می کند. اول بگذارید ببینیم این دستورات در عمل چه خروجی هایی به شما می دهند، بعد می توانیم بهتر توضیح دهیم:

 

Reza@reza-laptop ~
$ ls
done.txt  honey-im-home.txt  report.txt  todo  todo.txt

Reza@reza-laptop ~
$ ls -l
total 9
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 done.txt
-rw-r--r-- 1 Reza None    0 Jun  8 19:54 honey-im-home.txt
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 report.txt
-rwxr-xr-x 1 Reza None 7593 Jun  8 20:10 todo
-rw-r--r-- 1 Reza None   46 Jun 14 09:44 todo.txt

Reza@reza-laptop ~
$ ls -lh
total 9.0K
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 done.txt
-rw-r--r-- 1 Reza None    0 Jun  8 19:54 honey-im-home.txt
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 report.txt
-rwxr-xr-x 1 Reza None 7.5K Jun  8 20:10 todo
-rw-r--r-- 1 Reza None   46 Jun 14 09:44 todo.txt

Reza@reza-laptop ~

 

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


دستورات مستعار
الان دیدیم که کارایی دستور ls چه هست و با زیر دستورهایش چه گزینه هایی به آن اضافه می شود، با زیر دستورهایی که گفتیم دستور ls بسیار کارآمد تر شد ولی آیا راهی هست که مثلا وقتی دستور ls را وارد می کنیم خود به خود عملکردش مثل موقعی باشد که ls -lh را وارد می کنیم؟ بله هست، بایستی یک دستور مستعار یا معادل بسازیم. (-: برای اینکار به سراغ دایرکتوری خانگی Cygwin و فایل bashrc. می رویم که در آدرسی مشابه c:\cygwin\home\Reza\.bashrc بایستی قرار داشته باشد، فایل مذکور را با یک وایرایشگر متن مثل نت پد باز می کنیم (توصیه میکنم با نت پد++ بازش کنید چون ویرایشش با نت پد دشوار است) عبارت alias cl='clear;pwd;ls' را بیابید و بعد با زدن Enter یک خط پائین بیائید و عبارت زیر را وارد کنید و سپس فایل را ذخیره نمائید:

alias ls='ls -lh'

 

اکنون Cygwin را ری استارت کنید و بعد دستور ls را وارد کنید خواهید دید اینبار دستور ls به صورت معادل ls -lh عمل خواهد کرد.

ویرایش فایلهای متنی
کسانی که با خطوط دستور کار می کنند با فایلهای متنی زیاد سر و کار دارند لذا دستورات مختلفی وجود دارد که با آنها می توانید فایلهای متنی ایجاد کنید و درشان جستجو نمائید، ویرایششان کنید به روزشان نمائید و غیره... . یکی از راه های ساده ی اضافه کردن متن به این دسته از فایلهای استفاده از << می باشد، برای مثال فرض کنید من قصد دارم یک فایل متنی با عنوان idea.txt ایجاد کنم و ایده هایم را درش یادداشت کنم. برای اینکار به صورت زیر عمل میکنم:

Reza@reza-laptop ~
$ echo "idea1- Making a blog" >> idea.txt

Reza@reza-laptop ~
$ echo "idea2- Name it updateblog" >> idea.txt

Reza@reza-laptop ~
$ echo "idea3- Hell yeah let's do it" >> idea.txt

Reza@reza-laptop ~
$

 

خوب حالا اگر بخواهیم محتوای فایل idea.txt را مشاهده کنیم بایستی از دستور cat استفاده کنیم. به صورت زیر:

Reza@reza-laptop ~
$ cat idea.txt
idea1- Making a blog
idea2- Name it updateblog
idea3- Hell yeah let's do it

Reza@reza-laptop ~
$

 

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

جستجو در متون توسط grep
یکی از مفید ترین و کارآمد ترین دستورات یونیکس دستوری است با عنوان grep که با آن می توانید توسط یک کلمه کلیدی بخشی از متن مورد نظرتان را در یک فایل متنی جستجو کنید، مثلا فرض کنید من می خواهم ایده ی دوم خودم را در فایل idea.txt جستجو کنم، بایستی به این صورت عمل نمایم:

Reza@reza-laptop ~
$ grep idea2 idea.txt
idea2- Name it updateblog

Reza@reza-laptop ~
$

 

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

بگذارید یک مثال بزنم تا بهتر متوجه منظور شوید، فرض کنید می خواهیم لیستی فقط از فایلهای با پسوند txt. در یک دایرکتوری را به دست بیاوریم. برای اینکار کافی است بین دستورات ls و grep یک لوله کشی مختصر انجام دهیم. به این شکل:

Reza@reza-laptop ~
$ ls | grep .txt
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 done.txt
-rw-r--r-- 1 Reza None  120 Jun 14 09:58 idea.txt
-rw-r--r-- 1 Reza None    0 Jun  8 19:54 honey-im-home.txt
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 report.txt
-rw-r--r-- 1 Reza None   46 Jun 14 09:44 todo.txt

Reza@reza-laptop ~
$

 

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

Reza@reza-laptop ~
$ ls > file-listing.txt

Reza@reza-laptop ~
$ cat file-listing.txt
total 10K
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 done.txt
-rw-r--r-- 1 Reza None    0 Jun 14 10:09 file-listing.txt
-rw-r--r-- 1 Reza None  120 Jun 14 09:58 idea.txt
-rw-r--r-- 1 Reza None    0 Jun  8 19:54 honey-im-home.txt
-rw-r--r-- 1 Reza None    0 Jun  8 20:13 report.txt
-rwxr-xr-x 1 Reza None 7.5K Jun  8 20:10 todo
-rw-r--r-- 1 Reza None   46 Jun 14 09:44 todo.txt

Reza@reza-laptop ~
$

 

در بالا ما خروجی دستور ls را در یک فایل متنی به اسم file-listing.txt ذخیره کردیم و سپس همان فایل را با دستور cat فراخوانی کردیم (-; .

استفاده ی مجدد از دستورات ذخیره شده در History
بعد از مدتی که با خطوط دستور کار کردید ممکن است بخواهید به عقب برگردید و دستوری را که قبل تر وارد کرده اید را مجددا اجرا کنید. خوشبختانه یونیکس و البته Cygwin تک تک دستوراتی را که شما وارد و اجرا می کنید را در فایلی با عنوان history. ذخیره می نماید. می توانید دستور history را وارد کنید تا 100 دستور آخری که اجرا نموده اید را مشاهده نمائید، که حاصلش چیزی شبیه به این خواهد بود:

Reza@reza-laptop ~
$ history
   ....
  82  echo idea.txt
  83  grep idea2 idea.txt
  84  reza grep
  85  ls | grep .txt
  86  ls
  87  ls | grep todo
  88  ls | grep .txt
  89  ls > file-listing.txt
  90  cat file-listing.txt
  91  history

 

حالا مثلا می خواهید دستور شماره 87 را مجددا اجرا یا اصطلاحا redo کنید، اشتباه ننمائید نیازی به تایپ مجدد نیست کافی است یک علامت تعجب و شماره ی دستور مورد نظر را تایپ کنید و کلید Enter را بزنید، تمام شد! اگر با توجه به history بالا تایپ کنیم 87! دستور ls | grep todo اجرا خواهد شد (redo می شود).

حالا با استفاده از یک لوله می توانیم تاریخچه ی استفاده از یک دستور خاص را از داخل history بیرون بکشیم، به صورت زیر:

Reza@reza-laptop ~
$ history | grep ls
   11  ls
   13  ls
   14  cls
   20  ls
   21  ls
   27  ls
   46  man ls
   47  ls -l
   48  ls
   49  man ls
   50  ls -lh
   51  ls
   ...

 

جالب شد، نه؟ (-;

فراخوانی زیر دستورهای یک دستور / خواندن Manual یک دستور
اگر کسی به خطوط دستور علاقه مند شده باشد می خواهد دائما از همه ی زیر دستورات یک دستور اصلی مطلع شود، می توان در گوگل دنبال چنین مواردی گشت، اما من و شما وقت مان بیشتر از این می ارزد که بخواهیم دستورات را به صورت دستی گوگل کنیم لذا دستور man که مخفف Manual است همه ی آن چیزی است که نیاز داریم. کافی است برای دسترسی به همه ی زیر دستورات یک دستور ابتدا man و بعد با یک فاصله دستور مورد نظر را تایپ کنید و سپس کلید Enter را بزنید. همین الان می توانید این کار را در مورد ls انجام دهید و نتیجه اش را ببینید. (و البته برای اینکه از بخش manual خارج شوید کلید Q را بزنید)

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

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

mohandes Donbaleh


joseph1155 @ January 7, 2008 1:17 PM :

salam ketabai ke moarefy mikonin kheili khooban ,,agar mishe sitaei ro moarefy konin ke beshe noskheye pdfesho down kard
yani hadaghal bara foroosh nabashe

amin @ January 7, 2008 11:40 PM :

عالی بود.دستت درد نکنه.
این دستور grep واقعا عالیه.مخصوصا اینکه تعداد کاراکتر (دو نقطه دی) رو تو history پیدجین نگاه کنی! آبرو بره یه خورده :)
منتظر بقیه اش هستیم