不同目录的 Bash 自动完成

23t*_*tux 7 linux script bash autocomplete macos

我已经玩了一段时间的 bash 自动完成功能,但找不到解决我的问题的方法。我有一个包含如下子文件夹的项目目录:

  • 项目/红宝石/项目1
  • 项目/红宝石/项目2
  • 项目/轨道/项目3
  • 项目/html/project4

现在,我想有一个命令,把它cdproject在那里我可以cd在我的项目目录及子目录内的任何子文件夹。这个命令应该提供一个自动完成功能,我可以在其中输入cdproject pr --> TAB TAB,然后获取一个列表,例如ruby/project1, ruby/project2, rails/project3...

我的问题是如何处理子目录。程序cdproject看起来像这样

#!/bin/bash
cd $1
Run Code Online (Sandbox Code Playgroud)

cdproject-autocompletion.bash这个样子的

_cdproject()
{
  local cur prev opts
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"
  opts=$(ls ~/Dropbox/projects)
  COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  return 0
}
complete -o default -o nospace -F _o  o
Run Code Online (Sandbox Code Playgroud)

而我的里面.bash_profile,我的来源cdproject-autocompletion.bash

source ~/cdproject-autocompletion.bash

所以任何人的想法,如何实现这一目标?也许opts应该返回 subdir 结构,ruby/project1但是自动完成应该只对最后一部分起作用,即实际的项目名称。我不知道这怎么可能。

She*_*ord 5

深入阅读问题,您正在寻找更流畅的方法来从命令行导航文件树。

选项 1:使用 CDPATH

例如, CDPATH=".:~:~/projects/ruby:~/projects/rail:~/projects/html"

注意:有些人发现包含..CDPATH.

不幸的是CDPATH,并不(总是)支持自动完成。有一些方法可以扩展 bash 来做到这一点。谷歌使用术语“CDPATH”和“自动完成”。

诚然,这有点笨拙。如果您使用一小组父目录,这还不错。

您可能有更好的成功dirspushdpopd。这些需要一些时间来掌握。请注意,pushdandpopd可以采用数字参数。

另外:
cd -返回上一个目录。重复该命令可在两个最近的目录之间切换。
____________
许多文档(包括手册页)将. (点;即当前目录)显示为CDPATH. 然而,至少一些炮弹似乎表现得好像CDPATH有目的:.,所以,如果你说cd foo,你会得到./foo,除非你列出的其他一些父目录CDPATH包含foo。天啊。

编者注:Cygwin 似乎支持CDPATH开箱即用的自动完成功能(运行 bash 版本“4.1.17(9)-release”)。