If you’ve ever used a GNUGentoo or FuntooLinux variant, or a live version of any of them, you may have noticed their eye-catching colorful terminal or console. Whether you’re on a virtual console or one of KDE, GNOME, XFCE, LXDE terminal apps.
When I’ve migrated from Funtoo to FreeBSD, the one thing that I’ve missed so badly was its colorful terminal. The nice thing about these colors is taht they always give you some valuable hints, e.g., currently you’re root user or a regular user, the file is a symlink (Symbolic link), executable or just a regular file.
Well, it’s pretty easy to have your own colorful terminal or console, once you’ve found out how Gentoo and Funtoo did that. Fortunately, it works on *BSD and all other Linux distros as well. So, stay with me and I’ll describe the process in the following.
OK! before we continue, let’s say we have the user babaei and the defualt root account on our distro which we want to enable the colorful terminal or console for.
1. Before we proceed any further, we need to ensure that if we have Bash installed:
$ bash --version
If you already have Bash installed , you should see something similar to the following on the command output:
GNU bash, version 4.2.42(0)-release (i386-portbld-freebsd9.1)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
If you don’t have Bash installed, you can install it from Ports on FreeBSD easily:
$ cd /usr/ports/shells/bash
$ make config-recursive
$ make install clean
2. Create or replace both ~/.bashrc and ~/.dir_colors files with the following content, for both babaei and root users:
# /etc/bash/bashrc## This file is sourced by all *interactive* bash shells on startup,# including some apparently interactive shells such as scp and rcp# that can't tolerate any output. So make sure this doesn't display# anything or bad things will happen !# Test for an interactive shell. There is no need to set anything# past this point for scp and rcp, and it's important to refrain from# outputting anything in those cases.if[[ $- != *i* ]] ; then# Shell is non-interactive. Be done now!returnfi# Bash won't get SIGWINCH if another process is in the foreground.# Enable checkwinsize so that bash will check the terminal size when# it regains control. #65623# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)shopt -s checkwinsize
# Enable history appending instead of overwriting. #139609shopt -s histappend
# Change the window title of X terminals case${TERM} in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix) PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"' ;;
screen) PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\033\\"' ;;
esacuse_color=false
# Set colorful PS1 only on colorful terminals.# dircolors --print-database uses its own built-in database# instead of using /etc/DIR_COLORS. Try to use the external file# first to take advantage of user additions. Use internal bash# globbing instead of external grep binary.safe_term=${TERM//[^[:alnum:]]/?}# sanitize TERMmatch_lhs=""[[ -f ~/.dir_colors ]]&& match_lhs="${match_lhs}$(<~/.dir_colors)"[[ -f /etc/DIR_COLORS ]]&& match_lhs="${match_lhs}$(</etc/DIR_COLORS)"[[ -z ${match_lhs}]]\
&& type -P dircolors >/dev/null \
&& match_lhs=$(dircolors --print-database)[[$'\n'${match_lhs}== *$'\n'"TERM "${safe_term}* ]]&& use_color=true
if${use_color} ; then# Enable colors for ls, etc. Prefer ~/.dir_colors #64489if type -P dircolors >/dev/null ; thenif[[ -f ~/.dir_colors ]] ; then eval $(dircolors -b ~/.dir_colors)elif[[ -f /etc/DIR_COLORS ]] ; then eval $(dircolors -b /etc/DIR_COLORS)fifiif[[${EUID}==0]] ; then PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] 'else PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] 'fi CLICOLOR="YES"; export CLICOLOR
LSCOLORS="ExGxFxdxCxDxDxhbadExEx"; export LSCOLORS
#alias ls='ls --color=auto'#alias grep='grep --colour=auto'elseif[[${EUID}==0]] ; then# show root@ when we don't have colors PS1='\u@\h \W \$ 'else PS1='\u@\h \w \$ 'fifi# Try to keep environment pollution down, EPA loves us.unset use_color safe_term match_lhs
######### Configuration file for dircolors, a utility to help you set the# LS_COLORS environment variable used by GNU ls with the --color option.## You can copy this file to .dir_colors in your $HOME directory to override# the system defaults.# Below, there should be one TERM entry for each termtype that is colorizableTERM ansi
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM Eterm
TERM gnome
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM putty
TERM rxvt
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM screen
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM vt100
TERM xterm
TERM xterm-256color
TERM xterm-color
TERM xterm-debian
# Below are the color init strings for the basic file types. A color init# string consists of one or more of the following numeric codes:# Attribute codes:# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed# Text color codes:# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white# Background color codes:# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=whiteNORMAL 00# global default, although everything should be something.FILE 00# normal fileDIR 01;34# directoryLINK 01;36# symbolic link. (If you set this to 'target' instead of a# numerical value, the color will match the file pointed to)FIFO 40;33# pipeSOCK 01;35# socketDOOR 01;35# doorBLK 40;33;01# block device driverCHR 40;33;01# character device driverORPHAN 01;05;37;41# orphaned syminksMISSING 01;05;37;41# ... and the files they point to# This is for files with execute permission:EXEC 01;32# List any file extensions like '.gz' or '.tar' that you would like ls# to colorize below. Put the extension, a space, and the color init string.# (and any comments you want to add after a '#').cmd 01;32# executables (bright green).exe 01;32.com 01;32.btm 01;32.bat 01;32.sh 01;32.csh 01;32.tar 01;31# archives / compressed (bright red).tgz 01;31.arj 01;31.taz 01;31.lzh 01;31.zip 01;31.z 01;31.Z 01;31.gz 01;31.bz2 01;31.bz 01;31.tbz2 01;31.tz 01;31.deb 01;31.rpm 01;31.rar 01;31 # app-arch/rar.ace 01;31 # app-arch/unace.zoo 01;31 # app-arch/zoo.cpio 01;31 # app-arch/cpio.7z 01;31 # app-arch/p7zip.rz 01;31 # app-arch/rzip.jpg 01;35# image formats.jpeg 01;35.gif 01;35.bmp 01;35.ppm 01;35.tga 01;35.xbm 01;35.xpm 01;35.tif 01;35.tiff 01;35.png 01;35.mng 01;35.xcf 01;35.pcx 01;35.mpg 01;35.mpeg 01;35.m2v 01;35# MPEG-2 Video only.avi 01;35.mkv 01;35# Matroska (http://matroska.org/).ogm 01;35# Ogg Media File.mp4 01;35# "Offical" container for MPEG-4.m4v 01;35# MPEG-4 Video only.mp4v 01;35# MPEG-4 Video only.mov 01;35# Quicktime (http://developer.apple.com/qa/qtw/qtw99.html).qt 01;35# Quicktime (http://developer.apple.com/qa/qtw/qtw99.html).wmv 01;35# Windows Media Video.asf 01;35# Advanced Systems Format (contains Windows Media Video).rm 01;35# Real Media.rmvb 01;35# Real Media Variable Bitrate.flc 01;35# AutoDesk Animator.fli 01;35# AutoDesk Animator.gl 01;35.dl 01;35.pdf 00;32# Document files.ps 00;32.txt 00;32.patch 00;32.diff 00;32.log 00;32.tex 00;32.doc 00;32.mp3 00;36# Audio files.wav 00;36.mid 00;36.midi 00;36.au 00;36.ogg 00;36.flac 00;36.aac 00;36
Note: I’ve borrowed these files from a Funtoo installation with a little modification.
3. Finally, you need to make Bash the defualt shell on your system for both babaei and root users:
Note: On *BSD operating systems usually the path to bash executable is /usr/local/bin/bash, due to not being part of the base system. Anyway, it may be different on different Linux distributions, e.g., /usr/bin/bash or /bin/bash.
4. You need to run a new instance of Bash to see the results (e.g. by logging in on a virtual console, opening a new terminal window or tab, or running the command bash).