터미널 명령 프롬프트에서 사용자, 호스트, 디렉토리 정보의 색상 변경


104

에 대한 명령 프롬프트 user@computer와 프롬프트 표시의 현재 디렉토리 및 명령 부분 에서 색상을 변경할 수 있습니까?

이미 OSX 사용자가 수행 한 것과 같은 것을 보았지만 그놈 터미널에서 동일한 작업을 수행하는 방법을 모르겠습니다 (전경 및 배경색 만 변경할 수 있음).

예를 들어 오류가있는 프로그램을 컴파일하려고 할 때 형식화되지 않은 긴 메시지는 명령 줄과 출력 줄을 구분하기 어렵 기 때문에 매우 유용합니다.

OSX 터미널의 색상


1
bash그놈 터미널이 아닌 설정 (또는 선호하는 쉘 설정)을 찾고 있습니다.
Scott Severance

답변:


135

파일을 편집하는 설정을 편집 할 수 있습니다 : ~/.bashrc.

  1. 파일을여십시오 : gedit ~/.bashrc.

  2. 줄을 #force_color_prompt=yes제거하고 주석을 해제하십시오 (삭제 #).

  3. if [ "$color_prompt" = yes ]; then다음과 같은 줄을 찾으십시오 .

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

    부분에주의를 기울 \u@\h이 전에 "사용자 @ 호스트"와 수를 말하고있는 \[\033[01;32m\]색상을 나타냅니다. 이것이 당신이 바꿔야 할 것입니다. 예를 들어, 사용자를 자주색으로, "@"를 검은 색으로, 호스트를 녹색으로 변경하십시오. 다음과 같이 줄을 편집하십시오.

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u\[\033[01;30m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

결과:
여기에 이미지 설명을 입력하십시오

색상 번호는 다음과 같습니다.

검은 색 0; 30 진한 회색 1; 30
파랑 0; 34 하늘색 1; 34
녹색 0; 32 연한 녹색 1; 32
시안 0; 36 라이트 시안 1; 36
빨강 0; 31 밝은 빨강 1; 31
퍼플 0; 35 옅은 퍼플 1; 35
갈색 0; 33 노랑 1; 33
밝은 회색 0; 37 백색 1; 37

참고 문헌 : 1 , 2 .


나는 그것이 작동 기쁘다. 어서 오십시오.
desgua

또한 색상 코드와 혼동 될 수 있으므로이 작업을 수행하기 전에 Palette터미널에서 색상 을 변경해서는 안된다는 점도 언급 할 가치 Preferences가 있습니다.
Rifaz Nahiyan

그러나 특정 문자열을 특정 색상으로 표시하려면 어떻게해야합니까? 예를 들어 특정 형식으로 인쇄되는 오류 메시지가 있는데 빨간색으로보고 싶습니다. 또는 GDB에서 "경고 : 소스 파일이 실행 파일보다 최신입니다."와 같은 메시지가 표시되면 빨간색으로 표시하고 싶습니다. 이것이 어떻게 달성 될 수 있습니까?
Darshan L

36

BashrcGenerator 사용해보십시오 . 이것은 원하는대로 프롬프트를 얻는 가장 쉬운 방법입니다. 여기에 정의 된 색상이 시스템과 다를 수 있지만 작은 문제입니다. 생성 된 코드를 사용하면 색상을 직접 변경할 수 있습니다.

서버 사용자 :

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;32m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

서버 루트 :

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;31m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

필요한 경우 다른 유형의 서버를 반영하도록 호스트 이름 색상을 변경할 수 있습니다.

로컬 컴퓨터에 다른 형식을 사용합니다.

export PS1="\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] > \[\e[0m\]"

내가 가장 좋아하는 것 :

export PS1="\n\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] \[\e[0m\]\n$ "

이 마지막 프롬프트에는 멋진 터치가 있습니다. 프롬프트 뒤에 줄 바꿈을 추가하고 앞에 줄 바꿈을 추가합니다. 이제 문제없이 전체 디렉토리 경로를 표시 할 수 있으며, 긴 출력의 경우 새 명령이 시작되는 위치를보다 명확하게합니다.


5
PS1 생성기 : +1 : D
anishsane

1
마지막으로 정말 마음에 들었습니다. 사용자 이름과 경로가 나에게 많은 공간을 필요로했기 때문에 걱정이되었습니다. 마지막 옵션으로 전체 화면을 볼 수 있습니다
Damián Rafael Lattenero

이것은 훌륭하게 작동했습니다! 그러나 특정 호스트에 대해 어떻게 할 수 있습니까? 예를 들어 프로덕션 서버로 ssh 할 때 특정 색 구성표를 설정합니까? .bashrc의 if-fi 블록으로 "수동으로"해야합니까? 아니면 더 우아한 방법이 있습니까?
Acapulco

로그인하는 각 호스트에서 해당 원격 사용자를위한 개인 .bashrc 파일이 있으며 변경할 수 있습니다. 루트가되면 자체 설정이 있으며 다른 사용자가 루트가되면 표시됩니다.
SPRBRN

6

자세한 내용 은이 자세한 하우투를 참조하십시오 .

즉, $ PS1 환경 변수를 편집하여 프롬프트를 변경할 수 있습니다. 여기에 할 말이 너무 많아서 프롬프트를 표시하고 자세한 내용은 위의 링크를 참조하십시오.

색상 관련 부분은 다음과 setPrompt같습니다.

# This function from: https://wiki.archlinux.org/index.php/Color_Bash_Prompt_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29#Wolfman.27s
##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff          -> ~/stuff               if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_shortener() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi
}


function setPrompt {
  COLOR1="\[\033[1;33m\]"     #First color
  COLOR2="\[\033[0;33m\]"     #Second color
  NO_COLOR="\[\033[0m\]"      #Transparent - don't change

  case $TERM in 
    xterm*)
      TITLEBAR="\[\033]0;\h - \w\007\]"
      ;;
    *)
      TITLEBAR=""
      ;;
  esac

  local dash_open="${COLOR1}-${COLOR2}-"
  local dash_close="${COLOR2}-${COLOR1}-"
  local spacer="${COLOR2}-"
  local jobs_and_history="${COLOR2}(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})"
  local user_host="${COLOR2}(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})"
  local host="${COLOR2}(${COLOR1}\H${COLOR2})"
  local root_or_not="${COLOR2}(${COLOR1}\\\$${COLOR2})"
  local cwd="${COLOR2}(${COLOR1}\w${COLOR2})"
  #PS1="${TITLEBAR}${COLOR1}-${COLOR2}-(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})-(${COLOR1}\w${COLOR2})-${COLOR1}-\n-${COLOR2}-(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})-(${COLOR1}\\\$${COLOR2})-${COLOR1}- ${NO_COLOR}"
  #PS1="${TITLEBAR}${dash_open}${cwd}${spacer}${root_or_not}${dash_close}\n${dash_open}${jobs_and_history}${spacer}${host}${dash_close}${NO_COLOR} "
  #PS2="${COLOR2}--${COLOR1}- ${NO_COLOR}"
  PS1="${TITLEBAR}${COLOR1}"'${NEW_PWD}'"${COLOR2}:\$${NO_COLOR} "
  PS2="$spacer$dash_close$NO_COLOR "
}

