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
را اجرا نمودهایم، تقریباً نصف کردن زمان اجرای اسکریپت.
مثالهای مخصوص بیشری را در بخش نکتهها و اشارهها از این آموزش بحث میکنیم.