如何使用通配符通过制表符完成在 PATH 中查找命令/文件?

如何使用通配符通过制表符完成在 PATH 中查找命令/文件?

经过几年的“BASHing”,我编写了几个自定义脚本。其中大多数我不会每天使用,因此很容易忘记我如何命名它们,尽管我尽可能保持一致。

所以我知道,如果我打算运行我的FLAC2MP3.bat,我只需写FLA+ TABTAB,然后我就有了 Bash 可以在我的 $PATH 中找到的内容的列表:

FLAC2MP3.bat FLAC2MP3.bat~ FlashPlayerApp.exe FlashPlayerCPLApp.cpl

是否可以进行相同类型的搜索,但编写*MP3*(或类似的内容)来搜索与我的 PATH 上的模式匹配的任何文件?当我写下这个并按下TAB(一次或两次)时,基本上什么也没有发生。

我已经尝试过的:

  • 虽然它与我的问题不同,但我已经尝试过“如何让 bash 自动完成通配符?“。它们似乎只与当前目录内容的完成有关,这根本不是我的情况。
  • 这个答案对于一个几乎类似的问题(但不涉及通配符)似乎是一个好主意:使用findon $PATH。虽然它不像 press 那样实用TAB,但它可能是一个解决方案。然而,我几乎发疯了,变量扩展没有成功,因为我的 PATH(与大多数 Cygwin PATH 一样)在某些目录中包含空格,并且扩展在找到它们时会插入单引号 ( find \'${PATH/:/\' \'}\' -maxdepth 1 -iname mp3 -print -quit)。事实上,我为了完成这项工作花费了太多时间,以至于它几乎可以成为一个单独的问题。

答案1

切换到 桀骜。确保您.zshrc包含该行

setopt glob_complete

享受。

答案2

ls `echo $PATH | sed s@ @\\ @g | sed s@:@ @g` | grep [string]

在这两方面都完成您所需要的?sed s@ @\\ @g应该$PATH用可读的转义空格替换其中包含空格的条目,并且应该用普通空格sed s@:@ @g替换分隔条目的冒号,这样可以单独列出每个目录的内容,可以将其传递到其中,以识别正则表达式搜索,例如您想要的通配符使用。据我所知,这在本机 Bash 中有效,但我不确定它是否在 Cygwin 的 Bash 中有效。$PATHlsgrep

如果它确实有效,您可以随时为其添加别名,这样使用起来就不那么麻烦了。

答案3

我没有回答你的主要问题,但我对你的第二个“我已经尝试过的”项目感到好奇,到目前为止,我能做的最好的事情是使用单个命令(没有子shell)来实现它:

IFS=: find_path=(${PATH}) && find "${find_path[@]}" <your_find_params>

这很丑陋,并证明单命令/无子 shell 可能不值得付出努力。根据下面斯蒂芬的评论,你可以做类似的事情

(IFS=:; set -f; find $PATH <your_find_params>)

编辑:当然,这不能处理路径组件中嵌入换行符的情况,但谁在乎呢……我们生活在现实世界中。 :)

相关内容