首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么zsh不喜欢像*17*这样的文件目录?

为什么zsh不喜欢像*17*这样的文件目录?
EN

Unix & Linux用户
提问于 2019-07-15 13:06:42
回答 1查看 582关注 0票数 3

我是一个相对较新的zsh用户,并且99%的时间喜欢它。当我试图复制一堆文件时(如:

代码语言:javascript
复制
[I] ➜ ls *17*
core.txt.17   info.17       vmcore.17.zst

但当我scp *17* xxx:xxx/xxx时,我得到:

代码语言:javascript
复制
[I] ➜ scp *17* freefall.freebsd.org:
*17*: No such file or directory

ler in /var/crash  at borg
[I] ➜

为什么?

如果我运行type scp,我会得到:

代码语言:javascript
复制
scp is an alias for noglob scp
scp is /usr/bin/scp
EN

回答 1

Unix & Linux用户

发布于 2019-07-23 23:30:03

正如您已经发现的,zsh有一种方法可以禁用某些命令上的通配符扩展。如果将noglob放在命令前面,则zsh不会对命令的文字进行通配符扩展。由于键入noglob与在参数中引用通配符一样费劲,所以最常见的用法是通过将命令名作为带有noglob前缀的同一个命令名的别名,从而自动导致某些命令“noglobbed”。例如,之后

代码语言:javascript
复制
alias scp='noglob scp'

您不会在scp命令行上获得任何通配符扩展,但除此之外,scp命令将正常运行。

您可以绕过别名

代码语言:javascript
复制
\scp *17* freefall.freebsd.org: 

代码语言:javascript
复制
=scp *17* freefall.freebsd.org: 

\scp绕过别名,以该名称查找函数、内置命令或外部命令。=scp只查找外部命令。

防止scp参数的通配符扩展使您可以在没有引号的情况下编写scp remote:*17*,但是它具有不允许您编写scp *17* remote:的主要缺点。如果scp的参数看起来不像远程文件名,那么就有可能进一步扩展它们的通配符。这里有一个函数,它分析scp的参数,并且只在不像选项或远程文件名的参数中展开通配符。

代码语言:javascript
复制
function glob_non_remote {
  local a x
  a=($1); shift
  for x; do
    # Do wildcard expansion manually, but only for arguments that don't look
    # like options or remote file names.
    case $x in
      (*:*|-*|) a+=("$x");;
      *) a+=($~x);;
    esac
  done
  "${(@)a}"
}
alias scp='noglob glob_non_remote scp'
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/530245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档