منبع اصلی نوشتار زیر در این لینک قرار دارد

اصلاحیه‌ای برای بسط glob


nullglob یک گزینه پوسته Bash است که بسط glob را به گونه‌ای اصلاح می‌کند تا الگوهایی که بر هیچ نام فایلی منطبق نمی‌گردند به جای بسط یافتن به خود آن الگوها، به صفر شناسه بسط ‌داده شوند.

به طور عادی، وقتی یک glob که بر هیچ نام فایلی منطبق نمی‌شود، بسط داده می‌شود، بدون تغییر باقی می‌ماند. بدین معنی که نتایجی مانند این به دست می‌آورید:

  •  $ rm *.bak
     rm: cannot remove `*.bak': No such file or directory

جانشین غیر منطبق‎ *.bak‎ با هیچ چیزی تعویض نمی‌شود، به طور مستقیم به فرمان rm تحویل می‌گردد، همانطور که اگر نام یک فایل ‌بود. پس فرمان rm سعی می‌کند آن را حذف کند، و شکست می‌خورد، با یک پیغام خطای معقول.

به هرحال، این موضوع در برنامه‌نویسی باعث برخی نتایج نامطلوب می‌گردد. یک آرایه مانند این را ملاحظه کنید:

  •  # Bash  در پوسته
     files=(*)
     echo "There are ${#files[*]} files here."

اگر هیچ فایلی با glob انطباق نیابد، این ناموفق است درحالیکه یک فایل گزارش خواهد نمود، به علت آنکه آرایه با یک عنصر منفرد * بارگیری می‌شود.

گزینه nullglob امکان اجتناب از این مشکل را برای ما فراهم می‌کند. اگر این گزینه تنظیم شود، جانشینِ منطبق نشده به جای اینکه به عنوان یک کلمه منفرد آنجا بماند، کاملاً کنار گذاشته می‌شود. -- با صفر کلمه جایگزین می‌شود-- .

  •  # Bash  در پوسته
     shopt -s nullglob
     files=(*)
     echo "There are ${#files[*]} files here."

گزینه nullglob به طور پیش‌فرض فعال نیست زیرا موقعیت‌های دیگری موجود است، که در آنها این رفتارش می‌تواند بینهایت مبهوت کننده باشد. برای نمونه، اگر یک جانشین انطباق نیافته، از لیست شناسه‌های ls حذف گردد، به طور کاملاً غیر منتظره‌ای رفتار می‌کند:

  •   shopt -s nullglob
     ls *.xyzqj
     # .در این حالت تمام فایلهای این دایرکتوری لیست خواهند شد
     # ‎.بدون شناسه به کار برود ls‎ درست مانند موقعی که دستور  

ممکن است گزینه nullglob خودش برای تمام حالات کفایت نکند. به طور پیش‌فرض glob بر نام فایلهایی که نامشان با نقطه شروع می‌شود، منطبق نمی‌شود، مگر اینکه خود جانشین نیز با نقطه شروع شود. اگر این فایلها که فایلهای پنهان نیز شناخته می‌شوند، باید با جانشین مطابقت داده شوند، آنوقت ممکن است شخص مایل باشد از گزینه dotglob استفاده کند.

  •  # Bash در پوسته
     shopt -s dotglob
     shopt -s nullglob
     files=(*)
     echo "There are ${#files[*]} files here."

فقط به خاطر داشته باشید که این گزینه‌ها تا موقعی که غیر فعال نشده‌اند، برای پردازش پوسته جاری مؤثر باقی می‌مانند.

ادامه مطلب



به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد