bash compgen 결과에는 터미널 색상 코드가 포함되어 있습니다.

bash compgen 결과에는 터미널 색상 코드가 포함되어 있습니다.

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=안함예상대로 작동합니다.

관련 정보