GLOBIGNORE hoạt động như thế nào?


15

Theo trang hướng dẫn của bash:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

Tuy nhiên trong thực tế ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

Tại sao ..bị xóa khỏi danh sách các trận đấu? Theo tôi biết, mô hình .KHÔNG phù hợp .., phải không?

Câu trả lời:


14

Cuộn xuống ...

Tên tệp ...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 ...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 lslệnh . Tác giả có nghĩa là loại trừ ...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 ....

Để 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 ...(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ừ ...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 dotglobngoại trừ đó ...được loại trừ khỏi tất cả các mẫu.


1
Trên thực tế, tôi chỉ nhận ra cài đặt GLOBIGNOREchỉ bỏ qua ...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ưng GLOBIGNORE=.; echo ./.*(hoặc echo /bin/.*) sẽ! Để bỏ qua ...từ tất cả các khối, có vẻ như bạn cần shopt -s extglobGLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas

1
Trên thực tế, không, GLOBIGNORE='?(*/)@(.|..)'sẽ không loại trừ ...trong .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'sẽ phá vỡ sự ảm đạm như ./*...
Stéphane Chazelas

3

Từ phần có tên "Mở rộng tên đường dẫn" trong man bash:

Tên tệp ''. '' Và '' .. '' luôn bị bỏ qua khi GLOBIGNORE được đặt và không null.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.