如何为命令的某些扩展名的目录和文件指定 bash 自动补全?

如何为命令的某些扩展名的目录和文件指定 bash 自动补全?

我有一个命令play接受带扩展名的文件mp4mkv作为参数。

我已经创建了一个play_completion.sh文件/etc/bash_completion.d/

我想要命令play自动完成目录和扩展名的文件名mp4mkv仅。我在这个问题上寻求帮助,但没有成功,并且 bash 自动完成的文档非常多。

到目前为止我有这个..

complete -f -X '!*.@(mp4|mkv)' play

但在我用它获取它之后,source /etc/bash_completion.d/play_completion.sh它只会自动完成所需扩展名的文件名,而不是目录。

答案1

只需添加-o plusdirs也对命令进行自动完成操作,以便自动完成将尝试将目录名称添加到先前的结果中(忽略模式匹配)

complete -f -o plusdirs -X '!*.@(mp4|mkv)' play
  • !否定完成,这意味着自动竞争将忽略除我们指定的匹配模式之外的完成结果*.@(mp4|mkv)

  • @告诉自动完成仅匹配至少一种给定模式;这@(pattern-list)被称为 Bash 的扩展全局变量。我们*.+(pattern-list)也可以在这里使用 glob 。

要强制完成命令的文件和目录名称play,并且仅针对给定模式进行扩展,请执行以下操作:

complete -d -X '!*@(mp4|mkv)' -f -X '!*.@(mp4|mkv)' play

下面也应该有效:

complete -d -f -X '!*.@(mp4|mkv)' play

相关内容