Cuộn xuống ...
Tên tệp .
và ..
luôn bị bỏ qua khi GLOBIGNORE
được đặt và không null.
Hầu hết thời gian, không mong muốn bao gồm .
và ..
như các ký tự đại diện, vì chúng không đại diện cho các tệp trong thư mục - chúng là hack để làm cho điều hướng thư mục hoạt động. Trong thực tế, nguồn gốc của các tập tin dấu chấm là một lỗi trong phiên bản đầu của ls
lệnh . Tác giả có nghĩa là loại trừ .
và ..
ra khỏi danh sách nhưng vô tình loại trừ tất cả các tệp bắt đầu bằng .
. Do đó, các tập tin dấu chấm trở nên ẩn từ ls
. Shell theo sau bằng cách ẩn các tập tin dấu chấm như thế nào ls
. Tuy nhiên, cách thức này được thực hiện lại là một hack: các tệp bắt đầu .
chỉ bị loại trừ nếu dấu chấm không được khớp rõ ràng trong mẫu. Vì vậy, mô hình .*
bao gồm .
và ..
.
Để duy trì khả năng tương thích với các tập lệnh hiện có, các trình bao hiện đại vẫn bao gồm .
và ..
(ngoại trừ zsh, về vấn đề này giống như nhiều vấn đề khác có hành vi khử trùng nhưng không tương thích ngược). Tuy nhiên, nếu bạn đặt GLOBIGNORE
, bạn đang sử dụng một tính năng dành riêng cho bash, cho thấy rằng bạn không quan tâm đến khả năng tương thích ngược. Vì vậy, khớp mẫu thay đổi để loại trừ .
và ..
từ tất cả các mẫu khớp.
Cài đặt GLOBIGNORE=.
loại trừ một tệp được loại trừ tự động dù thế nào bất cứ khi nào GLOBIGNORE
được đặt, do đó, nó tương đương với shopt -s dotglob
ngoại trừ đó .
và ..
được loại trừ khỏi tất cả các mẫu.
GLOBIGNORE
chỉ bỏ qua.
và..
trong các mẫu không gạch chéo và GLOBIGNORE lọc các đường dẫn tệp không phải tên tệp.GLOBIGNORE=.; echo .*
sẽ không bao gồm.
cũng không..
, nhưngGLOBIGNORE=.; echo ./.*
(hoặcecho /bin/.*
) sẽ! Để bỏ qua.
và..
từ tất cả các khối, có vẻ như bạn cầnshopt -s extglob
vàGLOBIGNORE='?(*/)@(.|..)'
.