Tô màu thiết bị đầu cuối và môi trường vỏ của bạn?


262

Tôi dành phần lớn thời gian làm việc trong môi trường Unix và sử dụng trình giả lập thiết bị đầu cuối. Tôi cố gắng sử dụng màu trên dòng lệnh, vì màu sắc làm cho đầu ra hữu ích và trực quan hơn.

Những tùy chọn tồn tại để thêm màu sắc vào môi trường thiết bị đầu cuối của tôi? Bạn dùng thủ thuật gì? Những cạm bẫy bạn đã gặp phải?

Thật không may, hỗ trợ cho màu sắc khác nhau tùy thuộc vào loại thiết bị đầu cuối, hệ điều hành, cài đặt TERM, tiện ích, triển khai lỗi, v.v.

Dưới đây là một số mẹo từ thiết lập của tôi, sau rất nhiều thử nghiệm:

  1. Tôi có xu hướng thiết lập TERM=xterm-color, được hỗ trợ trên hầu hết các máy chủ (nhưng không phải tất cả).
  2. Tôi làm việc trên một số máy chủ khác nhau, các phiên bản HĐH khác nhau, v.v. Tôi sử dụng mọi thứ từ macOS X, Ubuntu Linux, RHEL / CentOS / Khoa học Linux và FreeBSD. Tôi đang cố giữ mọi thứ đơn giản và chung chung, nếu có thể.
  3. Tôi thực hiện một loạt các công việc bằng cách sử dụng GNU screen, thêm một lớp thú vị khác.
  4. Nhiều hệ điều hành đặt những thứ như dircolorsvà theo mặc định và tôi không muốn sửa đổi điều này trên hàng trăm máy chủ khác nhau. Vì vậy, tôi cố gắng gắn bó với các mặc định. Thay vào đó, tôi điều chỉnh cấu hình màu của thiết bị đầu cuối.
  5. Sử dụng màu sắc cho một số Unix lệnh ( ls, grep, less, vim) và dấu nhắc Bash . Các lệnh này dường như sử dụng " chuỗi thoát ANSI " tiêu chuẩn . Ví dụ:

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

Tôi sẽ đăng .bashrcvà trả lời câu hỏi của riêng tôi Phong cách nguy hiểm.


Cách tiếp cận của tôi (xem câu trả lời bên dưới) giải quyết các vấn đề về sự khác biệt của OSX và Linux, ví dụ màu sắc trên một là ls -G và mặt khác là ls --color-auto
Michael Durrant

1
Có ai nhìn thấy một công cụ để cột màu? Đó là một column -t --color?
Tomáš Pospíšek

Câu trả lời:


121

Dưới đây là một vài điều bạn có thể làm:

Trình chỉnh sửa + Mã
Rất nhiều trình soạn thảo có hỗ trợ tô sáng cú pháp. vimemacsmặc định nó Bạn cũng có thể kích hoạt nó dướinano .

Bạn cũng có thể cú pháp tô sáng mã trên thiết bị đầu cuối bằng cách sử dụng Pygments làm công cụ dòng lệnh.

grep
grep --color=auto nổi bật tất cả các trận đấu. Bạn cũng có thể sử dụng export GREP_OPTIONS='--color=auto'để làm cho nó bền bỉ mà không có bí danh. Nếu bạn sử dụng --color=always, nó sẽ sử dụng màu ngay cả khi đường ống , điều này gây nhầm lẫn.

ls

ls --color=always

Màu sắc được chỉ định bởi:

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

(gợi ý: dircolorscó thể hữu ích)

PS1
Bạn có thể đặt PS1 (dấu nhắc shell) để sử dụng màu sắc. Ví dụ:

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

Sẽ tạo ra một PS1 như:

[vàng] lucas @ ubfox: [đỏ] ~ [bình thường] $

Bạn có thể thực sự sáng tạo với điều này. Như một ý tưởng:

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

Đặt một thanh ở đầu thiết bị đầu cuối của bạn với một số thông tin ngẫu nhiên. (Để có kết quả tốt nhất, cũng sử dụng alias clear="echo -e '\e[2J\n\n'".)

Thoát khỏi chuỗi thoát

Nếu có thứ gì đó bị kẹt khi xuất màu khi bạn không muốn, tôi sử dụng seddòng này để loại bỏ các chuỗi thoát:

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

