在别名中转义引号

3
我希望写一个别名,以快速搜索当前目录中的文件名(不区分大小写)。
以下代码可行:
alias f='find . -iname $@'

问题在于,当我想在搜索表达式中使用通配符时,我需要将它们加上引号(否则zsh扩展会首先处理通配符):

> f podfi*
zsh: no matches found: podfi*
> f "podfi*"
./Podfile

我应该如何在我的别名中添加引号,以便f podfi*能够正常工作?

以下尝试都不起作用:

alias f='find . -iname "$@"'
alias f='find . -iname \"$@\"'

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - anubhava
1
为什么不直接将您的别名定义为 alias f='find . -iname,然后使用 f <something> 呢? - Renaud Pacalet
@RenaudPacalet 我想避免引用全局表达式的麻烦。正如anubhava所建议的那样,解决方案可能不存在(或者可能需要使用比别名更高级的zsh功能)。 - Sébastien
哦,我明白了,很抱歉我没有足够的注意力。我同意它不能工作:shell在将它们传递给命令之前扩展了glob。但是,您可以使用其他字符替换路径名扩展考虑的*?[。然后,一个bash函数而不是别名可以执行相反的替换并将结果传递给find... - Renaud Pacalet
@RenaudPacalet 这确实是一个不错的解决方法。 - Sébastien
我尝试了这个命令:alias f='GLOBIGNORE="*"; find . -iname',它似乎可以工作。但我不确定我完全理解为什么会这样。但它修改了GLOBIGNORE变量,这可能不是你想要的。无论如何,这里可能有一些值得探索的东西(bash选项和变量)。 - Renaud Pacalet
2个回答

2
这对于zsh来说怎么样呢:
% alias f='noglob find . -iname $@'
% f podfi*
./Podfile
% f "podfi*"
./Podfile
%

这是仅限于 zsh 的功能还是在 bash 中也存在?(我尝试了 GNU bash,版本为 4.3.30(1)-release,但出现了 bash: noglob: command not found 的错误提示)。 - Renaud Pacalet
好的,谢谢。缺点是它在zsh中似乎不是持久的。无论如何,我编辑了自己的答案,使用set +/- f代替不太优雅且可能不太好的GLOBIGNORE - Renaud Pacalet
唉,它并不像我预期的那样工作:我想在我的函数中放置的 set +f 具有局部作用域。 - Renaud Pacalet
说实话,我在我的bash(_GNU bash,版本4.3.11_)中没有遇到OP的问题。但是在zsh中我遇到了。我会再深入挖掘一下,看看是否与我的.bashrc有关。 - sokin
@Sebastien 谢谢您的评论。很高兴能帮到您。 - sokin

2
function ff () { find . -iname "$2"; GLOBIGNORE="$1"; }
alias f='s="$GLOBIGNORE"; GLOBIGNORE="*"; ff "$s"'

别名保存了当前的 GLOBIGNORE 值,将 GLOBIGNORE 设置为 *,并调用 ff 函数,并将保存的 GLOBIGNORE 作为第一个参数传递给它。 ff 函数使用未进行 glob 处理的别名参数调用 find 并恢复 GLOBIGNORE。在 GNU bash 版本 4.3.30(1)-release 中测试通过:

f *.tex
./full.tex
./hdr.tex
./main.tex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接