为什么在 Zsh 中删除名为 ^V^V 的文件时,它会删除所有可见文件?

问题描述 投票:0回答:2

我试图删除一个名为 ^V^V 的文件(通过在 Vim 中闲逛创建),但失败了,因为我不知道如何转义插入符号。因此,我复制并粘贴了它,并使用了垃圾桶命令(MacOS 的 cli 实用程序),它删除了所有可见文件。我注意到是因为 Alacritty 终端警告我配置文件消失了。

这是我输入的命令:

trash ^V^V

^V^V 表示脱字符号和大写 v,而不是 Ctrl V。

您可以在此处获取 Cli 实用程序(如果您使用 MacOS,建议使用): https://github.ink/sindresorhus/macos-trash

结果是当前目录下的所有文件都被发送到垃圾箱了。

macos shell command-line command-line-interface zsh
2个回答
1
投票

根据手册页

zshexpn
,在文件名生成的上下文中,如果设置了扩展通配符,则
^
具有特殊含义:

^x

(需要设置 EXTENDED_GLOB。)匹配除模式 x 之外的任何内容。它的优先级高于“/”,因此“^foo/bar”将搜索“.”中的目录。除了名为“bar”的文件的“./foo”之外。

假设您已经扩展了 glob 集,

^V^V
(即四字节序列,而不是转义码的两倍)扩展到不以大写“V”开头的所有内容。示例会话:

╓╴                                                                                               z[10:21]╶╖
╙╴~/scratch/zsh❯ ls                                                                         07:31 17:40 ╜
 B_file.txt   F_file.txt   V_file.txt
╓╴                                                                                               z[10:21]╶╖
╙╴~/scratch/zsh❯ ls ^V^V                                                                    07:31 17:40╜
 B_file.txt   F_file.txt

0
投票

首先要注意的是:Vim 是 Vim,不是 Vi。他们有很多共同点,但也有更多不同点。如果您绝对想从书本中学习,请选择 一本关于 Vim 的书,而不是 一本关于 Vi 的书

你的问题除了用错书之外,还在于你没有仔细阅读。

^V

 不是 
^
 字符后跟 
V
 字符,它是 
CTRL+V
 的字面表示。在给定的示例中,您被告知......

  1. 使用

    :

    输入命令行:

    :
    
    
  2. 插入

    map q :wq

    :map q :wq
    
    
  3. ^V

     (
    CTRL+V
    ) 两次(也许是 Vi 的事情,你只需要在 Vim 中执行一次),

  4. 按一次

    Carriage Return

     即可插入其文字值 (
    ^M
    ):

    :map q :wq^M
    
    
  5. 再按一次

    Carriage Return

    即可执行您刚刚键入的命令。

实际映射是:

map q :wq^M
其中 

^M

 是文字 
CTRL+M
 字符,而不是:

map q :wq^V^VCR CR
其中

^

^
V
V
,等等。难怪你的映射正在做各种疯狂的事情,因为它纯粹是胡言乱语。

至于为什么由损坏的映射创建的文件会出现这样的行为?如果你做类似的事情:

$ rm '^V^VCR CR'
或:

$ rm \^V\^VCR\ CR
然后文件按预期删除,但从你混乱的问题中不清楚你

实际上做了什么

一些建议:

    使用 Vim 书籍来学习如何使用 Vim。
  • 您的计算机已经配备了终端模拟器,请使用它。您对这一切还不够满意,无法完全理解安装替代方案的利弊。
  • 下次就使用内置的
  • ZZ
© www.soinside.com 2019 - 2024. All rights reserved.