如何在zsh中无需转义#符号传递包含#的字符串?
如何在zsh中无需转义#符号传递包含#的字符串?
嘿,我刚好也踩过这个zsh的坑!你遇到的问题是因为zsh默认的文件名扩展(也就是glob匹配)会把带#的参数当成要查找的文件名模式,当当前目录里没有匹配nixpkgs#hello的文件时,就会抛出那个「no matches found」的错误。要不用引号也能直接执行nix profile install nixpkgs#hello,这里有几个实用的解决办法:
临时单条命令解决:在命令前面加
noglob前缀,它会临时禁用这条命令的glob扩展,这样zsh就不会去匹配文件名了:noglob nix profile install nixpkgs#hello这个方法适合偶尔用一次的场景,不用改任何配置。
永久适配nix命令:如果你经常用nix,直接给它加个带
noglob的别名更方便。编辑你的~/.zshrc配置文件,添加一行:alias nix='noglob nix'保存后,要么重启终端,要么执行
source ~/.zshrc让配置生效。之后再输入nix profile install nixpkgs#hello就完全没问题了,zsh会自动跳过对nix命令参数的glob匹配。全局修改(不推荐):也可以通过修改
GLOBIGNORE变量让zsh忽略带#的模式,但这会影响所有命令的glob行为,很容易引发其他意外问题,所以除非你明确知道自己在做什么,否则不建议用这个方案。
简单补充下原因:zsh和bash的glob规则有差异——bash默认不会把#当作glob匹配的一部分,所以很多教程里的命令在bash里直接能用,但zsh的默认规则更严格,就需要额外处理啦。
备注:内容来源于stack exchange,提问作者Niing
相关产品推荐
相关产品推荐