bash_prompt_shortener
setPrompt
unset setPrompt

#Determine and display the exit Status of the last command, if non-zero.
function checkExitStatus() {
  local status="$?"
  local signal=""
  local COLOR1="\033[0;0;33m"     #First color
  local COLOR2="\033[0;0;36m"     #Second color
  local NO_COLOR="\033[0m"        #Transparent - don't change

  if [ ${status} -ne 0 -a ${status} != 128 ]; then
    # If process exited by a signal, determine name of signal.
    if [ ${status} -gt 128 ]; then
      signal="$(builtin kill -l $((${status} - 128)) 2>/dev/null)"
      if [ "$signal" ]; then
        signal="$signal"
      fi
    fi
    echo -e "${COLOR1}[Exit ${COLOR2}${status} ${signal}${COLOR1}]${NO_COLOR}" 1>&2
    #echo -ne "${COLOR1}[Exit ${COLOR2}${status}${COLOR1} ${COLOR2}${signal}${COLOR1}]${NO_COLOR} " 1>&2
    fi
  return 0
}
print_prompt_time() {
    printf "%*s\r" $(tput cols) "$(date '+%T')"
}

promptCmd() {
    checkExitStatus
    print_prompt_time
}

PROMPT_COMMAND=promptCmd

색상뿐만 아니라, 내 메시지는 축약 된 디렉토리 이름 (기능을 참조로 몇 가지 다른 특징이있다 bash_prompt_shortener), 제로 (기능의 경우 마지막 명령의 종료 상태를 자동으로 화면 checkExitStatus가장 오른쪽 열에서), 시간 표시 (기능 print_prompt_time) .


사용자 정의 기능을 공유해 주셔서 감사합니다. :) 백 스페이스를 누를 때 타임 스탬프가 사라지는 것은 나와 있습니까?
루이즈 로드리고

아니. 나도. 내가 고치려고 충분히 판단하지 않은 버그가 있습니다.
Scott Severance
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.