การทำให้เทอร์มินัลและสภาวะแวดล้อมเชลล์ของคุณเป็นสี?


262

ฉันใช้เวลาส่วนใหญ่ทำงานกับสภาพแวดล้อม Unix และใช้โปรแกรมจำลองเทอร์มินัล ฉันพยายามใช้สีบนบรรทัดคำสั่งเนื่องจากสีทำให้การแสดงผลมีประโยชน์และใช้งานง่ายขึ้น

มีตัวเลือกอะไรบ้างเพื่อเพิ่มสีให้กับสภาพแวดล้อมของเทอร์มินัล เทคนิคอะไรที่คุณใช้ คุณพบข้อผิดพลาดอะไรบ้าง

น่าเสียดายที่การรองรับสีอาจแตกต่างกันไปตามประเภทของเทอร์มินัลการตั้งค่า TERM ยูทิลิตี้การใช้งานบั๊กกี้ ฯลฯ

นี่คือเคล็ดลับบางอย่างจากการตั้งค่าของฉันหลังจากการทดลองมากมาย:

  1. ฉันมักจะตั้งค่าTERM=xterm-colorซึ่งได้รับการสนับสนุนในโฮสต์ส่วนใหญ่ (แต่ไม่ทั้งหมด)
  2. ฉันทำงานกับโฮสต์ที่แตกต่างกันหลายเวอร์ชันระบบปฏิบัติการที่แตกต่างกัน ฯลฯ ฉันใช้ทุกอย่างจาก macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux และ FreeBSD ฉันพยายามทำให้สิ่งต่าง ๆ เรียบง่ายและเป็นสามัญถ้าเป็นไปได้
  3. ฉันทำงานกลุ่มโดยใช้ GNU screenซึ่งเพิ่มความสนุกอีกชั้น
  4. ระบบปฏิบัติการจำนวนมากตั้งค่าสิ่งต่าง ๆ เช่นdircolorsและโดยค่าเริ่มต้นและฉันไม่ต้องการแก้ไขสิ่งนี้บนโฮสต์ที่แตกต่างกันหลายร้อยแห่ง ดังนั้นฉันจึงพยายามที่จะยึดติดกับค่าเริ่มต้น ฉันปรับแต่งค่าสีของเทอร์มินัลแทน
  5. ใช้สีสำหรับบางคำสั่ง Unix ( ls, grep, less, vim) และพรอมต์ทุบตี คำสั่งเหล่านี้ดูเหมือนจะใช้ " ANSI escape sequences " มาตรฐาน ตัวอย่างเช่น:

    alias less='less --RAW-CONTROL-CHARS'
    export LS_OPTS='--color=auto'
    alias ls='ls ${LS_OPTS}'

ฉันจะโพสต์.bashrcและตอบคำถามของฉันเอง Jeopardy Style


วิธีการของฉัน (ดูคำตอบด้านล่าง) แก้ไขปัญหาเกี่ยวกับความแตกต่างของ OSX และ Linux ตัวอย่างสีของสีหนึ่งคือ ls -G และอีกอันคือ ls --color-auto
Michael Durrant

1
มีใครเห็นเครื่องมือสร้างคอลัมน์สีหรือไม่ นั่นคือcolumn -t --colorอะไร?
TomášPospíšek

คำตอบ:


121

นี่คือสองสิ่งที่คุณสามารถทำได้:

Editors + Code
ผู้แก้ไขจำนวนมากมีการเน้นการสนับสนุนทางไวยากรณ์ vimและemacsมีไว้ตามค่าเริ่มต้น นอกจากนี้คุณยังสามารถเปิดใช้งานได้ภายใต้nano

นอกจากนี้คุณยังสามารถเน้นรหัสเน้นไวยากรณ์บนเทอร์มินัลโดยใช้Pygmentsเป็นเครื่องมือบรรทัดคำสั่ง

grep
grep --color=autoเน้นการแข่งขันทั้งหมด คุณยังสามารถใช้export GREP_OPTIONS='--color=auto'เพื่อทำให้คงอยู่ได้โดยไม่ต้องใช้นามแฝง ถ้าคุณใช้--color=alwaysมันจะใช้สีแม้ว่าจะเป็นท่อซึ่งทำให้สับสน

LS

ls --color=always

สีที่ระบุโดย:

export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33'

(คำใบ้: dircolorsมีประโยชน์)

PS1
คุณสามารถตั้งค่า PS1 ของคุณ (เชลล์พรอมต์) เพื่อใช้สี ตัวอย่างเช่น:

PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '

จะผลิต PS1 เช่น:

[สีเหลือง] lucas @ ubuntu: [สีแดง] ~ [ปกติ] $

คุณสามารถสร้างสรรค์สิ่งนี้ได้จริงๆ ในฐานะที่เป็นความคิด:

PS1='\e[s\e[0;0H\e[1;33m\h    \t\n\e[1;32mThis is my computer\e[u[\u@\h:  \w]\$ '

วางแถบที่ด้านบนสุดของเทอร์มินัลด้วยข้อมูลแบบสุ่ม (เพื่อผลลัพธ์ที่ดีที่สุดให้ใช้alias clear="echo -e '\e[2J\n\n'"ด้วย)

การกำจัดลำดับหนี

หากมีบางอย่างค้างอยู่ที่การแสดงสีเมื่อคุณไม่ต้องการให้ฉันใช้sedบรรทัดนี้เพื่อตัดลำดับการหลีกเลี่ยง:

