compgen을 사용하고 alias ls='ls --color'
있는데 이상한 결과가 나타납니다. 터미널 색상 코드를 사용하여 자동 완성됩니다.
색상이 올바르게 적용되었으므로 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
출력을 공백으로 분할합니다 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}))
그리고--color=안함예상대로 작동합니다.