Globbing

فصل ‎18‎- عبارت‌های منظم

‎18.2‎-‏ Globbing

Bash خودش نمی‌تواند عبارت‌های منظم را تشخیص دهد. داخل اسکریپت‌ها، این فرمان‌ها و برنامه‌ها -- از قبیل sed و awk -- هستند که عبارت‌های منظم را تفسیر می‌کنند.

Bash بسط نام‌فایل ‎[1]‎ را انجام می‌دهد -- پردازشی که با عنوان globbing شناخته می‌شود -- اما این بسط از مجموعه عبارت منظم استاندارد استفاده نمی‌کند. در عوض، globbing را تشخیص می‌دهد و کاراکترهای عام را بسط می‌دهد. Globbing، کاراکترهای عام استاندارد‎[2]‎ -- * و ?، لیست‌های کاراکتر داخل براکت‌های مربعی، و برخی کاراکترهای خاص دیگر (از قبیل ^ برای منفی نمودن معنی انطباق) -- را تفسیر می‌کند. به هرحال در globbing محدودیت‌های با اهمیتی روی کاراکترهای عام وجود دارد. رشته‌های شامل * با نام فایل‌هایی که با یک نقطه شروع می‌گردند، به عنوان مثال، مانند ‎.bashrc‎، مطابقت نمی‌کنند. ‎[3]‎ به همچنین، کاراکتر ? در globbing دارای معنای متفاوت از آن به عنوان بخشی از یک RE است.

bash$ ls -l
 total 2
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l t?.sh
 -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh

bash$ ls -l [ab]*
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1

bash$ ls -l [a-c]*
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1

bash$ ls -l [^ab]*
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l {b*,c*,*est*}
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt


Bash روی شناسه‌های خط‌فرمان نقل‌قولی نشده، بسط نام‌فایل را انجام می‌دهد. فرمان echo این مطلب را به اثبات می‌رساند.

bash$ echo *
a.1 b.1 c.1 t2.sh test1.txt

bash$ echo t*
t2.sh test1.txt

bash$ echo t?.sh
t2.sh


تغییر دادن روشی که Bash در globbing کاراکترهای خاص را تفسیر می‌کند، امکان‌پذیر است. یک فرمان ‎set -f‎ عمل globbing را غیر فعال می‌کند، و گزینه‌های nocaseglob و nullglob برای shopt رفتار globbing را تغییر می‌دهند.


همچنین مثال ‎11-5‎ را ببینید.

Caution

نام‌فایل‌های دارای فضای سفید می‌توانند باعث globbing با اشکال بشوند. ‎David Wheeler‎ چگونگی پرهیز از بسیاری دام‌های از این قبیل را نشان می‌دهد.

IFS="$(printf '\n\t')"       #                    حذف فاصله‌.

#                استفاده صحیح ‎glob‎:
#     همیشه در حلقه for قبل از glob، وجود فایل را کنترل کنید.
for file in ./* ; do        
#               از ‎./*‎ استفاده کنید، هرگز * خالی به کار نبرید
  if [ -e "$file" ] ; then  # کنترل اینکه آیا فایل موجود است.
     COMMAND ... "$file" ...
  fi
done

#         این مثال با مجوز از سایت ‎David Wheeler‎ برداشته شده.

یادداشت‌ها

‎[1]‎

بسط نام‌فایل یعنی بسط دادن الگوهای نام‌فایل یا قالب‌های شامل کاراکترهای خاص. برای مثال، ‎example.???‎ می‌تواند به ‎example.001‎ و/یا ‎example.txt‎ بسط بیابد.

‎[2]‎

یک کاراکتر عام، قابل قیاس با یک ژوکر در بازی ورق، می‌تواند (تقریباً) هر کاراکتر دیگری را نمایندگی کند.

‎[3]‎

بسط نام‌فایل می‌تواند با نام فایل‌های نقطه‌ای مطابقت نماید، اما فقط در صورتیکه الگو به طور مشخص شامل نقطه به عنوان یک کاراکتر لفظی باشد.

~/[.]bashrc    #     نه این به ‎~/.bashrc‎ بسط
~/?bashrc      #       خواهد یافت، و نه این.
#  کاراکترهای عام و فوق‌کاراکترها در globbing
               #+      به نقطه بسط نمی‌یابند.

~/.[b]ashrc    # به ‎~/.bashrc‎ بسط خواهد یافت
~/.ba?hrc      #                  به همچنین.
~/.bashr*      #                  به همچنین.

#تنظیم گزینه ‎dotglob‎ این عمل را خاموش می‌کند.

# با تشکر از ‎S.C.‎