آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۸۶

پرسش و پاسخ شماره ۸۶

چگونه می‌توان هنگام اجرای یک فرمان از مستعارها یا توابع صرفنظر کرد؟

گاهی اوقات صرف نظر کردن از مستعارها (و توابع، از جمله توابع داخلی پوسته) سودمند است. به عنوان مثال، شاید در سیستم خود این تنظیم را داشته باشید:

alias grep='grep --color=auto'

اما گاهی اوقات، شما به انجام یک فرمان یک سطری به طرف لوله‌ها نیاز دارید که در آنجا رنگها آشفتگی ایجاد می‌کنند. هر یک از موارد زیر را می‌تونید استفاده کنید:

unalias grep; grep ...    #1
unalias -a; grep ...      #2
"grep" ...                #3
\grep ...                 #4
command grep ...          #5

‎#1‎ قبل از استفاده از grep مستعار آن را عزل می‌کند، اگر grep مستعار نشده باشد، کاری انجام نمی‌دهد. به هر حال مستعار برای بقیه نشست آن پوسته نیز از بین رفته است.

‎#2‎ مشابه قبلی، اما تمام مستعارها حذف می‌شوند.

‎#3‎ و ‎#4‎ یکسان هستند، به شما اجازه می‌دهند یکبار grep را در حالیکه از مستعار آن صرفنظر شده اجرا کنید، اما به طور کلی خیر.

‎#5‎ متمایز از دیگران است، در آن از مستعارها، توابع، و کلیدواژه‌های پوسته از قبیل time صرفنظر می‌شود. بازهم دستورات داخلی مانند echo نسبت به ‎/bin/echo‎ ترجیح داده می‌شوند. چند گزینه دارد که شاید بخواهید استفاده کنید -- ‎help command‎ را ببینید.

انتخاب ‎#6‎ نوشتن تابع خودتان خواهد بود که وقتی ترمینال خروجی استاندارد نباشد رفتار نامطلوب مرتکب نمی‌شود. به این ترتیب:

ls() {
  if test -t 1; then
    command ls -FC "$@"
  else
    command ls "$@"
  fi
}

استفاده از این تابع به جای ‎alias ls='ls -FC'‎ موقعی که تابع در یک خط لوله به کار می‌رود(یا هر وضعیت دیگر که در آن خروجی استاندارد ترمینال نیست) بعضی پرچم‌های خاص را غیر فعال می‌کند.

برای بحث بیشتر در مورد استفاده از توابع به جای مستعارها پرسش و پاسخ شماره 80 را ببینید.


CategoryShell

پرسش و پاسخ 86 (آخرین ویرایش ‎2009-08-30 21:09:35‎ توسط localhost)