[Terminal] 终端有的情况下不能补全
Tofloor
poster avatar
davidmai
deepin
2021-02-25 22:27
Author


执行umount /dev/sda1时发现/dev/sda1补全不了, 但是执行ls命令时却能补全到, 有点诡异

Reply Favorite View the author
All Replies
DebuggerX
deepin
2021-02-26 01:40
#1

因为这个补全并不是简单的文件路径补全。

deepin默认安装了 bash-completion 来实现更好、更智能的补全,所以当输入某些命令后载按tab键进行补全,内置规则会尽量提示出“允许”的操作。

以你的例子为例,当你已经输入了 umount,那么就会应用这个规则:

https://github.com/scop/bash-completion/blob/master/completions/_umount

注意里面

COMPREPLY=($(compgen -W '$(mount | cut -d" " -f 3)' -- "$cur"))

这一句,是将 mount | cut -d" " -f 3 的结果传递给补全操作,意思是只能 umount “已经mount了”的路径,而不是简单的“存在的路径”,所以会得到和 ls 命令不同的表现

Reply View the author
davidmai
deepin
2021-02-27 07:39
#2
DebuggerX

因为这个补全并不是简单的文件路径补全。

deepin默认安装了 bash-completion 来实现更好、更智能的补全,所以当输入某些命令后载按tab键进行补全,内置规则会尽量提示出“允许”的操作。

以你的例子为例,当你已经输入了 umount,那么就会应用这个规则:

https://github.com/scop/bash-completion/blob/master/completions/_umount

注意里面

COMPREPLY=($(compgen -W '$(mount | cut -d" " -f 3)' -- "$cur"))

这一句,是将 mount | cut -d" " -f 3 的结果传递给补全操作,意思是只能 umount “已经mount了”的路径,而不是简单的“存在的路径”,所以会得到和 ls 命令不同的表现

刚刚试验了一下 mount | cut -d" " -f 3 这条命令, 返回值只有挂载的路径, 没有设备, 感觉不科学

Reply View the author