sed "s/\[^[[0-9;]*[a-zA-Z]//gi"

หากคุณต้องการประสบการณ์ที่แท้จริงมากขึ้นคุณสามารถกำจัดบรรทัดที่ขึ้นต้นด้วย\e[8mซึ่งสั่งให้เทอร์มินัลซ่อนข้อความ (ไม่รองรับอย่างกว้างขวาง)

sed "s/^\[^[8m.*$//gi"

โปรดทราบด้วยว่า ^ [s ควรเป็นจริงตามตัวอักษร ^ [s คุณสามารถพิมพ์ได้โดยการกด ^ V ^ [ในทุบตีที่เป็นCtrl+ V, +Ctrl[


1
บรรทัดแรก PS1 PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ 'ควรอ่านเช่นนี้ มี x ที่เกินความจำเป็นหลังจากแบ็กสแลชที่สี่
Chris

3
Escapes ควรอยู่ใน\[...\]หรือคำสั่งอื่นในบรรทัดที่สองจะเขียนทับบรรทัดแรก PS1 = '[\ e [33; 1m] \ u @ \ h: [\ e [31m] \ W \ e [0m \ $'
yanglifu90

ls --color=alwaysไม่ทำงาน วิธีการของ @Michael Durrant ดีกว่าสำหรับเรื่องนี้:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.

83

ฉันยังใช้:

export TERM=xterm-color
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

และถ้าคุณชอบ colorizing prompt, vars สีที่กำหนดจะมีประโยชน์:

export COLOR_NC='\e[0m' # No Color
export COLOR_WHITE='\e[1;37m'
export COLOR_BLACK='\e[0;30m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_GRAY='\e[0;30m'
export COLOR_LIGHT_GRAY='\e[0;37m'

แล้วพรอมต์ของฉันก็เป็นแบบนี้:

case $TERM in
     xterm*|rxvt*)
         local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
          ;;
     *)
         local TITLEBAR=""
          ;;
    esac

local UC=$COLOR_WHITE               # user's color
[ $UID -eq "0" ] && UC=$COLOR_RED   # root's color

PS1="$TITLEBAR\n\[${UC}\]\u \[${COLOR_LIGHT_BLUE}\]\${PWD} \[${COLOR_BLACK}\]\$(vcprompt) \n\[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "  

$ (vcprompt) กำลังเรียกสคริปต์ python ใน ~ / sbin ของฉันซึ่งพิมพ์ข้อมูลการควบคุมเวอร์ชันเกี่ยวกับเส้นทางปัจจุบัน ซึ่งจะรวมถึงการสนับสนุนสำหรับ Mercurial, Git, SVN, Cvs ฯลฯ ผู้เขียนสคริปต์ที่มีแหล่งที่มาที่นี่

ภาพหน้าจอของ Bash prompt

นี่คือแหล่งที่มาแบบเต็มของการกำหนดค่าที่รวดเร็วของฉัน:


ดูวิธีแก้ปัญหาเส้นตรงที่นี่เมื่อฉันใช้ PS1 ด้านบน: stackoverflow.com/questions/5087036/ …
Xander Dunn

ฉันได้อัปเดตคำตอบเพื่อสะท้อนวงเล็บที่หลบหนีสำหรับสีต่างๆในพรอมต์ ขอบคุณ!
กริช

1
$LSCOLORSและ$CLICOLORสำหรับ BSD ls GNU ls (Linux) ใช้$LS_COLORSกับไวยากรณ์ที่แตกต่าง เมื่อ GNU รู้สึกเหมือนอยู่บ้านฉันฉันใช้LSCOLORS=exgxfxDacxBaBaCaCaeaEaเพื่อเลียนแบบสีของ GNU ใน BSD
Adam Katz

grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Steven Almeroth

1
คุณอาจต้องระบุแหล่ง.bashrcไฟล์เพื่อให้การแก้ไขมีผล คุณสามารถทำได้ด้วยคำสั่งดังต่อไปนี้ source /path/to/.bashrc
François

18

grepและlsได้รับการกล่าวถึงถ้าคุณต้องการสีมากขึ้นตรวจสอบทั่วไป Coloriserวัตถุประสงค์แรกเริ่มของการเป็นสีสัน logfiles แต่ขวาออกจากกล่องก็ยัง colorizes ping, traceroute, gcc, make, netstat, diff, last, และldapcvs

มันขยายได้อย่างง่ายดายถ้าคุณรู้ว่า regexes ฉันได้เพิ่มpsและnmapลงในรายการ (ถ้าคุณได้รับgrcฉันจะมีความสุขมากกว่าที่จะแบ่งปันไฟล์. config สำหรับสองเครื่องมือ)

(Btw, เพื่อติดตั้งผ่านsynaptic, pacmanและเหมือนกันคุณอาจโชคดีกว่าในการค้นหา "grc")


grcตอนนี้สนับสนุนpsโดยค่าเริ่มต้น ฉันสนใจnmapสีของคุณ ดูคำตอบของฉันสำหรับนามแฝงเหล่านี้ในแบบที่จะดูดซับคำสั่งใหม่เมื่อคุณอัพเกรด grc
Adam Katz

ฉันสังเกตว่า. นี่คือ conf.nmap ของฉัน (และทุกอย่างอื่น ๆ จริง ๆ ) gist.github.com/sygo/844982#file-conf-nmap - ฉันสังเกตว่าคุณทำงานใน infosec คุณอาจพบว่า conf.hexdump น่าสนใจฉันยังไม่เสร็จ แม้
Sygo

ขอบคุณ @Sygo ฉันได้แยกและแก้ไขส่วนสำคัญของคุณ ฉันไม่เคยใช้ข้อมูลกับ git (ปล่อยให้ git gist อยู่คนเดียว) และฉันไม่สามารถหาวิธีนำเสนอการรวมกลับคืนมาให้คุณได้ (ฉันเดาว่านี่เป็นเพราะ gist นั้นง่ายเกินไป)
Adam Katz

ฉันสงสัยว่าคุณทำไม่ได้เพราะเป็นส่วนสำคัญและไม่ใช่ที่เก็บข้อมูลที่เหมาะสม ฉันลองตรวจสอบทางแยกของคุณและแน่นอนว่าฉันจะปล่อยเวอร์ชั่นของคุณ ฉันอยากรู้อยากเห็นว่าสิ่งที่ถ่ายโอนฐานสิบหกจะกลายเป็น ...
Sygo

11

ฉันได้เพิ่ม. bashrc เป็นเวลาหลายปีในการทำงานกับทั้ง OSX และ Ubuntu
ฉันได้ลดขนาดลงเหลือ 28 บรรทัดด้วยคำแถลงเงื่อนไขที่กะทัดรัด
ด้วยพรอมต์ PS1 ของฉันดูเหมือน: ป้อนคำอธิบายรูปภาพที่นี่

ด้วยเวลาเป็นสีแดงชื่อผู้ใช้เป็นสีเขียวชื่อเครื่องเป็นสีน้ำเงินอ่อน pwd สีน้ำเงินเข้มและ git สาขาเป็นสีเหลือง

คุณสมบัติของพรอมต์ PS1 ของฉัน:

  • แสดงให้เห็นถึงสาขาคอมไพล์!
  • พา ธ ของไดเรกทอรีแบบยาว (มากกว่า 6 อิลิเมนต์) เป็น 'ที่ถูกตัดแต่ง' เพื่อแสดงไดเรกทอรี 3 อันดับแรกและ 3 ด้านล่าง_ระหว่างนั้น (นั่นคือpwd sedส่วนหนึ่งของ LOCATION)
  • รถคืนในตอนท้ายเพื่อให้พรอมต์อยู่ด้านซ้ายเสมอ!

บรรทัดที่เกี่ยวข้องจาก.bashrcไฟล์ของฉันคือ:

git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'

สำหรับ ls ที่มีสีเมื่อมีให้บริการและไม่มีข้อผิดพลาดเมื่อไม่มี (เช่น OSX):

ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'

1
สีที่มีอยู่สำหรับlsใน OS X export CLICOLOR=1แต่มันจะทำโดยใช้
ThomasW

3
@ThomasW แต่ไม่ใช่ใน linux :-p ผู้ชายใช้ทั้งสอง
Jimmy Kane

1
อย่างไรก็ตาม ThomasW นั้นถูกต้องเพื่อชี้ให้เห็นว่าคำตอบนั้นผิดพลาดในการบอกว่าสีไม่สามารถใช้ได้กับlsMacOS 10 คำตอบนั้นผิดพลาดเช่นกันว่าสตริงพรอมต์ที่นี่เป็นความผิดพลาดจริง พวกเขาไม่สมดุลอย่างถูกต้อง\[และ\]และทำให้เกิดปัญหาสำหรับอย่างน้อยหนึ่งคนคัดลอกคำตอบนี้
JdeBP

9

สีสำหรับman pages ( รายละเอียดเพิ่มเติม ):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$(printf "\e[1;35m") \
    LESS_TERMCAP_md=$(printf "\e[1;34m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[7;40m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;33m") \
      "$@"
}
function man() { _colorman man "$@"; }
function perldoc() { command perldoc -n less "$@" |man -l -; }

สีสำหรับgrep ( 1;32เป็นสีเขียวสดใสดูโพสต์อื่นสำหรับสีอื่น)

GREP_OPTS='--color=auto'      # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32'             # (legacy) bright green rather than default red
GREP_COLORS="ms=$GREP_COLOR"  # (new) Matching text in Selected line = green
alias   grep='grep $GREP_OPTS'
alias egrep='egrep $GREP_OPTS'
alias fgrep='fgrep $GREP_OPTS'

สีเพิ่มเติมสำหรับGNU ls :

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(ls -d ~/.dircolors 2>/dev/null) )"

# Usage: _ls_colors_add BASE NEW [NEW...]
# Have LS color given NEW extensions the way BASE extension is colored
_ls_colors_add() {
  local BASE_COLOR="${LS_COLORS##*:?.$1=}" NEW
  if [ "$LS_COLORS" != "$BASE_COLOR" ]; then
    BASE_COLOR="${BASE_COLOR%%:*}"
    shift
    for NEW in "$@"; do
      if [ "$LS_COLORS" = "${LS_COLORS#*.$NEW=}" ]; then
        LS_COLORS="${LS_COLORS%%:}:*.$NEW=$BASE_COLOR:"
      fi
    done
  fi
  export LS_COLORS
}

_ls_colors_add zip jar xpi            # archives
_ls_colors_add jpg ico JPG PNG webp   # images
_ls_colors_add ogg opus               # audio (opus now included by default)

CLICOLOR=1   # BSD auto-color trigger (like  ls -G  but for everything)
if ls -ld --color=auto / >/dev/null 2>&1
  then alias ls="ls -ph --color=auto"
  else alias ls="ls -ph"
fi

ติดตั้งgrc( Colouriser ทั่วไป ) และเพิ่มลงในนามแฝงของคุณ:

# using this as a variable allows easier calling down lower
export GRC='grc -es --colour=auto'

# loop through known commands plus all those with named conf files
for cmd in g++ head ld ping6 tail traceroute6 `locate grc/conf.`; do
  cmd="${cmd##*grc/conf.}"  # we want just the command
  # if the command exists, alias it to pass through grc
  type "$cmd" >/dev/null 2>&1 && alias "$cmd"="$GRC $cmd"
done

# This needs run-time detection. We even fake the 'command not found' error.
configure() {
  if [[ -x ./configure ]]; then
    colourify ./configure "$@"
  else
    echo "configure: command not found" >&2
    return 127
  fi
}

# GRC plus LS awesomeness (assumes you have an alias for ls)
unalias ll 2>/dev/null
if ls -ld --color=always / >/dev/null 2>&1; then GNU_LS="--color=always"; fi

ll() {
  if [[ -t 1 ]] || [[ -n "$CLICOLOR_FORCE" ]]
    then colourify ls -l $GNU_LS "$@"
    else ls -l "$@"
  fi
}

สีสำหรับdiff : เนื้อหามากเกินไปสำหรับฟังก์ชั่นใช้สคริปต์และตั้งชื่อไว้ในไฟล์ rc ของคุณ (ไม่จำเป็นถ้าคุณติดตั้งgrc):

#!/usr/bin/perl
use strict;
use warnings;

open (DIFF, "-|", "diff", @ARGV) or die $!;

my $ydiff = 1;
while (<DIFF>) {
  if (not -t 1) {
    print;
    next;
  }
  chomp;
  $ydiff = 0 if /^[ <>\@+-]/ or ($. == 1 && /^\d+[a-z]{1,5}\d+$/);
  my $color = "";
  if (! $ydiff && /^[\@+-<>]/) {
    $color = (/^[<-](?!--$)/ ? 1 : /^[+>]/ ? 2 : 5);
  } elsif ($ydiff && /\t {6}([<|>])(?:\t|$)/) {
    $color = ($1 eq "<" ? 1 : $1 eq ">" ? 2 : 4);
  }
  $color ? printf ("\e[1;3%dm%s\e[0;0m\n",$color,$_) : print "$_\n";
}
close DIFF;

สีสำหรับbash prompt :

# Shorten home dir, cygwin drives, paths that are too long
if [ -d /cygdrive ] && uname -a |grep -qi cygwin; then CYGWIN_OS=1; fi
function PSWD() {
  local p="$*" space A B cols="${COLUMNS:-`tput cols 2>/dev/null || echo 80`}"
  p="${p/$HOME/\~}"         # shrink home down to a tilde
  if [ -n "$CYGWIN_OS" ] && [ "${p#/cygdrive/?/}" != "$p" ]; then
    p="${p:10:1}:${p:11}"   # /cygdrive/c/hi -> c:/hi
  fi
  space="$((${#USER}+${#HOSTNAME}+6))"  # width w/out the path
  if [ "$cols" -lt 60 ]; then echo -n "$N "; space=-29; p="$p$N\b"; fi
  if [ "$cols" -lt "$((space+${#p}+20))" ]; then # < 20 chars for the command
    A=$(( (cols-20-space)/4 ))      # a quarter of the space (-20 for cmd)
    if [ $A -lt 4 ]; then A=4; fi   # 4+ chars from beginning
    B=$(( cols-20-space-A*2 ))      # half (plus rounding) of the space
    if [ $B -lt 8 ]; then B=8; fi   # 8+ chars from end
    p="${p:0:$A}..${p: -$B}"
  fi
  echo "$p"
}

PSC() { echo -ne "\[\033[${1:-0;38}m\]"; }
PR="0;32"       # default color used in prompt is green
if [ "$(id -u)" = 0 ]; then
    sudo=41     # root is red background
  elif [ "$USER" != "${SUDO_USER:-$USER}" ]; then
    sudo=31     # not root, not self: red text
  else sudo="$PR"   # standard user color
fi
PROMPT_COMMAND='[ $? = 0 ] && PS1=${PS1[1]} || PS1=${PS1[2]}'
PSbase="$(PSC $sudo)\u$(PSC $PR)@\h $(PSC 33)\$(PSWD \w)"
PS1[1]="$PSbase$(PSC $PR)\$ $(PSC)"
PS1[2]="$PSbase$(PSC  31)\$ $(PSC)"
PS1="${PS1[1]}"
unset sudo PR PSbase

ตัวอย่างของ bash prompt


1
โหวตขึ้นสำหรับสกรีนช็อต
Green

PSWD()ฟังก์ชั่นของฉันเคยใช้กับ POSIX ได้ แต่มันง่ายขึ้นกว่ามากเมื่อใช้การจัดการสตริงย่อยของ bash / zsh ดูการแก้ไข 6สำหรับเวอร์ชัน POSIX ซึ่งเกี่ยวข้องกับเครื่องหมายคำถามจำนวนมากและไม่สามารถปรับให้เข้ากับความกว้างของเทอร์มินัลได้เลย ฉันไม่ได้อัปเดตภาพหน้าจอ แต่เป็นการเปลี่ยนแปลงเพียงเล็กน้อยที่ความกว้าง 80 อักขระ
Adam Katz

CLICOLOR=1ไม่ทำงานสำหรับฉันด้วย FREEBSD 11.2
Simon C.

1
@SimonC - คุณอาจใช้โปรแกรมอรรถประโยชน์ GNU บนระบบ FreeBSD ของคุณแทนที่จะใช้โปรแกรม BSD CLICOLOR=1 lsควรทำสิ่งเดียวกันกับการls -Gใช้ BSD ( ls -gกับBSD ที่เก่ากว่า) หากใช้ls --colorงานได้ (ไม่มีข้อผิดพลาด) แสดงว่าคุณกำลังใช้lsคำสั่งของ GNU และ$CLICOLORจะถูกละเว้น
Adam Katz

1
@SimonC - คุณต้องโหลดจริง~/.bashrcเพื่อให้การเปลี่ยนแปลงมีผล เรียกใช้source ~/.bashrcหรือเริ่มเซสชัน bash ใหม่ (เรียกใช้เทอร์มินัลหรือเรียกใช้bash)
Adam Katz

8

ตั้งค่าตัวหนา / สี จากcyberciti.bizและBashFAQ

# 'tput bold' will work regardless of the foreground and background colors.
# Place the tput output into variables, so they are only execd once.
bold=$(tput bold) # This could also be a color.
reset=$(tput sgr0)
export PS1="\u@\[$bold\]\h\[$reset\]:\w \$ "

ฉันจัดการเพื่อค้นหาการตั้งค่าสีที่รองรับอย่างกว้างขวางและไม่พิมพ์ตัวอักษร gobbledygook ในสภาพแวดล้อมที่เก่ากว่า (แม้แต่ FreeBSD4!) และดูเหมือนว่าจะทำงานได้ดีถ้า TERM = vt100, xterm, xterm-color (ส่วนใหญ่). จาก. bashrc ของฉัน:

# Set some options, based on the OS
OS=`uname -s` 

case "$OS" in
    "SunOS" ) 
        # Solaris ls doesn't allow color, so use special characters
        LS_OPTS='-F'
        alias  ls='ls ${LS_OPTS}'
        ;;
    "Linux" )
        # GNU ls supports colors!
        # See dircolors to customize colors
        export LS_OPTS='--color=auto' 
        alias  ls='ls ${LS_OPTS}'

        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"

        ;;
    "Darwin"|"FreeBSD")

        # Most FreeBSD & Apple Darwin supports colors
        export CLICOLOR=true
        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"
        ;;
    * ) 
        echo "Unknown OS [$OS]"
        ;;
