zsh在glob失败中存活

bry*_*unt 4 error-handling zsh glob gitignore

我检查了一个项目,该项目包含一个.gitignore文件.

这个文件的内容是这样的

vx1% head .gitignore 
./deps
/*.exe
/*.la
/.auto
.libs
ChangeLog
Makefile
Makefile.in
aclocal.m4
autom4te.cache
Run Code Online (Sandbox Code Playgroud)

我想要

  • 逐行读取文件
  • 对于每行读取,列出要忽略的实际文件
  • 最后我想调整脚本来删除那些文件

想要这样做的原因是我不相信项目Makefile来完全清理它生成的文件.

笔记

如您所见,.gitignore在运行命令之前使用了一些我需要修改的glob,否则glob将解析为我的根目录.

我所知道的

动态评估任意字符串作为glob模式

DYN = "*C"

打印$ ~DYN

剥离前导/,如果存在

DYN = "/*.C"

打印$ {~DYN /#//}

我得到了什么

cat .gitignore | 读我的时候; 回声$ i; print $ {~i /#//}; DONE

问题

这个循环遇到的第一个glob失败,它以错误终止

zsh: no matches found: *.exe

我想要的是

'脚本'应该继续遍历文件的每一行,依次尝试每一行.

我自己回答,回答如下

bry*_*unt 11

zsh邮件列表中找到了答案,采用典型的Zsh方式 - 当你知道如何以及其他方式时,它非常简单.

print *.nosuchextension(N)
Run Code Online (Sandbox Code Playgroud)

(N)glob参数可防止在匹配失败时引发错误.

  • 只是评论说“谢谢!” 还有一点。您发布的 ZSH 邮件列表的链接提供了一个解释“(N)”的参考链接。这意味着**为当前模式设置 NULL_GLOB 选项**。想指出这在某些情况下会产生负面影响,例如,`gawk -f script *.csv(N)` 会导致脚本无限期地等待交互式输入。 (3认同)