Thay đổi màu sắc cho thông tin người dùng, máy chủ, thư mục trong dấu nhắc lệnh của thiết bị đầu cuối


104

Có thể thay đổi màu sắc trong dấu nhắc lệnh cho user@computer, cũng như thư mục hiện tại và các phần lệnh của màn hình nhắc nhở không?

Tôi đã thấy những thứ như thế này được thực hiện bởi người dùng OSX, nhưng tôi không biết cách làm điều tương tự trong thiết bị đầu cuối gnome (tôi chỉ có thể thay đổi màu nền trước và sau).

Chẳng hạn, sẽ rất hữu ích khi cố gắng biên dịch các chương trình có lỗi, vì các tin nhắn dài, không được định dạng khiến bạn khó phân biệt dòng nào là lệnh và đầu ra nào.

Màu sắc trong thiết bị đầu cuối osx


1
Bạn đang tìm kiếm bashcài đặt (hoặc cài đặt cho hệ vỏ ưa thích của bạn), không phải là Gnome Terminal.
Scott Severance

Câu trả lời:


135

Bạn có thể chỉnh sửa cài đặt chỉnh sửa tệp : ~/.bashrc.

  1. Mở tệp : gedit ~/.bashrc.

  2. Tìm kiếm dòng #force_color_prompt=yesvà uncomment (xóa #).

  3. Tìm dòng bên dưới if [ "$color_prompt" = yes ]; thensẽ giống như:

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

    Hãy chú ý đến phần \u@\hnó nói "user @ host" và số trước khi nó \[\033[01;32m\]chỉ ra màu sắc. Đây là những gì bạn phải thay đổi. Ví dụ: cho phép thay đổi người dùng thành màu tím, "@" thành màu đen và máy chủ thành màu xanh lá cây. Chỉnh sửa dòng để nó trông giống như:

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

Kết quả:
nhập mô tả hình ảnh ở đây

Các số màu là:

Đen 0; 30 Xám đậm 1; 30
Xanh lam 0; 34 Ánh sáng xanh 1; 34
Xanh 0; 32 Xanh nhạt 1; 32
Cyan 0; 36 Ánh sáng Cyan 1; 36
Đỏ 0; 31 Đỏ nhạt 1; 31
Tím 0; 35 Tím nhạt 1; 35
Nâu 0; 33 Vàng 1; 33
Xám nhạt 0; 37 Trắng 1; 37

Tài liệu tham khảo: 1 , 2 .


Tôi rất vui vì nó hoạt động. Chào mừng bạn
desgua

Một điều đáng nói nữa là bạn không nên thay đổi màu Palettetừ Terminal Preferencestrước khi thử điều này, vì nó sẽ gây ra nhiều nhầm lẫn với mã màu.
Rifaz Nahiyan

Nhưng làm thế nào chúng ta có thể tạo ra một chuỗi cụ thể để hiển thị trong màu sắc cụ thể? Giống như nói có một thông báo lỗi được in ở một định dạng cụ thể, mà tôi muốn thấy nó có màu đỏ. HOẶC Trong GDB, khi tôi thấy một thông báo như - "cảnh báo: Tệp nguồn gần đây hơn thực thi.", Tôi muốn nó được hiển thị màu đỏ. Làm thế nào điều này có thể đạt được?
Darshan L

36

Bạn có thể thử BashrcGenerator . Đây là cách dễ nhất để có được một lời nhắc như bạn muốn. Tôi đã nhận thấy rằng màu sắc được xác định ở đây có thể khác với hệ thống của bạn, nhưng đó chỉ là một vấn đề nhỏ. Với mã được tạo, bạn có thể tự thay đổi màu sắc.

Người dùng máy chủ:

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\]"

Máy chủ gốc:

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\]"

Và nếu cần, bạn có thể thay đổi màu tên máy chủ để phản ánh loại máy chủ khác nhau.

Tôi sử dụng định dạng khác nhau cho máy tính cục bộ của mình:

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\]"

Yêu thích của tôi bây giờ:

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$ "

Lời nhắc cuối cùng này có một liên lạc tốt đẹp. Nó thêm một dòng mới sau lời nhắc và một dòng mới trống trước đó. Bây giờ bạn có thể hiển thị đường dẫn thư mục đầy đủ mà không gặp vấn đề gì, và nó làm cho rõ ràng hơn nơi một lệnh mới bắt đầu, trong trường hợp đầu ra dài.


5
Trình tạo PS1: +1: D
anishsane

1
Tôi thực sự rất thích cái cuối cùng, tôi đã lo lắng vì tên người dùng và đường dẫn đã chiếm cho tôi rất nhiều không gian, với tùy chọn cuối cùng bạn có thể có được toàn bộ màn hình
Damián Rafael Lattenero

Điều này đã làm việc tuyệt vời! tuy nhiên, làm thế nào tôi có thể làm điều này cho các máy chủ cụ thể? tức là đặt một bảng màu cụ thể khi tôi ssh vào một máy chủ sản xuất chẳng hạn? Tôi có phải thực hiện "thủ công" với các khối if-fi trong .bashrc không? hoặc có một cách thanh lịch hơn?
Acapulco

Trên mỗi máy chủ bạn đăng nhập, có tệp .bashrc cá nhân cho người dùng từ xa đó và có thể thay đổi nó. Nếu bạn trở thành root, nó có các cài đặt riêng, sẽ được người dùng khác nhìn thấy nếu họ trở thành root.
XUÂN 13/12/18

6

Để biết chi tiết, xem chi tiết HOWTO này .

Nói tóm lại, bạn có thể thay đổi lời nhắc bằng cách chỉnh sửa biến môi trường $ PS1. Có rất nhiều điều để nói ở đây, rằng tôi sẽ chỉ cho bạn lời nhắc của tôi và giới thiệu cho bạn liên kết ở trên để biết thêm chi tiết.

Các phần liên quan đến màu sắc có trong chức năng 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

Ngoài màu sắc, lời nhắc của tôi còn có một vài tính năng khác, chẳng hạn như tên thư mục viết tắt (xem chức năng bash_prompt_shortener), tự động hiển thị trạng thái thoát lệnh cuối cùng nếu không khác (chức năng checkExitStatus) và hiển thị thời gian trong các cột ngoài cùng (chức năng print_prompt_time) .


Cảm ơn vì đã chia sẻ các chức năng tùy chỉnh của bạn :) Có phải chỉ với tôi là dấu thời gian biến mất khi tôi nhấn backspace?
Luiz Rodrigo

Không. Tôi cũng vậy. Có một số lỗi mà tôi không đánh giá đủ quan trọng để cố gắng sửa.
Scott Severance
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.