esac

1
หรือถ้าคุณต้องการใช้ ZSH, พรอมต์ของ Phil Gold ที่aperiodic.net/phil/promptเป็นงานศิลปะ
tsvallender


5

สิ่งที่ยังไม่ได้พูดที่นี่:

หากต้องการ colorize ผลลัพธ์ของการรวบรวมของคุณด้วย gcc มี colorgcc โดย Johannes Schlüter

หากต้องการ colorize บันทึกมีหลาย multitail

เพื่อ colorize stdout ใด ๆ ฉันรวบรวมxcol

ตัวอย่าง xcol

ฉันเองใช้สิ่งเหล่านี้จากเครื่องมือ xcol

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

ฉันใช้ตัวแปรเหล่านี้ในสคริปต์ของฉันอย่างนั้น

echo "${red}hello ${yellow}this is ${green}coloured${normal}"

ฉันชอบฟังก์ชั่น colorEcho เล็ก ๆ น้อย ๆ (พบใน Stack Overflow)

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

coloredEcho "This text is green" green

ขออภัยไม่อนุญาตให้โพสต์ลิงก์เพิ่มเติม


2
สวัสดีคุณสร้างแฟล็กได้อย่างไรสำหรับเส้นทางพรอมต์? ฉันกำลังพูดถึงแท่งสี่เหลี่ยมที่มีรูปสามเหลี่ยมสิ้นสุดขอบคุณ
Artur Vieira

