Это, вероятно , стоит упомянуть о том , что unixy / posixy оболочка , таких как оболочки Борна, Баш, KSH, Zsh, и т.д. сделать подстановочное расширение (из GLOB символов нравятся *
, ?
, [range]
, [!range]
и другие расширения , как скобки и расширенные комки) составить список аргументов , прежде чем команда выполнен. Таким образом, это расширение выполняется оболочкой, а не командой, аргументами которой они могут быть.
т.е. за что отвечает оболочка *
, *.*
расширяется до
$ 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
Это не относится к CMD (и аналогично для утилит powershell ), так как он дословно передает символы глобуса в исполняемую команду - и поэтому расширение является обязанностью команды / утилиты, а не оболочки. Таким образом, в конечном счете, то, что *.*
или что *
означает, остается за утилитой, оставляя ее для соответствия (или нет) соглашениям - вот почему утилиты CMD, например, dir *.*
также сопоставляют (возможно, неправильно, но сохраняют ожидания) файлы без расширений.
Я считаю, что это можно обобщить таким образом.
- Под CMD это зависит от утилиты.
- В PowerShell утилиты, использующие класс WildCardPattern , обеспечат согласованное подмножество поведения posixy.
*
и*.*
теперь они эквивалентны дляcmd
внутренних команд и современных утилит командной строки, некоторые старые утилиты, которые принимают параметры маски файла, могут использовать более старые функции сопоставления файлов, и для них маски не будут эквивалентны.