`. []. Foo []` làm gì trong bash? Tại sao nó phù hợp với `..`?


16

Nhìn vào những điều sau đây:

$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]

Rõ ràng điều này dường như đang lan tỏa một cái gì đó, nhưng tôi không hiểu kết quả đến với nhau như thế nào. Theo hiểu biết của tôi []là một lớp nhân vật trống rỗng. Nó sẽ trực quan nếu

  • nó chỉ khớp với chuỗi rỗng; trong trường hợp này, tôi mong muốn bash sẽ sao chép toàn bộ vì không có gì khớp với nó trong thư mục này, nhưng cũng khớp với những thứ như ..aliases(trong ví dụ đầu tiên),
  • hoặc không có gì cả; trong trường hợp này, tôi cũng mong muốn bash tái tạo chuỗi tổng thể.

Đây là với GNU bash, phiên bản 4.4.23 (1).

Câu trả lời:


25

Việc [bắt đầu một bộ. Một bộ được chấm dứt bởi ]. Nhưng có một cách để có ]một phần của tập hợp, và đó là chỉ định ]ký tự đầu tiên. Vì một tập hợp trống không có ý nghĩa gì, điều này không mơ hồ.

Vì vậy, các ví dụ của bạn về cơ bản là tất cả một dấu chấm theo sau là một tập hợp có chứa một dấu chấm, do đó nó khớp với hai dấu chấm.

Các ví dụ sau không tìm thấy bất kỳ tệp nào và do đó được trả lại nguyên văn.


4

Chỉ các chuỗi được trích dẫn không phải là đối tượng toàn cầu:

$ echo ".[].aliases[]"
.[].aliases[]

Nhưng các chuỗi không được trích dẫn có thể được bao quanh. Một chuỗi không được trích dẫn có chứa một *hoặc một ?(hợp lệ) [](biểu thức ngoặc) sẽ được sửa đổi bởi danh sách các tệp khớp với nó. Theo cách tương tự như một *ý chí sẽ chuyển đổi thành tất cả các tệp trong thư mục phù hợp và ?sẽ khớp các tệp chỉ có một ký tự, một (hợp lệ) []sẽ khớp các tệp với các ký tự bên trong ngoặc. Dấu chấm là ký tự hợp lệ:

$ echo a[.]b
a[.]b

$ touch "a.b"
$ echo a[.]b
a.b

Để có thể khớp với ]nó, nó phải là ký tự đầu tiên bên trong ngoặc:

$ touch "a]b"
$ ls a[]]b
a]b

Một biểu thức ngoặc rỗng không có nghĩa (và không được mở rộng):

$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory

Đó là lý do tại sao điều này hoạt động:

$ touch a]c abc afc azc a:c a?c aoc 
$ ls a[]bfz:?]c
abc  a:c  a?c  a]c  afc  azc

Đối với [ý tưởng là tương tự:

$ touch a[c
$ ls a[[]c
a[c

nhưng nó có thể ở bất kỳ vị trí nào trong biểu thức ngoặc:

$ ls a[]bf[z:?]c
abc  a:c  a?c  a[c  a]c  afc  azc

$ ls a[]bfz:?[]c
abc  a:c  a?c  a[c  a]c  afc  azc

Chuỗi bạn đã đăng .[].foo[]sẽ khớp với một dấu chấm theo sau là a ], a ., a f, a ohoặc a [. Nó tương tự như:

$ echo a[].foo[]c
a[c a]c afc aoc

Và nó sẽ khớp như sau:

$ touch .] .f .o .[ .a .b .z

$ echo .[].foo[]
.. .[ .] .f .o

Lưu ý rằng mục nhập thư mục ..không cần phải được tạo vì nó tồn tại bên trong mọi thư mục theo mặc định. Nhưng một dấu chấm đơn giản .sẽ không được khớp bởi một quả cầu vì nó cần phải được khớp một cách rõ ràng (bằng cách thực sự sử dụng một dấu chấm).

Nhưng điều đó sẽ không khớp ..aliasesvì biểu thức ngoặc sẽ chỉ khớp với một ký tự. Để khớp một vài ký tự, bạn cần sử dụng *(bất cứ thứ gì):

$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a

$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l
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.