มันทำงานใน terminal gnu ubuntu ด้วยหรือไม่
helle

lnavยังเป็นเครื่องมือที่ยอดเยี่ยมในการแสดงไฟล์บันทึกสี
Cyril Chaboisseau

4

ฉันขอแนะนำให้คุณตรวจสอบZSHและปลั๊กอินของoh-my-zshซึ่งมีหนึ่งในคุณสมบัติคอนโซลที่มีประสิทธิภาพที่สุดที่ฉันเห็น หนึ่งในนั้นคือการเลือกธีมสำหรับเทอร์มินัลของคุณ นี่คือตัวอย่างของชุดรูปแบบของฉัน ... ใน tty สีไม่อบอุ่น แต่พวกเขาเหมือนกันในภาพนี้ ... ทุกวิธีที่คุณจะรักมัน!

ป้อนคำอธิบายรูปภาพที่นี่


2
ถ้าฉันทำได้ฉันจะลงคะแนนให้กับคำแนะนำของ Oh-My-ZSH ในฐานะวิศวกรระบบที่ทำงานอย่างกว้างขวางใน Terminal และในฐานะคนที่พยายามใช้ zsh / oh-my-zsh เข้ากับเวิร์กโฟลว์ของฉันฉันสามารถพูดได้อย่างตรงไปตรงมาว่าฉันไม่เคยแนะนำ ZSH ให้ใครเลย แน่นอนว่าคุณสามารถ symlink zsh ไปยังไฟล์ที่ตั้งชื่อตามเชลล์อื่น ๆ และเลียนแบบเชลล์นั้น แต่เมื่อคุณทำเช่นนั้นมันจะไม่อ่าน. bashrc, .bash_profile ฯลฯ นอกจากนี้คุณไม่สามารถใส่emulate bash. zprofile หรือ. zshrc ของคุณได้ ไฟล์ สำหรับทุกคนที่ทำงานกับคุณสมบัติขั้นสูงใน BASH มีรายละเอียดปลีกย่อยมากมายที่จะกัดคุณ BASH เป็นดวลจุดโทษที่ดีกว่า
Charles Addis

