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


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.