Đây có thể là đáng nhắc đến rằng unixy / vỏ posixy như vỏ bourne, bash, ksh, zsh, vv làm mở rộng ký tự đại diện (ký tự glob thích *
, ?
, [range]
, [!range]
và mở rộng khác như niềng răng và những đống mở rộng) để biên dịch một danh sách các đối số trước khi lệnh được thực thi. Vì vậy, việc mở rộng này được thực hiện bởi shell chứ không phải lệnh mà chúng có thể là đối số.
tức là cái vỏ chịu trách nhiệm cho cái gì *
, *.*
mở rộng ra
$ ls
file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *) # is actually expanded to the following
+ foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *.*) # note this does not match `zz-file-without-extension`
+ foo file.csv file.doc file.pdf file.txt file.xlsx
Đây không phải là trường hợp trong CMD (và tương tự đối với các tiện ích powershell ) vì nó chuyển các ký tự toàn cầu nguyên văn sang lệnh được thực thi - và vì vậy việc mở rộng là trách nhiệm của lệnh / tiện ích chứ không phải shell. Vì vậy, cuối cùng, những gì *.*
hoặc *
phương tiện còn lại cho tiện ích khiến nó tuân thủ (hoặc không) theo các quy ước - đó là lý do tại sao các tiện ích của CMD dir *.*
cũng khớp với các tệp (được cho là không chính xác nhưng vẫn bảo tồn các tệp mà không có phần mở rộng.
Tôi tin rằng nó an toàn để tóm tắt theo cách này.
- Theo CMD nó phụ thuộc vào tiện ích.
- Trong PowerShell, các tiện ích sử dụng Lớp WildCardPotype sẽ cung cấp một tập hợp con nhất quán các hành vi tích cực.
*
và*.*
hiện tại tương đương vớicmd
các lệnh nội bộ và các tiện ích dòng lệnh hiện đại, một số tiện ích cũ có tham số mặt nạ tệp có thể sử dụng các chức năng khớp tệp cũ hơn và đối với chúng, mặt nạ sẽ không tương đương.