2
สิ่งเดียวที่ ZSH ออกจากกล่องที่ดีกว่า BASH คือการทำคำสั่งให้เสร็จสิ้น แต่แม้จะเป็นโปรแกรมใน BASH บางทีคนที่ไม่ได้ใช้เชลล์ยกเว้นงานทางโลกเป็นครั้งคราวควรใช้ ZSH แต่ไม่ใช่สำหรับใครที่ต้องการใช้เชลล์อย่างกว้างขวาง =~ผู้ประกอบการสามารถกัดคุณทาง ZSH จัดการอาร์เรย์สามารถกัดคุณ ฯลฯ หลังจากใช้ ZSH / Oh-My-ZSH ประมาณ 9 เดือนผมมีเพียงพอของมัน ฉันใช้ชุดรูปแบบที่กำหนดเองที่ฉันเขียนเองฉันส่งไปที่ BASH และเขียนบรรทัดคำสั่งคอมไพล์ของฉันเองและฉันไม่เคยมองย้อนกลับไป ตอนนี้ฉันไม่ต้องกังวลเรื่องการพกพาอีกต่อไปแล้ว
Charles Addis

1
"มันมีคุณสมบัติคอนโซลที่มีประสิทธิภาพมากที่สุดอย่างหนึ่งที่ฉันเห็นหนึ่งในนั้นคือการเลือกธีมสำหรับเทอร์มินัลของคุณ"
Jonathan Hartley

