Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用文件路径自动完成bash命令行? 上下文_Linux_Bash_Autocomplete - Fatal编程技术网

Linux 如何使用文件路径自动完成bash命令行? 上下文

Linux 如何使用文件路径自动完成bash命令行? 上下文,linux,bash,autocomplete,Linux,Bash,Autocomplete,我正在创建一个shell程序,它是一个命令行工具。我想为这个工具创建我自己的自动完成 我想做两件不同的事情(也许我应该发布两个问题): 对于选项--install和-i,我希望在文件路径上自动完成,就像ls命令那样 对于选项--unittest和-t,我想自动完成一个特定目录中的文件路径,我可以运行我的应用程序--directory 我的应用程序自动完成文件 __my_app_autocomplete() { local cur prev opts COMPREPLY=()

我正在创建一个shell程序,它是一个命令行工具。我想为这个工具创建我自己的自动完成

我想做两件不同的事情(也许我应该发布两个问题):

  • 对于选项
    --install
    -i
    ,我希望在文件路径上自动完成,就像
    ls
    命令那样
  • 对于选项
    --unittest
    -t
    ,我想自动完成一个特定目录中的文件路径,我可以运行
    我的应用程序--directory
我的应用程序自动完成
文件

__my_app_autocomplete()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help -h --install -i --run -r --rebuild -rb --show-running-containers -ps --stop -s --remove -rm --logs -l --bash -b --sass -css --unit-tests -t"
    containers="nginx php mysql mongo node"
    sass="watch"

    # By default, autocomplete with options
    if [[ ${prev} == my_app ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
    # By default, autocomplete with options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
    # For --install and -i options, autocomplete with folder
    if [ ${prev} == --install ] || [ ${prev} == -i ] ; then
        COMPREPLY=( $(compgen -d -- ${cur}) )
        return 0
    fi
    # For --stop --remove --logs and --bash, autocomplete with containers
    if [ ${prev} == --stop ] || [ ${prev} == -s ] || [ ${prev} == --remove ] || [ ${prev} == -rm ] || [ ${prev} == --logs ] || [ ${prev} == -l ] || [ ${prev} == --bash ] || [ ${prev} == -b ] ; then
        COMPREPLY=( $(compgen -W "${containers}" -- ${cur}) )
        return 0
    fi
    # For --sass and -css, complete with sass options
    if [ ${prev} == --sass ] || [ ${prev} == -css ] ; then
        COMPREPLY=( $(compgen -W "${sass}" -- ${cur}) )
        return 0
    fi
    # For --unit-tests and -t, complete with relative to my_app folder paths
    if [ ${prev} == --unit-tests ] || [ ${prev} == -t ] ; then
        COMPREPLY=( $(compgen -d -- ${cur}) )
        return 0
    fi
}
complete -F __my_app_autocomplete my_app
问题 我在一个特殊的问题上苦苦挣扎:自动完成文件路径

我不了解compgen的
选项以及如何使用它。也许我可以试着运行一个子命令,但我不知道语法,也找不到任何有用的信息,除非它没有提供有关
compgen
的太多信息

在这种情况下,当我这样做时:

user@computer:~$ my_app --install D[TAB][TAB]
我想:

user@computer:~$ my_app --install Documents/
我获得:

user@computer:~$ myapp --install Documents 
行尾有一个空格,这是一个问题,因为我必须删除它并添加一个
/
,以便能够重做
[TAB][TAB]
以自动完成子目录

调查 -o nospace 在
complete
上应用选项
-o nospace
,如下所示:

complete -o nospace -F __my_app_autocomplete my_app
complete -o filenames -F __my_app_autocomplete my_app
这种行为是:

user@computer:~$ myapp --i[TAB][TAB]
user@computer:~$ myapp --install
user@computer:~$ myapp --i[TAB][TAB]
user@computer:~$ myapp --install
没有空间

user@computer:~$ myapp --install D[TAB][TAB]
user@computer:~$ myapp --install Documents
没有空间

user@computer:~$ myapp --install D[TAB][TAB]
user@computer:~$ myapp --install Documents
问题:

  • 它删除了所有选项的空格,迫使我在那些不是文件路径的选项后面手动添加空格(如
    --install
  • 我必须添加
    /
    才能导航到子目录
-o文件名 在
complete
上应用选项
-o filenames
,如下所示:

complete -o nospace -F __my_app_autocomplete my_app
complete -o filenames -F __my_app_autocomplete my_app
这种行为是:

user@computer:~$ myapp --i[TAB][TAB]
user@computer:~$ myapp --install
user@computer:~$ myapp --i[TAB][TAB]
user@computer:~$ myapp --install
有空位

user@computer:~$ myapp --install D[TAB][TAB]
user@computer:~$ myapp --install Documents/
带有
/
,如果是目录,则不带空格

user@computer:~$ myapp --install f[TAB][TAB]
user@computer:~$ myapp --install file 
如果它是一个文件,就用空格

它似乎只为单词列表中未定义的补全设置路径,因此它不会影响其他补全,我认为这是我需要的第一部分

从特定目录 我将提出另一个问题以避免混淆:

自动完成文件路径 替代品

complete -F __my_app_autocomplete my_app

在这里,您可以找到所有解释过的compgen选项:


如果您仔细阅读我的问题,您可以看到此文档的链接。。。谢谢,
-o文件名
解决了我问题的第一部分,第二部分呢:来自特定文件夹?我将问题拆分,以避免混淆:谢谢你的帮助!