یک مستعار Bash در اصل چیزی بیش از یک میانبر صفحه کلید، یک کوتهنوشت، یک وسیله برای پرهیز از تایپ کردن رشته فرمان طولانی نیست. اگر به عنوان مثال، ما alias lm="ls -l | more" را در فایل ~/.bashrc قرار بدهیم، آنوقت هر lm [1] تایپ شده در خط فرمان به طور خودکار با یک ls -l | more تعویض خواهد گردید. این میتواند مقدار زیادی از تایپ کردن در خط فرمان را صرفهجویی کرده و از لزوم به خاطر سپردن ترکیبهای پیچیده فرمانها و گزینهها پیشگیری نماید. تنظیم alias rm="rm -i" (حالت محاورهای حذف کردن) ممکن است اندوه نسبتا زیادی را برطرف نماید، چون میتواند مانع حذف کردن ناخواسته فایلهای مهم بشود.
در یک اسکریپت، مستعارها دارای فایده بسیار محدودی هستند. پسندیده بود اگر مستعارها میتوانستند برخی کارکردهای پیشپردازنده C، از قبیل بسط ماکرو را به عهده بگیرند، اما متاسفانه Bash در درون بدنه مستعار، شناسهها را بسط نمیدهد. [2] علاوه براین، یک اسکریپت در بسط دادن خود مستعار در درون «ساختارهای مرکب» از قبیل جملههای if/then، حلقهها و توابع، ناموفق است. یک محدودیت اضافی این است که یک مستعار به طور بازگشتی بسط نمییابد. تقریبا همواره، هر آنچه ما مایل هستیم یک مستعار در اسکریپت انجام بدهد، توسط یک تابع میتواند به طور کارآمدتری انجام بشود.
مثال 25-1. مستعارها در یک اسکریپت
#!/bin/bash # shopt -s expand_aliases #این گزینه باید تنظیم شود، وگرنه اسکریپت مستعارها را بسط نمیدهد. #نخست، مقداری دستگرمی. alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."' Jesse_James echo; echo; echo; alias ll="ls -l" # برای تعریف مستعار، نقلقول منفرد (') یا نقلقول دوگانه (") میتواند به کار برود. echo "Trying aliased \"ll\":" ll /usr/X11R6/bin/mk* #* در مستعار کار میکند. echo directory=/usr/X11R6/bin/ prefix=mk* #ببینید آیا کاراکتر عام باعث مشکلات میشود. echo "Variables \"directory\" + \"prefix\" = $directory$prefix" echo alias lll="ls -l $directory$prefix" echo "Trying aliased \"lll\":" lllلیست بلند تمام فایلها در /usr/X11R6/bin که با mk شروع میشوند. #یک مستعار میتواند با متغیرهای بهم پیوسته -- شامل کاراکترهای عام -- کار کند. TRUE=1 echo if [ TRUE ] then alias rr="ls -l" echo "Trying aliased \"rr\" within if/then statement:" rr /usr/X11R6/bin/mk* #به پیغام خطا منجر میگردد! #داخل دستورالعملهای مرکب، مستعارها بسط داده نشدهاند. echo "However, previously expanded alias still recognized:" ll /usr/X11R6/bin/mk* fi echo count=0 while [ $count -lt 3 ] do alias rrr="ls -l" echo "Trying aliased \"rrr\" within \"while\" loop:" rrr /usr/X11R6/bin/mk* #* یا مستعار در اینجا بسط داده نمیشود. #alias.sh: line 57: rrr: command not found let count+=1 done echo; echo alias xyz='cat $0' #اسکریپت خودش را لیست میکند. #به نقلقول قوی توجه نمایید. xyz #به نظر میرسد این کار میکند، هرچند که مستندات Bash بیان #+مینماید که کار نمیکند. # #اما، به طوری که Steve Jacobson اشاره میکند، پارامتر $0 #+به مجرد تعریف مستعار، بیدرنگ بسط داده میشود. exit 0
فرمان unalias یک مستعار قبلاً تعریف شده را حذف مینماید.
مثال 25-2. unalias: برقرار کردن و حذف کردن یک مستعار
#!/bin/bash # shopt -s expand_aliases #بسط مستعار را فعال میکند. alias llm='ls -al | more' llm echo unalias llm #حذف مستعار. llm #پیغام خطا نتیجه میشود، چون llm دیگر شناسایی نمیشود. exit 0
bash$ ./unalias.sh total 6 drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 . drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 .. -rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh ./unalias.sh: llm: command not found
[1] | ... به عنوان کلمه اول رشته فرمان. واضح است که یک مستعار فقط در ابتدای یک سطر فرمان معنادار است. |
[2] | اما، به نظر میرسد مستعارها پارامترهای مکانی را بسط میدهند. |