早在 1990 年代,我会使用“ *.*”来表示 MS-DOS 中的任何文件名,但*这些天我看到更多的脚本只使用“ ”。它实际上对我使用哪一种有任何影响吗?
use*_*686 65
自从 Windows 95 和 NT 3.5 引入“长文件名”支持以来,文件名和扩展名一直是一个字段,并且通配符匹配是针对整个文件名一次性完成的。因此,您可以拥有一个没有点的文件名(对于文件来说可能很少见,但对于文件夹/目录来说很常见),乍一看*.*实际上与此类文件不匹配。
使用旧脚本*.* 会因为兼容性的代码仍然工作-如果用通配符结束.*,这部分是由操作系统忽略。(因此,如果您想将文件与扩展名专门匹配,我想您需要这样做*.?*。)
但这不是你应该依赖的东西;如果您正在为现代 Windows 版本编写脚本,请遵循它们的约定,而不是MS-DOS 约定。(请注意,从 Windows NT 开始,.bat 脚本不再由 MS-DOS 解释,而是由cmd.exe本机 Win32 程序解释。)
在 Linux 和其他各种 Unixen 上,名称和扩展名从一开始就从未分开,并且没有任何特殊的魔法可以*.*工作,因此*是唯一有意义的选择。
小智 11
这也许值得一提的是,unixy /喜欢的Bourne shell时,bash和ksh,zsh的等posixy贝壳做通配符扩展(全域字符,例如*,?,[range],[!range]和其他扩展像括号和扩展水珠)编译的参数列表前的命令被执行。所以这个扩展是由 shell 完成的,而不是这些可能是其参数的命令。
即外壳负责什么*,*.*扩展到
$ 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
Run Code Online (Sandbox Code Playgroud)
这不是 CMD 的情况(对于 powershell 实用程序也是如此),因为它将全局字符逐字传递给执行的命令 - 因此扩展是命令/实用程序的责任,而不是 shell。所以最终,什么*.*或*意味着什么留给实用程序让它符合(或不符合)约定——这就是为什么 CMD 的实用程序dir *.*也匹配(可以说是不正确但保留期望)没有扩展名的文件。
我相信这样总结是安全的。
| 归档时间: |
|
| 查看次数: |
4951 次 |
| 最近记录: |