Mengubah warna untuk pengguna, host, informasi direktori pada command prompt terminal


104

Apakah mungkin untuk mengubah warna pada prompt perintah untuk user@computer, serta direktori saat ini dan bagian perintah pada tampilan prompt?

Saya sudah melihat hal seperti ini dilakukan oleh pengguna OSX, tapi saya tidak tahu bagaimana melakukan hal yang sama di terminal gnome (saya hanya bisa mengubah warna foreground dan background).

Akan sangat berguna ketika, misalnya, mencoba mengkompilasi program yang memiliki kesalahan, karena pesan yang panjang dan tidak diformat menyulitkan untuk membedakan baris mana yang merupakan perintah dan mana yang merupakan output.

Warna dalam terminal osx


1
Anda sedang mencari bashpengaturan (atau pengaturan untuk shell pilihan Anda), bukan Gnome Terminal.
Scott Severance

Jawaban:


135

Anda dapat mengedit pengaturan mengedit file: ~/.bashrc.

  1. Buka file: gedit ~/.bashrc.

  2. Cari baris dengan #force_color_prompt=yesdan batalkan komentar (hapus #).

  3. Cari baris di bawah ini if [ "$color_prompt" = yes ]; thenyang seharusnya terlihat seperti:

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

    Perhatikan bagian yang tertulis \u@\h"user @ host" dan nomor sebelum itu \[\033[01;32m\]menunjukkan warna. Inilah yang harus Anda ubah. Misalnya, mari kita ubah pengguna menjadi ungu, "@" menjadi hitam dan host menjadi hijau. Edit baris sehingga terlihat seperti:

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

Hasil:
masukkan deskripsi gambar di sini

Nomor warna adalah:

Hitam 0; 30 Abu-abu Tua 1; 30
Biru 0; 34 Biru Muda 1; 34
Hijau 0; 32 Hijau Muda 1; 32
Cyan 0; 36 Light Cyan 1; 36
Merah 0; 31 Cahaya Merah 1; 31
Ungu 0; 35 Ungu Muda 1; 35
Coklat 0; 33 Kuning 1; 33
Abu-abu Cerah 0; 37 Putih 1; 37

Referensi: 1 , 2 .


Saya senang itu berhasil. Selamat datang.
desgua

Perlu juga disebutkan bahwa Anda tidak boleh mengubah warna Palettedari Terminal Preferencessebelum mencoba ini, karena akan menyebabkan banyak kebingungan dengan kode warna.
Rifaz Nahiyan

Tetapi bagaimana kita bisa membuat string tertentu untuk tampil dalam warna tertentu? Seperti misalnya ada pesan kesalahan yang dicetak dalam format tertentu, yang ingin saya lihat dalam warna merah. ATAU Dalam GDB, ketika saya melihat pesan seperti - "peringatan: File sumber lebih baru daripada yang dapat dieksekusi.", Saya ingin ini ditampilkan dalam warna merah. Bagaimana ini bisa dicapai?
Darshan L

36

Anda dapat mencoba BashrcGenerator . Sejauh ini, ini adalah cara termudah untuk mendapatkan prompt seperti yang Anda inginkan. Saya perhatikan bahwa warna yang didefinisikan di sini mungkin berbeda dari sistem Anda sendiri, tapi itu masalah kecil. Dengan kode yang dihasilkan Anda dapat mengubah warna sendiri.

Pengguna server:

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

Root server:

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

Dan jika perlu Anda dapat mengubah warna nama host untuk mencerminkan berbagai jenis server.

Saya menggunakan format berbeda untuk komputer lokal saya:

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

Favorit saya sekarang:

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

Prompt terakhir ini memiliki satu sentuhan yang bagus. Ini menambahkan baris baru setelah prompt, dan baris baru kosong sebelumnya. Sekarang Anda dapat menampilkan jalur direktori lengkap tanpa masalah, dan itu membuatnya lebih jelas di mana perintah baru dimulai, jika terjadi keluaran yang panjang.


5
Generator PS1: +1: D
anishsane

1
benar-benar menyukai yang terakhir, saya khawatir karena nama pengguna dan jalurnya mengambil banyak ruang bagi saya, dengan opsi terakhir Anda bisa mendapatkan seluruh layar
Damián Rafael Lattenero

Ini bekerja dengan baik! Namun, bagaimana saya bisa melakukan ini untuk host tertentu? yaitu mengatur skema warna tertentu ketika saya ssh ke server produksi misalnya? saya harus melakukannya "secara manual" dengan blok if-fi di .bashrc? atau adakah cara yang lebih elegan?
Acapulco

Di setiap host yang Anda masuki, miliki file .bashrc pribadi untuk pengguna jarak jauh itu, dan dapat mengubahnya. Jika Anda menjadi root, itu memiliki pengaturan sendiri, yang akan dilihat oleh pengguna lain jika mereka menjadi root.
SPRBRN

6

Untuk detailnya, lihat HOWTO terperinci ini .

Singkatnya, Anda dapat mengubah prompt dengan mengedit variabel lingkungan $ PS1. Ada banyak hal untuk dikatakan di sini, bahwa saya hanya akan menunjukkan kepada saya prompt saya dan merujuk Anda ke tautan di atas untuk lebih jelasnya.

Bagian-bagian yang terkait dengan warna berada dalam fungsi 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

Selain warna, prompt saya memiliki beberapa fitur lain, seperti nama direktori disingkat (lihat fungsi bash_prompt_shortener), tampilan otomatis status keluar perintah terakhir jika bukan nol (fungsi checkExitStatus), dan tampilan waktu di kolom paling kanan (fungsi print_prompt_time) .


Terima kasih telah berbagi fungsi kustom Anda :) Apakah hanya dengan saya timestamp hilang ketika saya menekan backspace?
Luiz Rodrigo

Nggak. Saya juga. Ada beberapa bug yang saya anggap tidak cukup penting untuk diperbaiki.
Scott Severance
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.