鱼壳中的全局匹配(通配符)与bash行为不匹配

Ala*_* C. 4 bash glob fish

当我在bash中执行以下命令时,我得到一个与我想要的正则表达式匹配的文件列表:

$> ls *-[0-9].jtl
benchmark-1422478133-1.jtl  benchmark-1422502883-4.jtl  benchmark-1422915207-2.jtl
Run Code Online (Sandbox Code Playgroud)

但是,当我在fish shell中运行相同的命令时,我会得到不同的结果:

$> ls *-[0-9].jtl
fish: No matches for wildcard '*-[0-9].jtl'.
ls *-[0-9].jtl
   ^
Run Code Online (Sandbox Code Playgroud)

怎么会?

Cha*_*ffy 7

Fish的文档并未声称支持POSIX glob模式的全部功能.

引用文档:

通配符

如果参数中存在星号(*)或问号(?),则fish会尝试将给定参数与任何文件匹配,方式如下:

  • ?可以匹配任何单个字符除外/.
  • *可以匹配任何不包含的字符串/.这包括匹配空字符串.
  • **匹配任何字符串.这包括匹配空字符串.字符串可以包括/字符但不需要.

值得注意的是,没有提到角色类,因为鱼不支持它们.

如果要保证globs支持所有POSIX(fnmatch)功能,请使用POSIX兼容或POSIX-superset shell.


kyb*_*kyb 6

你还可以使用更多的unix扩展工具find。它非常强大。

示例:使用正则表达式

find . -path '.*-[0-9].jtl' -not -path '.*-32.jtl'
Run Code Online (Sandbox Code Playgroud)


小智 6

Fish 只需要引号"*.conf"即可执行与 bash 相同的操作*.conf