在反引号内完成Bash完成或使用完整的$()

时间:2016-12-07 13:06:29

标签: bash backticks complete

考虑这个单线程来激活complete -F _known_hosts foobar 的bash完成:

> foobar <TAB> <TAB>

这显示了

的完成选项列表
> $(foobar <TAB> <TAB>

但不适用于

> `foobar <TAB> <TAB>

save as

我认为为反引号或$()内的表达式完成制表符很有意义。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

反勾或$()内的补全称为“命令替换”。

因此它看起来与其他一些问题类似:

https://unix.stackexchange.com/questions/152328/bash-tab-completion-fails-inside-of-command-substitution

https://askubuntu.com/questions/571544/bash-tab-completion-bash-unexpected-eof-while-looking-for-matching-bash/576983#576983

https://unix.stackexchange.com/questions/152328/bash-tab-completion-fails-inside-of-command-substitution

对于基于Debian的Linux操作系统(如Ubuntu),问题是bash-completion应用程序中的一个已知错误:/ usr / share / bash-completion / completions

您可以在此处报告问题:

https://github.com/scop/bash-completion/issues

答案 1 :(得分:0)

如果只想完成命令,则可以执行以下操作:

1)打开文件/usr/share/bash-completion/bash_completion

2)转到功能_quote_readline_by_ref

3)将[[ ${!2} == \$* ]] && eval $2=${!2}行替换为[[ ${!2} == \$\'* ]] && eval $2=${!2}

4)保存更改并退出。

此后,如果打开新选项卡并开始在引号或$()中键入命令,则该命令将完成或显示正常发生的可能性。 请参见下面的示例:

[22:57]✓ -> echo $(ls
ls           lsblk        lscpu        lshw         lsipc        lslogins
lsof         lspcmcia     lsusb        lsattr 

如果您遇到任何问题,请告诉我。

答案 2 :(得分:0)

尝试以下方法:

Esc + / (要完成文件名,即您输入了一些字符

Ctrl + x + / (列出可能的文件名-请注意;有2 +)

(我一直在寻找这个问题的答案;然后从bash手册页中获得了它:-))