چگونه با Bash شاد کام باشیم (2)

استاندارد

یا علایم خاص در Bash

در قسمت قبل به بحث completion در Bash پرداختیم. این بار بحث شیرین Special Characters را خواهیم داشت. کاراکترهای خاص برای ایجاد قابلیتها و کاربردهای خاصی طراحی شدند که در امور روزمره کار با shell و همچنین در داشتن shell scriptهای بهینه‌تر به ما کمک میکنند.

Pipe (|)
این کاراکتر (که با Shift+\ قابل دسترسیه) همونطور که از اسمش پیداست کار ارتباطی انجام میده، به این شکل که با استفاده از pipe میشه خروجی (stdout) یک دستور رو به دستور بعدش فرستاد. کاربرد این موضوع زمانی هست که بخواید داده‌ای رو با استفاده از چند دستور یا برنامه پردازش کنید و خروجی فیلتر شده یا متفاوتی داشته باشید.
مثال ساده: برای دیدن یک پروسه خاص از لیست پروسه‌ها:

ps aux | grep apache2

دستور ps با پارامترهای داده شده فهرستی از پروسه‌های فعال در سیستم به ما میده. این فهرست معمولا طولانی هست. دستور grep هم عبارت داده شده رو داخل خطوط یک فایل یا ورودی پیدا میکنه و کل خط رو برمیگدونه. حالا نتیجه ترکیب این دو دستور با pipe اینه که خطوط حاوی عبارت apache2 از بین لیست طولانی پروسه‌ها جدا میشه و نمایش داده میشه. Pipe میتونه به تعداد نامحدودی در یک دستور خطی استفاده بشه:

cd /home; du --max-depth=1 ./ | sort -nr | head | awk '{ print $2 }' | cut -d/ -f2

که این دستور لیست 10 شاخه‌ای که بیشترین فضا رو در شاخه home اشغال کردند نمایش میده.

ًRedirections (>,<,>>)
این کاراکترها برای تغییر مسیر ورودی (stdin) و خروجی (stdout) و یا حتی خطاها (stderr) کاربرد دارند. برای مثال میتونید از یک فایل حاوی داده به عنوان ورودی استفاده کنید و بعد از پردازش لازم نتیجه رو در فایل دیگه‌ای ذخیره کنید یا به انتهاش اضافه (append) کنید.
کاراکتر > برای استفاده از محتویات یک فایل (معمولا متنی) به عنوان ورودی (stdin) استفاده میشه. کاراکتر < برای ذخیره خروجی (stdout) یک دستور در یک فایل و کاراکتر << برای append کردن خروجی به انتهای فایل استفاده میشه.
برای مثال از فایلی به نام ‘results’ حاوی لیست نمرات و اسامی دانش‌آموزان سطرهایی حاوی عبارت ali را جدا کرده و در فایل list ذخیره میکنیم:

sort -nr < results | grep -in ali > list

از این کاراکترها برای تغییر مسیر stdout به stderr و بالعکس هم میشه استفاده کرد، مثلا برای دستوراتی که به طور خودکار (مثلا cron) اجرا میشند گاهی این کار انجام میشه:

some_command 2>&1 >> /var/log/command_output

Tilde (~)
این کاراکتر همواره به شاخه خانگی (home directory) کاربر فعلی (که شما دارید باهاش کار میکنید یا دستور به نام اون اجرا میشه) اشاره میکنه. در مسیر دادن به کار میاد:

cd ~/projects → cd /home/ali/projects


Backticks (`)
وقتی عبارتی داخل این دو تا backtick قرار بگیره اجرا میشه و خروجیش مثل یک string به محیط bash برگردونده میشه. خاصیتش برای حالتیه که میخواید یک دستور (یا دستوراتی) اجرا بشه و نتیجه رو در دستور دیگه‌ای استفاده کنید. (بیشتر ممکنه برای shell scriptها کاربرد داشته باشه)
مثلا تمام فایلهایی که با temp شروع میشند رو حذف میکنیم:

rm -f `ls /home/ali/temp*`

اینجا اول دستور ls اجرا میشه و لیست فایلها به صورت یک رشته به دستور rm برمیگرده.

Semicolon (;)
برای جدا کردن دستورات از semicolon استفاده میشه. به این شکل که زمانی که میخواید چند دستور رو پشت سر هم در یک خط اجرا کنید باید انتها هر دستور یک semicolon بگذارید.
مثلا بعد از وارد کردن این دستور با تاخیر 7 ثانیه دستور import برای تصویربرداری بخشی از صفحه اجرا میشه:

sleep 7; import ~/screenshot_`date "+%Y-%m-%d"`.png; echo 'screenshot saved!'

Ampersand (&)
این کاراکتر در انتهای دستور باعث میشه دستور بعد از اجرا به Background بره و کارشو ادامه بده. (به Job Control مربوط میشه) مثلا زمانی که میخواید یک پروسه طولانی مدت اجرا کنید که نیاز به تعامل نداره میتونید به Background بفرستید و به کارتون ادامه بدید:

scp -rq /backup/daily/ user@server2:/media/backup &

مواردی که در این مقاله بهشون اشاره شده پرکاربردترین کاراکترهای خاص در کاربرد عمومی bash هستند. برای مطالعه بیشتر و مشاهده لیست کاملی از کاراکترهای خاص و کاربردشون به اینجا مراجعه کنید:
Advanced Bash-Scripting Guide: Chapter 3. Special Characters
در این مطلب به مسایلی مثل Job Control، Shell Script و Standard Streams و همچنین دستوراتی مثل awk، date، scp و … اشاره شد که چون ربطی به موضوع اصلی نداشتند توضیح بیشتری داده نشد. بله، میدونم که اغلب این موارد منحصر به bash نیست و در خیلی از shellهای دیگه هم کاربرد داره. ولی shell پایه اینجا bash فرض شده.

پ.ن: با تشکر از تذکر آیین‌نامه‌ای برادر متقی، And به Ampersand تغییر کرد. 🙂

9 دیدگاه در “چگونه با Bash شاد کام باشیم (2)

  1. کامبیز

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

  2. – تشکر، همین الان خواستم یه کاری بکنم که نیاز به pipe پیدا کردم و از مقاله شما استفاده بردم 😉
    و اون این بود:
    find ./ | wc -l

    – فکر میکنم بجای ; از && هم میشه استفاده کرد.

    – این متن هم خیلی جالبه در ارتباط با همین موضوع:
    http://freekeyboard.net/spip.php?article397

  3. این مثال رو:
    du –max-depth=1 /home/ | sort -nr | head | awk ‘{ print $2 }’ | cut -d/ -f2

    نمیدونم از کجا آوردی ولی برای من که این خروجیش بود:
    home
    home
    home
    home
    home
    home
    home
    home
    home
    home

  4. @نبی:

    && کمی معنی و کاربردش با semicolon فرق میکنه. && معمولا به شکل شرطیه، یعنی اگر دستور اولی درست اجرا بشه (از روی exit status تشخیص داده میشه) دستور بعدی هم اجرا میشه.

    برای اون مثال هم اشکال از دستور cut هست. من اینو برای حالتی نوشته بودم که در شاخه home باشم و به جای مسیر (جلوی du) . یا /. بزارم.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *