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

5 شگرد جالب و کاربردی خط فرمان لینوکس

<p>تو این آموزش می خوایم در مورد ۵ روش جالب برای استفاده‌ی بهتر و سریع‌تر از خط فرمان لینوکس با هم صحبت کنیم. انشاالله به مرور قسمت‌های دیگه‌ی این آموزش رو هم می‌تونید از لینوکسی‌ها مطالعه کنید.  در آموزش‌های بعدی کارهای هیجان انگیزتری در خط فرمان انجام خواهیم داد!</p> <p><img src="/assets/images/terminal2.png" alt="" /></p> <p><strong>توجه:</strong> در این آموزش فرض شده که خواننده حداقل آشنایی نسبی با لینوکس و دستورات خط فرمان داره؛ اگه مشکلی تو فهمیدن کاری که این دستورات انجام میدن دارین، می تونین به <a href="http://linuxihaa.ir/%D9%85%D8%B1%D8%AC%D8%B9-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3/">اینجا</a> مراجعه کنید.</p> <p><strong>توجه:</strong> <em>تمام این مثال‌ها تو پوسته‌ی bash‌ (پوسته‌ی پیش فرض اکثر توزیع‌های لینوکس) تست شده‌اند.</em></p> <p>خب! با مثال اول شروع می‌کنیم:</p> <h3 id="section">۱. چطوری سریع و بی دردسر بین دایرکتوری های مختلف جابجا بشیم؟</h3> <p>معمولا وقتی داریم با خط فرمان لینوکس کار می‌کنیم، لازمه که بین تعدادی دایرکتوری مرتبا سوییچ کنیم. مثلا توی دایرکتوری A هستیم، به دایرکتوری B منتقل میشیم، حالا می خوایم دوباره برگردیم به دایرکتوری A. نوشتن کل آدرس اون دایرکتوری ممکنه کار مشکلی باشه. تو همچین شرایطی می تونیم از دستور میان‌بر <code class="highlighter-rouge">cd -</code> استفاده کنیم. مثلا:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="nb">pwd</span> /home/mohammad <span class="gp">$ </span><span class="nb">cd</span> /usr/local/bin/ <span class="gp">$ </span><span class="nb">cd</span> - /home/mohammad </code></pre> </div> <p>این جوری می‌تونیم به راحتی بین دو تا دایرکتوری جابجا بشیم.</p> <h3 id="section-1">۲. چطور  از تاریخچه‌ی خط فرمان به صورت کاربردی استفاده کنیم؟</h3> <p>با استفاده از <code class="highlighter-rouge">!!</code> می تونیم آخرین دستور اجرا شده را دوباره فراخوانی کنیم. مثلا:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>uname -a Linux mohammad-1015PN 3.8.0-26-generic <span class="c">#38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux</span> <span class="gp">$ </span>!! uname -a Linux mohammad-1015PN 3.8.0-26-generic <span class="c">#38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux</span> </code></pre> </div> <p>خب! حالا چه کارای خلاقانه‌ای می تونیم با<strong> !!</strong> انجام بدیم؟<br /> اول از همه می‌تونیم با دستورات دیگه ترکیبش کنیم، مثلا:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>!! | grep Linux uname -a | grep Linux Linux mohammad-1015PN 3.8.0-26-generic <span class="c">#38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux</span> </code></pre> </div> <p>و معمولا خیلی پیش میاد که دستوری رو وارد می کنید و خطایی رو مشاهده می کنین که این دستور، سطح دسترسی root لازم داره. تو این موارد اولین چیزی که به نظر می رسه اینه که دکمه ی up arrow  و بعد home رو بزنیم و ابتدای دستور sudo رو اضافه کنیم. با استفاده از !!‌ می تونیم راحت تر این کار رو انجام بدیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>touch new_binary touch: cannot touch <span class="s1">'new_binary'</span>: Permission denied <span class="gp">$ </span>sudo !! sudo touch new_binary <span class="o">[</span>sudo] password <span class="k">for </span>mohammad: <span class="gp">$ </span>ls new_binary new_binary </code></pre> </div> <p>مورد استفاده دیگه می‌تونه این باشه که می‌خوایم یه دستور رو به آخر یه فایل shell اضافه کنیم. یا مثلا یه فایل shell‌ از دستوری که الان وارد کردیم درست کنیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>ls -lart /home/mohammad/test/<span class="k">*</span>.py -rw-rw-r-- 1 mohammad mohammad 50 Mar 1 00:23 /home/mohammad/test/test.py <span class="gp">$ </span><span class="nb">echo</span> !! &gt; myscript.sh <span class="nb">echo </span>ls -lart /home/himanshu/practice/<span class="k">*</span>.py &gt; script.sh <span class="gp">$ </span>cat script.sh ls -lart /home/mohammad/test/<span class="k">*</span>.py </code></pre> </div> <p>پس مسلما استفاده از !! می تونه خیلی کمک کننده باشه و باعث صرفه جویی در وقت میشه.<br /> مورد دیگه استفاده از <strong>!</strong> به صورت تکی هست که مثلا تو این مورد می‌تونه کاربرد داشته باشه که می‌خوایم یه دستور خاص رو از سری دستوراتی که قبلا وارد کردیم اجرا کنیم، مثلا:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="nb">history</span> ... ... ... 2039 uname -a | grep Linux 2040 dmesg 2041 clear 2042 <span class="nb">cd </span>bin 2043 clear 2044 <span class="nb">pwd </span>2045 touch new_binary 2046 sudo touch new_binary 2047 ls new_binary 2048 <span class="nb">history</span> <span class="gp">$ </span>!2039 uname -a | grep Linux Linux mohammad-1015PN 3.8.0-26-generic <span class="c">#38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux</span> </code></pre> </div> <p>خیلی راحت تونستیم دستور 2039 از تاریخچه ی دستورهای خط فرمان رو دوباره اجرا کنیم، بدون اینکه نیازی باشه دوباره تایپش کنیم. این روش حتی از copy/paste هم راحت تره، نه؟!<br /> حتی می‌تونیم به جای شماره دستور از ۲- ، یعنی عدد منفی استفاده کنیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="nb">history</span> ... ... ... 2049 ! 2039 2050 uname -a | grep Linux 2051 <span class="nb">history</span> <span class="gp">$ </span>!-2 uname -a | grep Linux Linux mohammad-1015PN 3.8.0-26-generic <span class="c">#38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux</span> </code></pre> </div> <p>اجرا کردن دستور با ورودی های دستور قبل با استفاده از !$</p> <p>فقط یه مثال رو ببینیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>ls /home/mohammad/test/<span class="k">*</span>.py /home/mohammad/test/firstPYProgram.py </code></pre> </div> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>ls -lart !<span class="err">$</span> ls -lart /home/mohammad/test/<span class="k">*</span>.py -rw-rw-r-- 1 mohammad mohammad 50 Mar 1 00:23 /home/mohammad/test/firstPYProgram.py </code></pre> </div> <p>که مقدار ورودی دستور قبلی رو تو دستور بعدی به عنوان ورودی استفاده کردیم.<br /> می تونیم از <code class="highlighter-rouge">![keyword]</code> برای تکرار آخرین دستوری که با keyword شروع میشه، استفاده کنیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>!ls ls -lart /home/mohammad/practice/<span class="k">*</span>.py -rw-rw-r-- 1 mohammad mohammad 50 Mar 1 00:23 /home/mohammad/test/firstPYProgram.py </code></pre> </div> <h3 id="section-2">۳. چطور از  کاما استفاده کنیم؟!</h3> <p>یکی از کاربرد های کاما اینه که بخوایم یه رشته یا ابتدای یه رشته رو به حروف کوچک تبدیل کنیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="nv">words</span><span class="o">=</span><span class="s2">"Example of comma OPERATOR"</span> </code></pre> </div> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="nb">echo</span> <span class="k">${</span><span class="nv">words</span><span class="p">,</span><span class="k">}</span> example of comma OPERATOR </code></pre> </div> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span><span class="o">{</span>words,,<span class="o">}</span> example of comma operator </code></pre> </div> <p>که تو مثال اول فقط حرف اول رشته‌ی تعریف شده، و تو مثال دوم، کل رشته رو به حروف کوچک تبدیل کردیم.</p> <p>استفاده از  کاما در اسم فایل</p> <p>یکی از کاربرد‌های جالب استفاده از کاما می‌تونه این باشه که مثلا می‌خوایم با دستوری مثل touch سه تا فایل بسازیم.</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>touch new_file<span class="o">{</span>1,2,3<span class="o">}</span> <span class="gp">$ </span>ls new_file<span class="k">*</span> new_file1 new_file2 new_file3 </code></pre> </div> <p>با کاما خیلی راحت تونستیم اسم فایل‌ها رو وارد کنیم. در واقع محتویات داخل {} هر کدوم به اسم فایل اضافه شدن و در نهایت سه تا اسمی که می‌خواستیم ساخته شد.</p> <p>یکی از پرکاربردترین کارهایی که معمولا با این روش انجام میشه اینه که بخوایم اسم یه فایل رو موقتا تغییر بدیم تا مثلا دو نسخه ی جدید و قدیمی رو ازش داشته باشیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>mv my_filename.<span class="o">{</span>old,new<span class="o">}</span> </code></pre> </div> <p>که فایلی به اسم my_filename.old رو به my_filename.new تغییر میده.</p> <h3 id="section-3">۴. چطور با فایلی که ابتدای اسمش خط تیره (-) داره، کار کنیم؟</h3> <p>حتما می دونید که تو خط فرمان معمولا پارامترهای دستورات مختلف رو با خط تیره مشخص می کنیم. حالا فرض کنید فایلی به اسم <code class="highlighter-rouge">-1mpFile.out</code> رو می خوایم پاک کنیم. خب! اگه از دستور <code class="highlighter-rouge">$ rm 1mpFilee.out</code> استفاده کنیم. با این خطا مواجه میشیم (حتی اگه از “” استفاده کنیم بازم خطا میده!) :</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code>rm: invalid option -- <span class="s1">'1'</span> Try <span class="s1">'rm ./-1mpFile.out'</span> to remove the file <span class="s1">'-1mpFile.out'</span>. Try <span class="s1">'rm --help'</span> <span class="k">for </span>more information. </code></pre> </div> <p>یه راه حل، همین راه حلی هست که خط فرمان برامون نوشته، راه حل دیگه می تونه این باشه که دستور بالا رو اینجوری بنویسیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>rm -- -1mpFile.out </code></pre> </div> <p>یعنی دو تا خط تیره قرار میدیم و بعد اسم فایلمون.</p> <p>این راه حل رو میشه تو موارد مشابه با دستورات دیگه هم به کار برد.</p> <h3 id="section-4">۵. چطور همه ی فایل های یک دایرکتوری به جز تعداد خاصی رو حذف کنیم؟</h3> <p>فرض کنید یه دایرکتوری داریم با تعداد زیادی فایل و می‌خوایم همه رو حذف کنیم، به جز تعدادی که پسوندهای خاصی دارند. مثلا تو این دایرکتوری:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>ls a.out Cfile.c file.c macro.c my_printf.c orig_file.orig stacksmash.c bfrovrflw.c cmd.c firstPYProgram.py main.c new_printf.c orig_file.rej test_strace.c bufrovrflw.c env.c helloworld.c my_fopen.c new.txt prog.c virtual_func.c </code></pre> </div> <p>می خوایم همه‌ی فایل‌های تو دایرکتوری رو پاک کنیم، به جز فایل‌های سورس کدمون(فایل های با پسوند c و py). برای این کار می تونیم از دستور rm به این صورت استفاده کنیم:</p> <div class="language-sh highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>rm !<span class="o">(</span><span class="k">*</span>.c|<span class="k">*</span>.py<span class="o">)</span> <span class="gp">$ </span>ls bfrovrflw.c Cfile.c env.c firstPYProgram.py macro.c my_fopen.c new_printf.c stacksmash.c virtual_func.c bufrovrflw.c cmd.c file.c helloworld.c main.c my_printf.c prog.c test_strace.c </code></pre> </div> <p>می بینید که همه‌ی فایل ها به جز اونایی که پسوند c و py داشتن، حذف شدن. (در اینجا اپراتور ! به معنی مکمل هست، یعنی همه به جز این فایل‌ها)</p> <p>البته از این روش مشخص کردن اسامی فایل‌ها تو دستورات دیگه هم میشه استفاده کرد.</p> <p>ادامه دارد… :)</p>



برچسب ها :