Fish Shell中模拟传统Glob通配符的实现方案问询
Fish Shell 4.0.0 兼容传统Bash Glob的解决方案
问题原因
Fish 4.0.0 默认启用了新的 glob2 语法,它遵循POSIX标准,但和Bash的传统Glob行为存在差异:
- 原Bash中的字符范围
[0-9]在glob2中需要改用{0..9} - 原
?通配符(匹配单个任意字符)在glob2中被改为??,单个?仅匹配字面量
快速解决方案
1. 临时切换回旧Glob模式
在需要使用传统Glob的命令前,临时设置fish_features变量:
set -l fish_features glob; ls tmp[0-9][0-9].pdf
这个设置只对当前命令行会话生效,重启Fish后会恢复默认。
2. 永久启用旧Glob模式
编辑Fish的配置文件~/.config/fish/config.fish,添加以下内容:
set fish_features glob
保存后重启Fish,所有会话都会使用传统Bash风格的Glob语法。
3. 用find替代(无需修改全局配置)
find命令的-name参数原生支持Bash风格的Glob匹配,直接用它实现路径匹配:
# 匹配当前目录下的目标文件 find . -maxdepth 1 -type f -name "tmp[0-9][0-9].pdf" # 递归匹配所有子目录中的目标文件 find . -type f -name "tmp[0-9][0-9].pdf"
4. 自定义封装函数
如果需要更灵活的调用,可编写一个bashglob函数来封装匹配逻辑:
function bashglob if test (count $argv) -eq 0 echo "Usage: bashglob <glob-pattern>" return 1 end set -l pattern $argv[1] # 用find的-name参数直接处理Bash风格Glob find . -type f -name "$pattern" end
用法示例:
# 匹配当前目录及子目录的tmpXX.pdf文件 bashglob "tmp[0-9][0-9].pdf" # 匹配单个字符的文件,比如fileX.txt bashglob "file?.txt"
内容的提问来源于stack exchange,提问作者Ryo
相关产品推荐
相关产品推荐

