bash compgen 结果包含终端颜色代码

bash compgen 结果包含终端颜色代码

我正在使用alias ls='ls --color'compgen 并得到奇怪的结果,它使用终端颜色代码自动完成

正确应用颜色后,放入compgen -W "$(ls /someDir/)"终端看起来不错ls

但与

COMPREPLY=( $(compgen -W "$(ls /someDir/)" -- ${cur}))

输出

^[[34;40mfilename^[[0m默认白色

有没有办法保留彩色结果而不是将它们作为文本获取?

答案1

ls这里根本不要使用;无论如何,颜色不应该成为输出的一部分,因为您不希望它们作为完成的一部分。-W对于文件名来说不是一个好的选择,因为任何匹配的文件名都可能包含用于分隔-W.

你应该直接使用 glob 来设置COMPREPLY

COMPREPLY=( "$cur"* )

答案2

compgen 结果包含终端颜色代码,因为您将它们放在那里。您应该这样使用,以便仅在打印到终端alias ls='ls --color=auto'时获得颜色,而不是在输出被另一个命令使用时获得颜色。ls

但即使没有别名也compgen -W "$(ls /someDir/)"不起作用。它调用ls生成文件名列表,但命令的输出是字符串,而不是列表。compgen分割 at 空白的输出ls,如果任何文件名包含空白字符,则分割失败。相反,您需要生成文件名列表并去除目录前缀。未经测试:

files=(/someDir/*)
if [[ -e ${files[0]} -o -L ${files[0]} ]]; then
  for f in "${files[@]}"; do
    compgen -- "${f#/someDir/}"
  done
fi

你不会得到颜色。我不认为 bash 能够完成着色。补全系统需要控制它在终端上的显示,您不能将控制字符隐藏到显示的内容中,并且希望不要混淆补全系统。如果你想要一个具有良好功能的外壳例如彩色完成,使用桀骜(或者如果您不喜欢可配置性)。

答案3

你应该使用:

COMPREPLY=( $(compgen -W "$(ls /someDir/ --color=never)" -- ${cur}))

--颜色=从不它按预期工作。

相关内容