Nếu bạn muốn có trải nghiệm chân thực hơn, bạn cũng có thể thoát khỏi các dòng bắt đầu bằng \e[8m, hướng dẫn thiết bị đầu cuối ẩn văn bản. (Không được hỗ trợ rộng rãi.)

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

Cũng lưu ý rằng những ^ [s nên là thực tế, nghĩa đen ^ [s. Bạn có thể nhập chúng bằng cách nhấn ^ V ^ [trong bash, nghĩa là Ctrl+ V, Ctrl+ [.


1
Dòng PS1 đầu tiên nên đọc như thế này : PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '. Có một dấu x thừa sau dấu gạch chéo thứ tư.
Chris

3
Các lối thoát phải được đặt trong \[...\]hoặc các lệnh khác trong dòng thứ hai sẽ ghi đè lên dòng đầu tiên. PS1 = '[\ e [33; 1m] \ u @ \ h: [\ e [31m] \ W \ e [0m \ $'
yanglifu90

Các ls --color=alwayskhông hoạt động. Cách tiếp cận của @Michael Durrant tốt hơn cho việc này:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.

83

Tôi cũng dùng:

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

Và nếu bạn thích tô màu lời nhắc của mình, các lọ màu được xác định có thể hữu ích:

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'

Và sau đó lời nhắc của tôi là một cái gì đó như thế này:

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) đang gọi một tập lệnh python trong ~ / sbin của tôi in thông tin kiểm soát phiên bản về đường dẫn hiện tại. Nó bao gồm hỗ trợ cho Mercurial, Git, Svn, Cvs, v.v ... Tác giả của kịch bản có nguồn ở đây .

Ảnh chụp màn hình nhắc nhở Bash

Đây là nguồn đầy đủ của cấu hình nhắc nhở của tôi:


Xem ở đây để biết giải pháp cho một vấn đề về dòng tôi gặp phải khi tôi sử dụng PS1 ở trên: stackoverflow.com/questions/5087036/iêu
Xander Dunn

Tôi đã cập nhật câu trả lời để phản ánh dấu ngoặc thoát cho màu sắc trong lời nhắc. Cảm ơn!
Kris

1
$LSCOLORS$CLICOLORlà cho BSD ls. GNU ls (Linux) sử dụng $LS_COLORSvới một cú pháp khác nhau. Vì GNU cảm thấy giống như nhà của tôi, tôi sử dụng LSCOLORS=exgxfxDacxBaBaCaCaeaEađể bắt chước màu của GNU trên BSD.
Adam Katz

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

1
Bạn có thể cần nguồn .bashrctệp để sửa đổi có hiệu lực. Bạn có thể làm điều đó với lệnh sau. source /path/to/.bashrc
François

18

greplsđã được đề cập, nếu bạn muốn có một rất nhiều màu sắc kiểm tra Generic Coloriser , mục đích ban đầu của nó là để colorize log, nhưng ngay ra khỏi hộp nó cũng colorizes ping, traceroute, gcc, make, netstat, diff, last, ldap, và cvs.

Nó dễ dàng mở rộng nếu bạn biết regexes. Tôi đã thêm psnmapvào danh sách (nếu bạn tham gia, grctôi sẽ rất vui mừng được chia sẻ các tệp .conf cho hai công cụ đó)

(Btw, để cài đặt nó qua synaptic, pacmanvà giống như bạn có thể gặp may mắn hơn khi tìm kiếm "grc")


grcbây giờ hỗ trợ pstheo mặc định. Tôi sẽ quan tâm đến nmapmàu sắc của bạn . Xem thêm câu trả lời của tôi để khử răng cưa tất cả những thứ này theo cách sẽ hấp thụ các lệnh mới khi bạn nâng cấp grc.
Adam Katz

Tôi nhận thấy rằng. đây là conf.nmap của tôi (và mọi thứ khác, thực sự) gist.github.com/sygo/844982#file-conf-nmap - Tôi nhận thấy bạn làm việc trong infosec, bạn có thể thấy conf.hexdump thú vị, tôi chưa hoàn thành nó Tuy nhiên.
Sygo 6/2/2015

Cảm ơn @Sygo. Tôi đã rẽ nhánh và sửa đổi ý chính của bạn. Tôi chưa bao giờ thực sự cam kết dữ liệu với git (huống chi là ý chính của github) và tôi không thể tìm ra cách đề xuất hợp nhất dữ liệu lại cho bạn (Tôi đoán điều này là do ý chính quá đơn giản).
Adam Katz

Tôi nghi ngờ bạn không thể bởi vì đó là một ý chính và không phải là một kho lưu trữ thích hợp. Tôi đã kiểm tra ngã ba của bạn mặc dù và tôi chắc chắn sẽ cho phiên bản của bạn đi. Tôi tò mò không biết thứ gì mà hex hex sẽ biến thành ...
Sygo

11

Tôi đã mài giũa .bashrc của mình trong nhiều năm để hoạt động trên cả OSX và Ubuntu.
Tôi cũng đã giảm kích thước xuống còn 28 dòng với các câu điều kiện nhỏ gọn.
Với nó, lời nhắc PS1 của tôi trông giống như: nhập mô tả hình ảnh ở đây

với thời gian màu đỏ, tên người dùng màu xanh lá cây, tên máy màu xanh lam nhạt, pwd màu xanh đậm hơn và nhánh git màu vàng.

Tính năng nhắc nhở PS1 của tôi:

  • cho thấy chi nhánh git!
  • đường dẫn thư mục dài (hơn 6 phần tử) được 'cắt xén' để hiển thị 3 thư mục trên cùng và 3 dưới cùng ở _giữa (đó là pwd sedmột phần của VỊ TRÍ).
  • vận chuyển trở lại ở cuối để nhắc nhở luôn luôn ở bên trái!

Các dòng liên quan từ .bashrctập tin của tôi là:

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

Đối với ls có màu khi có sẵn và không có lỗi khi không (ví dụ OSX):

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

1
Màu sắc có sẵn cho lsOS X, nhưng nó được thực hiện bằng cách sử dụng export CLICOLOR=1.
ThomasW

3
@ThomasW nhưng không có trên linux :-p Chàng trai sử dụng cả hai.
Jimmy Kane

1
Tuy nhiên, ThomasW đã đúng khi chỉ ra rằng câu trả lời là sai khi nói rằng màu sắc không có sẵn lstrên MacOS 10. Câu trả lời cũng sai ở chỗ các chuỗi nhắc ở đây thực tế bị lỗi. Họ không cân bằng chính xác \[\] , và đã gây ra vấn đề cho ít nhất một người sao chép câu trả lời này .
JdeBP

9

Màu sắc cho trang man ( chi tiết hơn ):

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 -; }

Màu sắc cho grep ( 1;32là màu xanh lá cây tươi sáng, xem các bài viết khác ở đây để biết các màu khác):

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'

Nhiều màu sắc hơn cho 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

Cài đặt grc( Generic Colouriser ) và thêm nó vào bí danh của bạn:

# 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
}

Màu sắc cho diff : Quá nhiều nội dung cho một chức năng, sử dụng tập lệnh và bí danh nó trong tệp RC của bạn (không cần thiết nếu bạn đã cài đặt 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;

Màu sắc cho dấu nhắc bash :

# 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

bản demo của bash prompt


1
Upvote cho một ảnh chụp màn hình
Green

PSWD()Hàm của tôi từng tương thích với POSIX nhưng nó được hỗ trợ dễ dàng hơn nhiều khi sử dụng xử lý chuỗi con bash / zsh. Xem bản sửa đổi 6 cho phiên bản POSIX, bao gồm rất nhiều dấu hỏi và hoàn toàn không thích ứng với chiều rộng của thiết bị đầu cuối. Tôi đã không cập nhật ảnh chụp màn hình, nhưng nó chỉ thay đổi một chút ở độ rộng 80 ký tự.
Adam Katz

CLICOLOR=1không hoạt động với tôi với FREEBSD 11.2
Simon C.

1
@SimonC. - Bạn có thể đang sử dụng các tiện ích GNU trên hệ thống FreeBSD của bạn chứ không phải các tiện ích BSD. CLICOLOR=1 lsnên làm điều tương tự như ls -Gsử dụng BSD ( ls -gtrên các BSD cũ). Nếu ls --colorhoạt động (không có lỗi), bạn đang sử dụng lslệnh của GNU và $CLICOLORbị bỏ qua.
Adam Katz

1
@SimonC. - Bạn phải thực sự tải của bạn ~/.bashrccho bất kỳ thay đổi để có hiệu lực. Chạy source ~/.bashrchoặc bắt đầu một phiên bash mới (khởi chạy một thiết bị đầu cuối hoặc chạy bash).
Adam Katz

8

Đặt dấu nhắc đậm / màu. Từ cyberciti.bizBashFAQ

# '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 \$ "

Tôi cũng đã tìm được các cài đặt màu được hỗ trợ rộng rãi và không in các ký tự gobbledygook trong các môi trường cũ hơn (thậm chí FreeBSD4!) Và dường như hoạt động tốt nếu TERM = vt100, xterm, xterm-color. (Phần lớn). Từ .bashrc của tôi:

# 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
Hoặc nếu bạn muốn sử dụng ZSH, lời nhắc của Phil Gold tại periodic.net/phil/prompt là một tác phẩm nghệ thuật.
tsvallender


5

Những điều chưa được nói đã ở đây:

Để tô màu đầu ra của các phần tổng hợp của bạn với gcc, có colorgcc của tác giả Julian Schlüter

Để tô màu các bản ghi, có nhiều

Để tô màu cho bất kỳ thiết bị xuất chuẩn nào, tôi kết hợp xcol

ví dụ xcol

Cá nhân tôi sử dụng chúng từ công cụ 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

Tôi sử dụng các biến này trong các kịch bản của mình như vậy

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

Tôi cũng thích chức năng nhỏ này colorEcho (tìm thấy trên 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

Xin lỗi, không được phép đăng thêm liên kết


2
Xin chào, làm thế nào để bạn thực hiện các cờ, cho đường dẫn kịp thời? Tôi đang đề cập đến các thanh hình chữ nhật có đầu hình tam giác Cảm ơn
Artur Vieira

nó có hoạt động trong một thiết bị đầu cuối Ubuntu không?
helle

lnav cũng là một công cụ tuyệt vời để hiển thị các logfile được tô màu
Cyril Chaboisseau

4

Tôi khuyên bạn nên kiểm tra ZSH và plugin oh-my-zsh của nó có một trong những tính năng điều khiển mạnh mẽ nhất mà tôi thấy. Một trong số đó là chọn chủ đề cho thiết bị đầu cuối của bạn. Đây là ví dụ về chủ đề của tôi ... Trong tty màu sắc không quá ấm áp nhưng chúng giống như trong bức tranh này ... Bất kỳ cách nào bạn sẽ thích nó!

nhập mô tả hình ảnh ở đây


2
Nếu tôi có thể, tôi sẽ đánh giá thấp điều này cho đề xuất Oh-My-ZSH. Là một kỹ sư hệ thống làm việc rộng rãi trong Terminal và là người đã cố gắng áp dụng zsh / oh-my-zsh vào quy trình làm việc của tôi, tôi có thể thành thật nói rằng tôi sẽ không bao giờ giới thiệu ZSH cho bất kỳ ai. Chắc chắn, bạn có thể symlink zsh với một tệp được đặt tên theo bất kỳ shell nào khác và mô phỏng shell đó, nhưng khi bạn làm điều đó thì nó không đọc .bashrc, .bash_profile, v.v. Ngoài ra, bạn không thể đặt emulate bash.zprofile hoặc .zshrc của bạn các tập tin. Đối với bất kỳ ai làm việc với các tính năng nâng cao trong BASH, có rất nhiều sự tinh tế sẽ cắn bạn. BASH là một sh ​​tốt hơn.
Charles Addis

2
Điều duy nhất mà ZSH có trong hộp tốt hơn BASH là hoàn thành lệnh, nhưng thậm chí đó còn được lập trình trong BASH. Có lẽ ai đó không sử dụng shell ngoại trừ các nhiệm vụ trần tục không thường xuyên nên áp dụng ZSH, nhưng nó không dành cho bất kỳ ai cần sử dụng vỏ rộng rãi. Người =~vận hành có thể cắn bạn, cách ZSH xử lý mảng có thể cắn bạn, v.v ... Sau khi sử dụng ZSH / Oh-My-ZSH trong khoảng 9 tháng, tôi đã có đủ. Tôi đang sử dụng một chủ đề tùy chỉnh mà tôi tự viết, tôi đã chuyển nó sang BASH và viết lời nhắc git của riêng tôi và tôi không bao giờ nhìn lại. Bây giờ tôi không còn lo lắng về tính di động
Charles Addis

1
"nó có một trong những tính năng điều khiển mạnh mẽ nhất mà tôi thấy. Một trong số đó là chọn chủ đề cho thiết bị đầu cuối của bạn."
Jonathan Hartley

@JonathanHartley, bình luận của bạn có vẻ như bạn để nó không đầy đủ. ?
tự đại diện

2
Cảm ơn bạn đã quan tâm nhưng bình luận của tôi nói tất cả những gì tôi dự định nói.
Jonathan Hartley

4

Để xem đầu ra khác màu, sử dụng colordiff .

sudo apt-get install colordiff

Đưa bất kỳ đầu ra định dạng khác vào colordiff:

đầu ra của diff piped vào colordiff

Điều này bao gồm một số định dạng thay thế của diff, như -y(cạnh nhau.)

Ngoài ra, nếu được gọi độc lập (không có bất kỳ thứ gì được dẫn vào nó) thì nó hoạt động như một trình bao bọc xung quanh 'diff' và tô màu đầu ra. Do đó, tôi có cái này trong .bashrc, với bí danh 'diff' cho colordiff.

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

1
Các .bashrcví dụ là mất tích trận chung kết fi, và có thể được chuyển đổi sang một lệnh đơn dòng:type colordiff &> /dev/null && alias diff='colordiff'
Teemu Leisti

3

Một số trang trí văn bản (đậm) để dễ dàng phân biệt giữa vỏ gốc và vỏ không gốc. Đối với Zsh:

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

Đối với Bash:

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

Vui lòng chỉ định vỏ của bạn. Thẻ chỉ vỏ cụ thể của câu hỏi là bash , nhưng tôi cảm thấy mã của bạn không có bash.
thao tác

@manatwork: xin lỗi, quên đề cập rằng đó là Zsh. Cập nhật bài viết của tôi.
Mischa Arefiev

3

Tôi chỉ tự hỏi điều tương tự. Tôi có cách tiếp cận của riêng mình, nhưng tôi đang tìm giải pháp thay thế.

Tôi viết các hàm bash xung quanh các lệnh gọi chương trình và dẫn đầu ra của chúng sed. Điều tôi thích sedlà nó sẽ sửa đổi và lặp lại từng dòng ngay lập tức => không có nhiều bộ đệm. Tuy nhiên, tôi không thích rằng với mỗi cuộc gọi đến một chương trình được bao bọc, sedmã được phân tích cú pháp và biên dịch.

Ví dụ, đây là những gì tôi làm để tô màu đầu ra của 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

Để đặt lời nhắc, tôi có tệp này trong tệp .bashrc của mình.

#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

Điều này cho tôi một dấu nhắc trông giống như thế này:

user@host(bash): ~/bin >

Thư mục làm việc có màu xanh lá cây. Và tên người dùng được in đậm và màu lục lam trừ khi tôi chạy shell với sudo, trong trường hợp đó, tên người dùng ("root") hiển thị đậm và đỏ.

Cá nhân tôi thực sự thích có các ký tự điều khiển định dạng được lưu trữ trong các biến vì nó giúp đọc mã để đặt dấu nhắc dễ dàng hơn. Nó cũng làm cho việc chỉnh sửa lời nhắc dễ dàng hơn nhiều .

Lý do tôi sử dụng tputlà nó được cho là được hỗ trợ phổ biến hơn các 033[01;31m\]chuỗi kỳ lạ . Ngoài ra, như một phần thưởng bổ sung, nếu bạn thực hiện echo $PS1tại dấu nhắc, bạn sẽ thấy dấu nhắc thô với màu sắc thay vì các chuỗi điều khiển khó hiểu.


2

Bạn cũng có thể thử một dự án giúp tô màu đầu ra các tập lệnh, có tên là ScriptEchoColor tại nguồn giả mạo: http://scriptechocolor.sourceforge.net/

Ví dụ.:

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

Các màu tự động là cấu hình.

Đây là một ví dụ được thực hiện với nó: nhập mô tả hình ảnh ở đây


2

Một công cụ Python đa năng tuyệt vời để tô màu đầu ra của các lệnh là ' colout '

Bạn cung cấp cho nó một biểu thức chính quy với N nhóm, theo sau là danh sách N màu được phân tách bằng dấu phẩy. Bất kỳ văn bản phù hợp với một nhóm sẽ được hiển thị trong màu tương ứng.

Vì vậy, ví dụ, nếu bạn đang xem một số đầu ra thử nghiệm:

python -m unittest discover -v

Đầu ra không màu của một số unittests Python

sau đó bạn có thể làm cho nó nổi lên với:

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

Đầu ra màu của một số unittests Python

Xem cách regex của tôi có ba nhóm (dấu ngoặc đơn) theo sau là ba màu (và tùy chọn ba kiểu, nhưng tôi đã sử dụng một tốc ký để đặt tất cả các màu thành 'đậm', do đó, nhóm 'đen', khớp với văn bản trong ngoặc , đi ra như màu xám đen.)

Cũng lưu ý cách tôi phải thêm 2>&1vào phần cuối của lệnh gọi Python, vì đầu ra của unittest là trên stderr, vì vậy tôi đã chuyển nó sang thiết bị xuất chuẩn để tôi có thể chuyển nó thành colout.

Điều này thường rất dễ sử dụng đến nỗi tôi thường thấy mình đang tạo ra các lệnh colout mới ngay lập tức và sử dụng lại hoặc sửa đổi chúng từ lịch sử dòng lệnh của tôi.

Nhược điểm duy nhất của nó là nó đi kèm như một gói Python, không phải là tệp thực thi độc lập, vì vậy bạn cần cài đặt nó bằng pip, hoặc sudo python setup.py install.



1

Tôi sử dụng giấy gói màu .

cw là một trình bao bọc màu ANSI thời gian thực không xâm phạm cho các lệnh dựa trên unix phổ biến trên GNU / linux. cw được thiết kế để mô phỏng môi trường của các lệnh đang được thực thi, do đó, nếu một người gõ 'du', 'df', 'ping', v.v. trong vỏ của họ, nó sẽ tự động tô màu đầu ra theo thời gian thực theo định nghĩa tập tin chứa định dạng màu mong muốn. cw có hỗ trợ tô màu khớp thẻ đại diện, tô màu mã thông báo, tiêu đề / chân trang, tô màu kịch bản trường hợp, tô màu định nghĩa phụ thuộc dòng lệnh và bao gồm hơn 50 tệp định nghĩa được tạo sẵn.

Nó gần như liền mạch, nhưng một khi tôi thấy rằng ps trong shell tương tác trả về đầu ra khác nhau so sánh ps trong một đường ống.


0

Đối với Mac, bạn có thể sử dụng như được chỉ định ở đây

if [ "$TERM" = xterm ]; then TERM=xterm-256color; fi

0

Nếu bạn muốn làm cho vimmàu sắc của bạn giống như tôi, tôi khuyên bạn nên làm theo hai bước:

  1. tìm hiểu cách bật tính năng bằng cách theo liên kết sau: bật tô sáng cú pháp màu trong vi hoặc vim .

các bước chính trong liên kết:

  1. Chỉnh sửa tệp ~ / .vimrc bằng cách gõ lệnh: vi ~ / .vimrc

  2. Nối các tùy chọn sau: cú pháp trên

  3. lưu và đóng tập tin

  4. Kiểm tra nó bằng cách chạy lệnh vim : vim foo.sh

  1. tìm một bảng màu mà bạn thích và sử dụng nó Lược đồ mà tôi sử dụng: lược đồ mà tôi đang sử dụng

Khi sử dụng liên kết đến nguồn bên ngoài, bạn nên kiểm tra phần "Cung cấp ngữ cảnh cho liên kết" (Trích dẫn các phần quan trọng) của phần có liên quan của hướng dẫn: unix.stackexchange.com/help/how-to-answer
Gert van den Berg

0

Nếu bash là sự lựa chọn của bạn, tôi khuyên bạn nên dùng oh-my-bash . Nếu zsh là sự lựa chọn của bạn, tôi khuyên bạn nên oh-my-zsh . Cả hai đều hỗ trợ màu sắc của thiết bị đầu cuối của bạn và đầu ra khác nhau.


0

Tôi muốn quảng cáo một cách khiêm tốn về ấn phẩmta hoặc textattr gần đây của tôi , một thư viện và công cụ dòng lệnh nhằm mục đích thêm màu sắc và thuộc tính để làm đẹp đầu ra của chương trình của bạn dễ dàng hơn bằng cách dịch các thông số kỹ thuật có thể đọc được của con người sang mã thoát ANSI.

Ví dụ:

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

hoặc thậm chí ngắn hơn:

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

hoặc thay thế:

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

sẽ cung cấp cho bạn một cái gì đó như:

nhập mô tả hình ảnh ở đây

Hiện tại thư viện này có thể sử dụng được từ bốn ngôn ngữ C, C ++, D và Python ngoài việc sử dụng dòng lệnh từ trình bao yêu thích của bạn.

Lưu ý rằng nó không tự động làm mờ đầu ra của bất kỳ chương trình nào khác. Nó là một tiện ích để giúp bạn không phải nhớ các mã tóm tắt. Bạn chỉ cần sử dụng tên màu rõ ràng hoặc chữ viết tắt rgb cmyk w (hite) (of) f dễ nhớ của họ .

Để biết thêm chi tiết truy cập repo textattr .

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.