Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash ';人';完全功能?_Bash_Tab Completion - Fatal编程技术网

Bash ';人';完全功能?

Bash ';人';完全功能?,bash,tab-completion,Bash,Tab Completion,当我键入这样的内容时: $ complete -p | grep -ie '\<man\>' 或: 有什么想法吗?我不能给你完整的解决方案,但我在我的系统上发现了以下问题 如果运行新的shell并键入: > complete -p man bash: complete: man: no completion specification 如果我尝试使用以下命令自动完成man命令: > man [tab][tab] Display all 16625 possibilit

当我键入这样的内容时:

$ complete -p | grep -ie '\<man\>'
或:


有什么想法吗?

我不能给你完整的解决方案,但我在我的系统上发现了以下问题

如果运行新的shell并键入:

> complete -p man
bash: complete: man: no completion specification
如果我尝试使用以下命令自动完成man命令:

> man [tab][tab]
Display all 16625 possibilities? (y or n)
CTRL-C
现在:

为什么是现在?没有答案,但现在我可以得到:

> complete -p | grep _man
complete -F _man man
complete -F _man apropos
complete -F _man whatis

我希望这有点帮助。为什么它只有在第一次使用后才能工作,这是一个相当神秘的问题。其他人有想法吗?

我想你是在问命令“complete”的手册页在哪里。如果是这样,complete是bash的一部分(如果您正在使用bash),那么只需键入“man bash”。

我找到了一个解决方案:要加载尚未加载的completion funct,我只需在
中启动它。bashrc

. /usr/share/bash-completion/completions/man
帮助我的有用链接:


编辑

为了避免在每次bash会话启动时加载man完成脚本,更好的解决方案是编写一个本地完成脚本,将所需命令的名称(如中所述)放入目录
$XDG\u DATA\u HOME/bash completion/completions
(通常
~/.local/share/bash completion/completions)

下面是我在脚本中输入的代码(名为
myman
):


使用此方法,仅当需要时(通过
man
myman
)才会加载man完成功能。

Bash函数文档也可以使用,例如。,
help complete

它是一个bash内置程序,因此您可以在
manbash
中找到它。更多信息:仅供参考,没有必要在标题中添加
RESOLVED
——问题总是显示他们是否有公认的答案。如果你想回答你自己的问题,可以添加一个其他人可以投票的答案,就像其他人一样。在你接受自己的答案之前会有一段时间的延迟,但这(最终)是允许的。谢谢你,这是一个非常好的线索!它看起来像一种自动加载,这肯定是因为它是内置的(正如Ploutox所写);我一直在寻找…是的,大多数的完成函数都是在需要时自动加载的。您可以使用例如
\u completion\u loader man
(至少在我的bash版本中)从脚本强制加载完成函数。这是不必要的。Bash completion在第一次使用命令时动态加载该命令的完成。@BenjaminW。当然是这样;但只需在新的bash会话中尝试一下:
myman(){echo“Custom”man“$@”};完成-F_man myman
。然后,如果您尝试
$myman
,bash会抱怨找不到
\u-man
函数。这就是我的问题的原因,四年前……哦,你的问题没有提到那是你想做的。有一种方法可以为您自己的函数或别名动态加载现有完成,因为您的bash完成版本足够新:在正确的目录中删除指向现有完成的符号链接;在我的系统上,它是
~/.local/share/bash completion/completions
;符号链接的名称必须是命令的名称。例如,
ln-s/usr/share/bash completion/completions/man~/.local/share/bash completion/completions/myman
。现在,动态加载应该可以工作了。谢谢,但是仅仅通过链接仍然不能工作;事实上,
complete-F\u man myman
仍然需要运行。请查看我根据您的建议找到的解决方案的编辑。但是您添加的解决方案不会动态加载完成,它将始终加载完成。我会把我的完整建议写在某个地方,并链接到这里。因为这个问题并没有真正询问加载行为,所以我认为在这里给出答案并不是最好的方法。
> man [tab][tab]
Display all 16625 possibilities? (y or n)
CTRL-C
> complete -p man
complete -F _man man
> complete -p | grep _man
complete -F _man man
complete -F _man apropos
complete -F _man whatis
. /usr/share/bash-completion/completions/man
#!/bin/bash

# Force the load of the man completion function if it is not loaded yet:
type -t _man >/dev/null || . /usr/share/bash-completion/completions/man

complete -F _man myman