@JonathanHartley ความคิดเห็นของคุณดูเหมือนว่าคุณทิ้งไว้ไม่สมบูรณ์ ?
Wildcard

2
ขอบคุณสำหรับความกังวลของคุณ แต่ความคิดเห็นของฉันบอกทุกสิ่งที่ฉันตั้งใจจะพูด
Jonathan Hartley

4

สำหรับการดูการส่งออกต่างสีใช้colordiff

sudo apt-get install colordiff

ไพพ์เอาต์พุต diff-format ใด ๆ ลงใน colordiff:

เอาท์พุตของ diff diffed เข้าสู่ colordiff

ซึ่งรวมถึงรูปแบบอื่นของ diff บางแบบเช่น-y(เคียงข้างกัน)

อีกทางเลือกหนึ่งหากเรียกใช้งานแบบสแตนด์อโลน (โดยไม่มีสิ่งใดแทรกเข้าไป) มันจะทำหน้าที่เป็นตัวคลุมรอบ 'diff' และให้สีออก ดังนั้นฉันมีสิ่งนี้ใน. bashrc ของฉันเพื่อนามแฝง 'diff' ต่อ colordiff

# if colordiff is installed, use it
if type colordiff &>/dev/null ; then
    alias diff=colordiff

1
.bashrcตัวอย่างจะหายไปสุดท้ายfi, และสามารถแปลงเป็นคำสั่งบรรทัดเดียว:type colordiff &> /dev/null && alias diff='colordiff'
เทียมู Leisti

3

การตกแต่งข้อความบางส่วน (ตัวหนา) เพื่อแยกความแตกต่างระหว่างรูตและเชลล์ที่ไม่ใช่รูทได้อย่างง่ายดาย สำหรับ Zsh:

if test $UID = 0
    then PS1="%B${PS1}%b "
fi

สำหรับ Bash:

if test $UID = 0
    then PS1="\033[1m${PS1}\033[0m"
fi

กรุณาระบุเปลือกของคุณ เพียงเปลือกแท็กเฉพาะคำถามคือทุบตีbashแต่ฉันรู้สึกรหัสของคุณไม่ได้
จัดการ

@ การผลิต: ขอโทษลืมที่จะพูดถึงว่ามันเป็น Zsh อัปเดตโพสต์ของฉัน
Mischa Arefiev

3

ฉันแค่สงสัยในสิ่งเดียวกัน ฉันมีวิธีการของตัวเอง แต่ฉันกำลังมองหาทางเลือก

ฉันเขียน wraps bash รอบการเรียกใช้โปรแกรมและไพพ์เอาท์พุทของsedมัน สิ่งที่ฉันชอบsedคือมันจะปรับเปลี่ยนและสะท้อนแต่ละบรรทัดทันที => ไม่บัฟเฟอร์มาก อย่างไรก็ตามฉันไม่ชอบว่าทุกการเรียกไปยังโปรแกรมที่ถูกห่อsedรหัสจะถูกวิเคราะห์และเรียบเรียง

ตัวอย่างเช่นนี่คือสิ่งที่ฉันจะทำสีผลลัพธ์ของip:

