使用 zsh 替换本地的 /bin/bash ,有一段时间了,也感受到了它的便捷。但是在我使用scp命令拷贝远程主机数据的时候遇到使用通配符无法使用的问题,刚开始还以为是scp命令输入错误,检查后发现不是。

远程linux主机数据

[luo@linux.com ~]
$ ls
Desktop  Documents  Downloads  dump.rdb  Music  Pictures  Public  redis-connect.php  Templates  Videos

需求: 将服务器 luo 用户根目录下的 dump.rdb 拷贝到本地。

执行 scp 命令

☁  ~  scp luo@192.168.207.134:~/*.rdb .
zsh: no matches found: luo@192.168.207.134:~/*.rdb

☁  ~  scp luo@192.168.207.134:~/dump.rdb .
dump.rdb              100%   94     0.1KB/s   00:00

解决方案

  • 使用引号包裹参数
☁  ~  scp "luo@192.168.207.134:~/*.rdb" .
dump.rdb              100%   94     0.1KB/s   00:00

shell 不会按照远程地址上的文件去扩展参数,当你使用 ip:/path/to/*.rdb ,因为本地当前目录中,十不存在 ip:/path/to/*.rdb,所以匹配失败。默认情况下,bash 在匹配失败时就使用原来的内容,zsh 则报告一个错误。在 zsh 中执行 setopt nonomatch 则告诉它不要报告 no matches 的错误,而是当匹配失败时直接使用原来的内容。

实际上,不管是 bash 还是 zsh,不管设置了什么选项,只要把 "ip:/path/to/*.rdb" 加上引号,就可解决问题。

  • 在 zsh 这个 bash 下执行 scp 命令之前,使用 setopt nonomatch
☁  ~  setopt nonomatch
☁  ~  scp luo@192.168.207.134:~/*.rdb .
dump.rdb              100%   94     0.1KB/s   00:00

最后编辑: 于 1年前

评论列表(0)

    暂无评论