zsh:禁用某些命令或模式的通配符?

Roc*_*uts 1 command-line zsh terminal wildcards

在 zsh 中,当使用通配符?*如下所示时,通配符就会启动:

ls file?.txt
Run Code Online (Sandbox Code Playgroud)

不过,我想在这样的情况下禁用通配符:

youtube-dl https://www.youtube.com/watch?v=QIysdjpiLcA
Run Code Online (Sandbox Code Playgroud)

我可以通过将参数放在单引号或双引号('")中来解决这个问题。

在 URL 等模式中使用时,我可以以某种方式配置 zsh 来忽略通配符(即不进行任何通配符)吗?或者对于某些命令/可执行文件?

Gil*_*il' 5

如果放在noglob命令前面,则不会进行通配。

noglob youtube-dl https://www.youtube.com/watch?v=QIysdjpiLcA
Run Code Online (Sandbox Code Playgroud)

要禁用特定命令的通配符,请将其设置为别名。

alias youtube-dl='noglob youtube-dl'
Run Code Online (Sandbox Code Playgroud)

对于 URL,这有助于?,但对 则没有帮助&。没有办法禁用对&except 引用的解释。

如果剪贴板中有 URL,则可以使用命令调用剪贴板内容,而不是粘贴它:

youtube-dl "`xsel`"         # X11 automatic mouse selection
youtube-dl "`xclip -o`"     # X11 automatic mouse selection
youtube-dl "`xsel -b`"      # X11 explicitly copied clipboard
youtube-dl "`xclip -o -sc`" # X11 explicitly copied clipboard
youtube-dl "`pbpaste`"      # macOS clipboard
Run Code Online (Sandbox Code Playgroud)

您的 shell 历史记录中将包含粘贴命令,而不是 URL。如果在Tab命令结束之前按命令行末尾的 ,则命令替换将扩展为 URL。(所需的键可能会有所不同,具体取决于您的完成设置;另请参阅如何在 Zsh 中的命令行中展开所有变量?Shell that tab-completes prefixs?。)

或者,如果您的终端支持括号粘贴(现代的终端也支持),请在粘贴之前按Ctrl+ U(或任何其他设置数字参数的内容)。URL(或您粘贴的任何内容)将用引号括起来。请注意,这包括浏览器会忽略的前导和尾随空格。