#
# Colorcodes
#
NORMAL=`echo -e '\033[0m'`
RED=`echo -e '\033[31m'`
GREEN=`echo -e '\033[0;32m'`
LGREEN=`echo -e '\033[1;32m'`
BLUE=`echo -e '\033[0;34m'`
LBLUE=`echo -e '\033[1;34m'`
YELLOW=`echo -e '\033[0;33m'`


#
# command: ip
# highlight ip addresses, default route and interface names
#

IP4=$GREEN
IP6=$LBLUE
IFACE=${YELLOW}
DEFAULT_ROUTE=$LBLUE

IP_CMD=$(which ip)

function colored_ip()
{
${IP_CMD} $@ | sed \
    -e "s/inet [^ ]\+ /${IP4}&${NORMAL}/g"\
    -e "s/inet6 [^ ]\+ /${IP6}&${NORMAL}/g"\
    -e "s/^default via .*$/${DEFAULT_ROUTE}&${NORMAL}/"\
    -e "s/^\([0-9]\+: \+\)\([^ \t]\+\)/\1${IFACE}\2${NORMAL}/"
}

alias ip='colored_ip'

3

สำหรับการตั้งค่าพรอมต์ฉันมีสิ่งนี้ในไฟล์. bashrc ของฉัน

#Set variables for foreground colors
fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
#Set variables for background colors
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
#Set variables for font weight and text decoration
B=$(tput bold) ; U=$(tput smul) ; C=$(tput sgr0)
#NOTE: ${C} clears the current formatting

if [[ $USER = "root" ]]; then
  PS1="${B}${fgRed}\u${C}@\h(\s): ${fgGreen}\w${C} > "
else
  PS1="${B}${fgCyan}\u${C}@\h(\s): ${fgGreen}\w${C} > "
fi

สิ่งนี้ทำให้ฉันได้รับพรอมต์ที่มีลักษณะเช่นนี้:

user@host(bash): ~/bin >

ไดเรกทอรีการทำงานเป็นสีเขียว และชื่อผู้ใช้เป็นตัวหนาและสีฟ้าเว้นแต่ฉันจะวิ่งเชลล์ด้วยsudoซึ่งในกรณีนี้ชื่อผู้ใช้ ("root") จะแสดงเป็นตัวหนาและสีแดง

ส่วนตัวแล้วผมชอบที่จะมีตัวควบคุมการจัดรูปแบบเก็บไว้ในตัวแปรเพราะมันทำให้การอ่านรหัสสำหรับการตั้งค่าพรอมต์ง่ายขึ้น นอกจากนี้ยังทำให้การแก้ไขพรอมต์มากได้ง่ายขึ้น

เหตุผลที่ฉันใช้tputคือมันควรจะได้รับการสนับสนุนในระดับสากลมากกว่า033[01;31m\]ลำดับแปลก ๆ นอกจากนี้หากคุณทำecho $PS1ตามคำแนะนำคุณจะเห็นพรอมต์แบบดิบพร้อมสีแทนที่จะเป็นลำดับการควบคุมที่ไม่สามารถเข้าใจได้


2

คุณสามารถลองโครงการที่ช่วยในการ colorizing สคริปต์เอาท์พุทเช่นชื่อ ScriptEchoColor ที่แหล่งปลอม: http://scriptechocolor.sourceforge.net/

อดีต .:

echoc "@{lr}text output in light red"
echoc "@{bLGu}text outpus in blue, light green background and underlined"
echoc "you @{lr} can @{bLGu} mix @{-a} it all too"
echoc -x "ls" #executes ls command and colorizes it automatically to be easy to be seen

สามารถกำหนดสีอัตโนมัติได้

นี่คือตัวอย่างที่ทำกับมัน: ป้อนคำอธิบายรูปภาพที่นี่


2

เครื่องมือPythonสำหรับการใช้งานทั่วไปที่ยอดเยี่ยมสำหรับการระบายสีผลลัพธ์ของคำสั่งคือ ' colout '

คุณให้ regex กับกลุ่ม N ตามด้วยรายการคั่นด้วยเครื่องหมายจุลภาคของสี N ข้อความใด ๆ ที่ตรงกับกลุ่มจะแสดงเป็นสีที่สอดคล้องกัน

ตัวอย่างเช่นหากคุณกำลังดูผลลัพธ์ทดสอบ:

python -m unittest discover -v

เอาท์พุทที่ไม่มีสีของ Pitt unittests บางตัว

จากนั้นคุณสามารถเรียบร้อยด้วย:

python -m unittest discover -v 2>&1 | colout '(.*ERROR$)|(.*FAIL$)|(\(.*\))' red,yellow,black bold

เอาต์พุตสีของ Pitt unittests บางตัว

ดูว่า regex ของฉันมีสามกลุ่ม (วงเล็บ) ตามด้วยสามสีได้อย่างไรและเลือกได้สามสไตล์ แต่ฉันใช้ชวเลขเพื่อตั้งค่าสีทั้งหมดเป็น 'ตัวหนา' ดังนั้นกลุ่ม 'ดำ' ซึ่งจับคู่ข้อความในวงเล็บ ออกมาเป็นสีเทาเข้ม)

สังเกตว่าฉันต้องเพิ่ม2>&1ในตอนท้ายของการเรียกใช้ Python อย่างไรเนื่องจากเอาต์พุตของ unittest นั้นอยู่บน stderr ดังนั้นฉันจึงโอนมันไปยัง stdout เพื่อที่ฉันจะได้ไพพ์ลงใน colout

