12. برنامه های خارجی

از برنامه‌های خارجی اغلب در داخل اسکریپت پوسته، استفاده می‌شوند، تعدادی دستورداخلی( مانند echo، which، و test که به طور معمول داخلی هستند)، وجود دارند، اما اکثر فرمان‌های سودمند در واقع برنامه‌های کاربردی یونیکس می‌باشند، از قبیل tr، grep، expr و cut.

backtick ‎(`)‎ نیز اغلب با برنامه‌های خارجی همدم است. به همین علت، ما اول backtick را بحث خواهیم کرد.
backtick برای نشان دادن آن که، متن محصور شده در آن باید به عنوان یک دستور اجرا گردد، استفاده می‌شود. فهمیدن این کاملاً ساده است. اول یک پوسته محاوره‌ای برای خواندن نام کامل شما از فایل ‎/etc/passwd‎ به کار می‌رود:

$ grep "^${USER}:" /etc/passwd | cut -d: -f5
Steve Parker

حالا این خروجی را در یک متغیر که به طور آسان‌تری می‌توانیم دستکاری کنیم قرار می‌دهیم:

$ MYNAME=`grep "^${USER}:" /etc/passwd | cut -d: -f5`
$ echo $MYNAME
Steve Parker

به طوری که می‌بینیم backtick به سادگی خروجی استاندارد را از هر دستور یا دستوراتی که برای اجرا انتخاب کرده‌ایم می‌گیرد. همچنین اگر بخواهید یک فرمان کُند یا مجموعه‌ای از دستورات را اجرا نموده، و تکه‌های خروجی را تفکیک کنید ، می‌تواند کارایی را بهبود بخشد:


#!/bin/sh
find / -name "*.html" -print | grep "/index.html$"
find / -name "*.html" -print | grep "/contents.html$"

این کد برای اجرا می‌تواند زمان زیادی بگیرد، و ما می‌خواهیم دومرتبه آن را اجرا کنیم!
یک راه‌حل بهتر این است:


#!/bin/sh
HTML_FILES=`find / -name "*.html" -print`
echo "$HTML_FILES" | grep "/index.html$"
echo "$HTML_FILES" | grep "/contents.html$"
توجه: نقل‌قول‌های اطراف‎ $HTML_FILES ‎ برای حفظ سطر جدید بین هر فایل لیست شده ضروری هستند. در غیر آن صورت، grep یک سطر بلند بزرگ متن می‌بیند، و نه یک سطر برای هر فایل.

به این روش، ما فقط یکبار دستور آهسته find را اجرا نموده‌ایم، تقریباً نصف کردن زمان اجرای اسکریپت.

مثال‌های مخصوص بیشری را در بخش نکته‌ها و اشاره‌ها از این آموزش بحث می‌کنیم.

Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید