Appearance
前言
开发中常用到各种通配符,目前通配符规范较多,有linux通配符,也有nodejs通配符。简单记录一下区别和各自的使用场景,
linux通配符
- * 匹配零个或者多个字符,但是不匹配"."开头的文件, 也不会匹配/之外的内容(限制在单个路径)
- ? 匹配任何单个字符
- ~yang 用户杨根目录
- [0-9] 匹配0-9 一次
- [!0-9] 不匹配0-9一次
linux是先匹配再执行。比如touch *.txt。先匹配发现没有则不执行。
touch {1..9}.txt 先解开大括号创建1到9的txt
后来bash又在这个基础上扩展了几个语法
- ** 跨目录匹配,也是先按照目录展开模式再匹配 ls /.* 和 ls **/. 有区别
- {a,b,c} 重复执行匹配模式,先展开大括号再执行*等匹配
- {a..c} 重复执行a到c之间的匹配模式
- ?(parttern-list) 匹配一次括号里面的模式
- *(parttern-list) 匹配0次或者多次
- +(parttern-list) 匹配一次或者多次
- @(parttern-list) 匹配一次
- !(parttern-list) 不匹配
回到开头node中大部分都使用的是扩展后的语法,而且是自行实现,不和平台挂钩。但是我们在命令行中执行命令时根据使用shell的版本,有可能没有实现一些扩展语法
比如在rimraf中删除东西 rimraf **/node_modules 有可能就不会删除,因为没有实现** 语法。
还有一个坑是npm中执行脚本,npm执行脚本不一定会在当前的shell执行,有可能会在其他的shell。就会出现glob语法和在命令行执行不一致的情况,比如上面的rimraf。 大部分工具目前都是用的自定义的glob,通过将glob用引号包裹起来可以避免shell的glob模式
