مستعارها

فصل ‎25-. مستعارها

یک مستعار ‎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]‎

اما، به نظر می‌رسد مستعارها پارامترهای مکانی را بسط می‌دهند.