นี่เป็นเรื่องง่ายที่จะใช้งานบ่อยครั้งที่ฉันพบว่าตัวเองกำลังสร้างการเรียกใช้ colout ใหม่แบบทันทีและใช้ซ้ำหรือแก้ไขจากประวัติบรรทัดคำสั่งของฉัน

ข้อเสียเดียวของมันก็คือมันจะมาเป็นแพคเกจ ธ ไม่ได้เป็นปฏิบัติการแบบสแตนด์อโลนดังนั้นคุณจำเป็นต้องติดตั้งโดยใช้ pip sudo python setup.py installหรือ



1

ผมใช้เสื้อคลุมสี

cw เป็น wrapper สี ANSI แบบเรียลไทม์สำหรับคำสั่ง unix-based ทั่วไปบน GNU / linux cw ได้รับการออกแบบมาเพื่อจำลองสภาพแวดล้อมของคำสั่งที่ถูกเรียกใช้งานดังนั้นหากบุคคลประเภท 'du', 'df', 'ping' ฯลฯ ในเชลล์ของพวกเขามันจะสีเอาต์พุตโดยอัตโนมัติตามเวลาที่กำหนด ไฟล์ที่มีรูปแบบสีที่ต้องการ cw มีการสนับสนุนการจับคู่สัญลักษณ์การระบายสีการระบายสีโทเค็นหัวกระดาษ / ท้ายกระดาษการกำหนดสีของสถานการณ์กรณีการกำหนดสีขึ้นอยู่กับบรรทัดคำสั่งและมีไฟล์นิยามที่สร้างไว้ล่วงหน้ามากกว่า 50 ไฟล์

มันเกือบจะไร้รอยต่อ แต่เมื่อฉันพบว่า ps ในเชลล์แบบโต้ตอบส่งคืนเอาต์พุตที่ต่างกันเมื่อเปรียบเทียบ ps ในไพพ์



0

หากคุณต้องการทำให้vimสีสันของคุณเหมือนฉันฉันขอแนะนำให้คุณทำตามสองขั้นตอน:

  1. เรียนรู้วิธีการเปิดใช้งานคุณลักษณะโดยทำตามลิงค์นี้: เปิดเน้นไวยากรณ์สีใน vi หรือเป็นกลุ่ม

ขั้นตอนสำคัญในลิงค์:

  1. แก้ไขไฟล์ ~ / .vimrc โดยพิมพ์คำสั่ง: vi ~ / .vimrc

  2. ผนวกตัวเลือกต่อไปนี้: ไวยากรณ์

  3. บันทึกและปิดไฟล์

  4. ทดสอบโดยใช้คำสั่งvim : vim foo.sh

  1. ค้นหาชุดสีที่คุณชอบและใช้ รูปแบบที่ฉันใช้: รูปแบบที่ฉันใช้

เมื่อใช้ลิงก์ไปยังแหล่งข้อมูลภายนอกคุณควรตรวจสอบส่วน "ระบุบริบทสำหรับลิงก์" (อ้างส่วนสำคัญ) ของส่วนที่เกี่ยวข้องของคำแนะนำ: unix.stackexchange.com/help/how-to-answer
Gert van den Berg

0

หากทุบตีเป็นทางเลือกของผมขอแนะนำให้โอ้ฉัน-ทุบตี หาก zsh เป็นทางเลือกของผมขอแนะนำให้โอ้-zsh ของฉัน รองรับการปรับสีของเทอร์มินัลและเอาต์พุตที่แตกต่างกัน


0

ฉันต้องการที่จะเจียมโฆษณาสิ่งพิมพ์ล่าสุดของฉันของtaหรือtextattrห้องสมุดและเครื่องมือบรรทัดคำสั่งที่มีจุดมุ่งหมายที่จะทำให้เพิ่มสีและแอตทริบิวต์ที่จะตกแต่งเอาท์พุทขั้วของโปรแกรมของคุณง่ายขึ้นโดยการแปลรายละเอียดมนุษย์สามารถอ่านได้เข้าไปในรหัสหนี ANSI

ตัวอย่างเช่น:

echo "The Git repo $(ta yellow)${CUR_REPO}$(ta off) is $(ta green)up-to-date$(ta off)"

หรือสั้นกว่า:

echo "The Git repo $(ta y)${CUR_REPO}$(ta f) is $(ta g)up-to-date$(ta f)"

หรือทางเลือก:

tawrite "The Git repo " @y ${CUR_REPO} @f " is " @g up-to-date @f "\n"

จะให้สิ่งที่คุณต้องการ:

ป้อนคำอธิบายรูปภาพที่นี่

ปัจจุบันไลบรารีนี้สามารถใช้งานได้สี่ภาษา C, C ++, D และ Python นอกเหนือจาก commandline use จาก shell ที่คุณชื่นชอบ

โปรดทราบว่าจะไม่ส่งผลต่อโปรแกรมอื่น ๆ โดยอัตโนมัติ มันเป็นเครื่องมือที่จะช่วยให้คุณไม่ต้องจำรหัสลับ คุณจะต้องใช้ชื่อสีที่ชัดเจนหรือจำง่ายrgb cmyk w (hite) (จาก) fตัวย่อของคุณ

สำหรับรายละเอียดเพิ่มเติมเยี่ยมชมrepo textattr

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.