Là hành vi của. * Để bao gồm. và .. được định nghĩa trong LSB hoặc POSIX hoặc một số đặc điểm kỹ thuật khác?


8

Là hành vi .*bao gồm ...được định nghĩa trong LSB hoặc POSIX hoặc một số đặc điểm kỹ thuật khác?

Câu trả lời:


10

Trích dẫn từ phiên bản đặc tả kỹ thuật Unix đơn 2, khối lượng Lệnh và tiện ích ", §2.13.3 :

Nếu tên tệp bắt đầu bằng dấu chấm ( .) thì khoảng thời gian phải được khớp rõ ràng bằng cách sử dụng dấu chấm làm ký tự đầu tiên của mẫu hoặc ngay sau ký tự gạch chéo. (Vách) Không xác định được liệu một khoảng thời gian rõ ràng trong danh sách khớp biểu thức khung, chẳng hạn như [.abc]có thể khớp với giai đoạn hàng đầu trong tên tệp hay không.

Không có ngoại lệ nào làm cho giai đoạn thứ hai ..hoặc chuỗi trống theo sau khoảng thời gian duy nhất ., không khớp với ký tự đại diện trong .*. Do đó, tiêu chuẩn nói rằng .*phù hợp ... , mặc dù nó có thể.

Đoạn văn trên mô tả hành vi của shell ( shlệnh). Phần trên globhàm thư viện C tham chiếu đoạn này.

Ngôn ngữ hoàn toàn giống nhau trong phiên bản 3 , còn được gọi là POSIX: 2001 và IEEE 1003.1-2001, đây là điều mà hầu hết các hệ thống hiện tại thực hiện.

Dash, bash và ksh93 tuân thủ POSIX. Pdksh và zsh (thậm chí dưới emulate sh) không.

Trong ksh, bạn có thể .*bỏ qua ...bằng cách cài đặt FIGNORE='.?(.)', nhưng điều này có tác dụng phụ là tạo *các tệp dấu chấm. Hoặc bạn có thể đặt FIGNORE='.*', nhưng sau đó .*không khớp với bất cứ thứ gì.

Trong bash, bạn có thể .*bỏ qua ...bằng cách cài đặt GLOBIGNORE='.:..', nhưng điều này có tác dụng phụ là tạo *các tệp dấu chấm. Hoặc bạn có thể đặt GLOBIGNORE='.*', nhưng sau đó .*không khớp với bất cứ thứ gì.


lưu ý: bashkhông phải lúc nào cũng tuân thủ POSIX. chỉ khi nó được gọi là sh.
strugee

4

Có lẽ bạn có nghĩa là các chức năng trong bash mở rộng về globalignore. Theo mặc định, bash mở rộng phù hợp. và .. nhưng đọc người đàn ông:

The  GLOBIGNORE shell variable may be used to restrict the set of file names matching
   a pattern.  If GLOBIGNORE is set, each matching file name that also  matches  one  of
   the patterns in GLOBIGNORE is removed from the list of matches.  The file names ``.''
   and ``..''  are always ignored when GLOBIGNORE is set and not null.  However, setting
   GLOBIGNORE  to  a non-null value has the effect of enabling the dotglob shell option,
   so all other file names beginning with a ``.''  will match.  To get the old  behavior
   of  ignoring  file  names beginning with a ``.'', make ``.*''  one of the patterns in
   GLOBIGNORE.  The dotglob option is disabled when GLOBIGNORE is unset.

Bạn có thể đặt biến GLOBIGNORE=.:..để khi bạn thực hiện một cái gì đó như thế này:

rm -r * .*

bạn chỉ xóa thư mục hiện tại. Tiêu chuẩn POSIX chỉ xác định điều đó. là thư mục hiện tại và .. trong thư mục mẹ của thư mục hiện tại. Ý nghĩa đặc biệt của. * Được diễn giải bằng bash hoặc các shell khác (hoặc các chương trình như grep).



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.