- Променяне на bash промпта
- Добавяне на псевдоними (alias)
- Променливата PROMPT_COMMAND
- Цветове за Bash
- Примери
Ако не знаете какво е това Bash, а искате
да
научите повече е добре да прочете тази статия "Писане
на скриптове за BASH шел".
Променяне на bash промпта
Преди да започнем да променяме bash промптa е
добре
да запазим старата му стойност, за всеки случай.
Стойността на промптa се пази от променливата на
обкръжението PS1. За
да запазим тази стойност е добре да я присвоим на
друга променлива. Това става по следният начин:
[slaff@atlantis slaff]$ SAVE=$PS1
Сега старата стойност на PS1 променливата се
пази от променливата SAVE. PS1 променливата определя
как да изглежда нашият промпт. Нека да направим
първата промяна и да присвоим на PS1 променливата
стойност "command>":
[slaff@atlantis slaff]$ PS1="command>"
В резултат на тази опреция ще имаме следния
промпт:
command>
Сега нека се опитаме да възстановим стария
промпт
command> PS1=$SAVE
[slaff@atlantis slaff]$
Bash позволява използването и на специални
символи, който да стоят в нашият промпт. Ето и
някой от тези специални символи:
\a предизвиква пиукане на спикера
\d показва дата във формат "Ден от седмицата"
"Месец" Ден от месеца" (примерно "Tue
May 26")
\h името на хоста до първата точка (пр. хост
subdomain.domain.org -> името на хоста до първата
точка =
subdomain)
\H цялото име на хоста
\n нов ред
\r нов ред
\s името на шелът, който използваме
\t времето за 24 часа в следния формат HH:MM:SS
(HH-час,
MM-минути, SS-секунди)
\T време за 12 часа в следния формат HH:MM:SS
\u потребителското име (username)
\v версия на bash шела(примерно 2.00)
\w пълният път до текущата директория
\W само името на текущата директория
\! коя подред е тази команда
\nnn oсмично число
\\ обратно наклонена черта (т.е. \)
\[ начало на последователност от "контролни
символи"
\] край на последователност от "контролни
символи"
Промптът, който използвахме до момента е
съставен от следните специални символи:
\u (потребителско име) т.е slaff
\h името на хоста до първата точка т.е atlantis
\W името на текущата директория т.е slaff
[slaff@atlantis slaff]$ PS1="\u@\h \W> "
slaff@atlantis slaff> ls
bin mail
slaff@atlantis slaff>
Този промпт е най-често използван в повечето Linux
дистибуции.
Нека сега да променим промпта така, че да показва
и часът:
slaff@atlantis slaff> PS1="[\t][\u@\h:\w]\$ "
[21:52:01][slaff@atlantis:~]$ ls
bin mail
Ако не искаме всеки път да променяме промта, а
той да се променя още с влизането ни, трябва да
променим файлът .bash_profile, който се намира
във нашата главна директория. Ако такъв файл не
съществува трябва да го създадем. Ако имате root
права и
искате да промените на всички потребители
промпта редактирайте файлът /etc/profile
или
/etc/bashrc . Имайте предвид, че този файл
може да се намира на друго място за различните Linux
дистрибуции. Самото редактране се състои в
добавянето на този ред
PS1="[\t][\u@\h:\w]\$ "
Добавяне на псевдоними (alias)
Alias представлява псевдоним(алтернативно име) на
дадена команда
или последователности от команди и се използва
за улеснение. Ако например искате всеки път
вместо да пишете командата "cd /usr/local/share/"
да напишете само GO трябва да направите следния
псевдоним
alias GO="cd /usr/local/share/"
За да не го пишете всеки път този псевдним е
най-добре
да го добавите във файлът .bash_profile
Променливата PROMPT_COMMAND
Прменливата PROMPT_COMMAND се показва или изпълнява
преди да се покаже самият промпт. Разгледайте
следният пример:
[21:55:01][slaff@atlantis:~] PS1="[\u@\h:\w]\$ "
[slaff@atlantis:~] PROMPT_COMMAND="echo 2155"
2155
[slaff@atlantis:~] d
bin mail
2156
[slaff@atlantis:~]
Това което се случва е да се показва числото 2155
винаги преди показването на самият ред.
Проблемът тук е, че 2155 не се показава на същия ред
на който се показва и промпта. За целта ще
използваме опцията -n на командата echo.
[slaff@atlantis:~] PROMPT_COMMAND="echo -n 2155"
2156[slaff@atlantis:~]$
2156[slaff@atlantis:~]$ d
bin mail
Вече нещата изглеждат по-добре.
Сега ще ви покажа как можете да накарате промта
да показва размера който заема текущата
директория.
Запишете следния Bash скрипт в /usr/local/bin
директорията под името lsbytesum. Директория може и
да е друга, стига да е посочена в променливата
PATH.
___________________________________________________
#!/bin/bash
# lsbytesum - sum the number of bytes in a directory
listing
TotalBytes=0
for Bytes in $(ls -l | grep "^-" | cut -c30-41)
do
let TotalBytes=$TotalBytes+$Bytes
done
TotalMeg=$(echo -e "scale=3 \n$TotalBytes/1048576
\nquit" | bc)
echo -n "$TotalMeg"
___________________________________________________
Направете този файл изпълним.
Променяме промпта:
[2158][slaff@atlantis:~]$ PS1="[\u@\h:\w
(\$(lsbytesum) Mb)]\$ "
[slaff@atlantis:~ (0 Mb)]$ cd /bin
[slaff@atlantis:/bin (4.498 Mb)]$
Това е. Вече имаме промпт, който показава колко
е големината на текущата директория.
Нищо не пречи да се създадат и други промптове.
Опитайте сами да създадете нов.
Цветове за Bash
Може би сте забелязали цветните съобщения при
стартирането на RedHat.
Писането на цветни съобщения е елементарно.
Нека да си направим наше цветно съобщение.
Опитайте следния пример:
echo -e "\033[41;33;1m Welcome to Linux\033[m"
Тази команда ще изпечата "Welcome to Linux" с
жълти букви на червен фон. Забележете, че текста е
обграден от "\033[bg;fg;1m \033[m". Числото 41
указва,
че фонът на буквите трябва да е червен, а 33
указва, че цвета на буквите трябва да е жълт.
Кодовете на цветовете са следните:
За цвят на фона: 30=черно, 31=червено, 32=зелено,
33=жълто,
34=синьо, 35=пурпурно, 36=тюркоазено, 37=бяло
За цвят на буквите: 0=прозрачно, 40=черно,
41=червено,
42=зелено, 43=жълто, 44=синьо 45=пурпурно,
46=тюркоазено,
47=бяло
Ако искаме да променим нашия надпис и да го
направим с бели букви на син фон трябва да
напишем следното
echo -e "\033[44;37;1m Welcome to Linux\033[m"
Ето и една примерна програма за Slackware
дистрибуцията на Linux
___________________________________________________
#/bin/bash
version="`cat /etc/slackware-version`"
echo -e "\033[41;33;1m Welcome to Slackware
$version\033[m"
___________________________________________________
Освен цветни съобщения може да имате и цветен
промпт. Оцветяването на промпта става по същия
начин както и нормален текст с тази разлика,
че трябва да заградим текста с \[\033[ и
m\]. За да получим светло син промпт
трябва да направим следното
PS1="\[\033[1;34m\][\$(date
+%H%M)][\u@\h:\w]$\[\033[0m\] "
Ето и кодовете за цвят на буквите:
Черно 0;30 Тъмно сиво 1;30
Синьо 0;34 Светло синьо 1;34
Зелено 0;32 Светло зелено 1;32
Цикламено 0;36 Светло цикламено 1;36
Червено 0;31 Светло червено 1;31
Пурпурно0;35 Светло пурпурно 1;35
Кафяво 0;33 Жълто 1;33
Светло сиво 0;37 Бяло 1;37
Ако искате вашият промпт да бъде със светло синьо
на червен фон трябва да зиползвате следната
комбинация:
\[\033[44;1;31m\]
или
\[\033[44m\]\[\033[1;31m\]
Допълнителни кодове:
4: Подчертан, 5: Мигащ, 8: Неведидим
Ето и един примерен скрипт
___________________________________________________
function elite
{
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
case $TERM in
xterm*)
local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
local TITLEBAR=""
;;
esac
local GRAD1=$(tty|cut -d/ -f3)
PS1="$TITLEBAR\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\u$GRAY@$CYAN\h\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\#$GRAY/$CYAN$GRAD1\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\
$LIGHT_CYAN)$CYAN-$GRAY-\
$LIGHT_GRAY\n\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\$$GRAY:$CYAN\w\
$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY "
PS2="$LIGHT_CYAN-$CYAN-$GRAY-$LIGHT_GRAY "
}
___________________________________________________
Не е много лесно да се помнят кодовете на
отделните цветове затова може да си помогнете
със следния скрипт:
___________________________________________________
#!/bin/bash
#
# This file echoes a bunch of colour codes to the
terminal to demonstrate
# what's available. Each line is one colour on black
and gray
# backgrounds, with the code in the middle. Verified
to work on white,
# black, and green BGs (2 Dec 98).
#
echo " On Light Gray: On Black:"
echo -e "\033[47m\033[1;37m White \033[0m\
1;37m \
\033[40m\033[1;37m White \033[0m"
echo -e "\033[47m\033[37m Light Gray \033[0m\
37m \
\033[40m\033[37m Light Gray \033[0m"
echo -e "\033[47m\033[1;30m Gray \033[0m\
1;30m \
\033[40m\033[1;30m Gray \033[0m"
echo -e "\033[47m\033[30m Black \033[0m\
30m \
\033[40m\033[30m Black \033[0m"
echo -e "\033[47m\033[31m Red \033[0m\
31m \
\033[40m\033[31m Red \033[0m"
echo -e "\033[47m\033[1;31m Light Red \033[0m\
1;31m \
\033[40m\033[1;31m Light Red \033[0m"
echo -e "\033[47m\033[32m Green \033[0m\
32m \
\033[40m\033[32m Green \033[0m"
echo -e "\033[47m\033[1;32m Light Green \033[0m\
1;32m \
\033[40m\033[1;32m Light Green \033[0m"
echo -e "\033[47m\033[33m Brown \033[0m\
33m \
\033[40m\033[33m Brown \033[0m"
echo -e "\033[47m\033[1;33m Yellow \033[0m\
1;33m \
\033[40m\033[1;33m Yellow \033[0m"
echo -e "\033[47m\033[34m Blue \033[0m\
34m \
\033[40m\033[34m Blue \033[0m"
echo -e "\033[47m\033[1;34m Light Blue \033[0m\
1;34m \
\033[40m\033[1;34m Light Blue \033[0m"
echo -e "\033[47m\033[35m Purple \033[0m\
35m \
\033[40m\033[35m Purple \033[0m"
echo -e "\033[47m\033[1;35m Pink \033[0m\
1;35m \
\033[40m\033[1;35m Pink \033[0m"
echo -e "\033[47m\033[36m Cyan \033[0m\
36m \
\033[40m\033[36m Cyan \033[0m"
echo -e "\033[47m\033[1;36m Light Cyan \033[0m\
1;36m \
\033[40m\033[1;36m Light Cyan \033[0m"
___________________________________________________
Примери
По надолу е посочен доста интересен промпт който
си сменя цветовете в зависимост от натоварването
на системата.
___________________________________________________
#!/bin/bash
# "hostloadcolour" - 17 October 98, by Giles
#
# The idea here is to change the colour of the host
name in the промпт,
# depending on a threshold load value.
# THRESHOLD_LOAD is the value of the one minute load
(multiplied
# by one hundred) at which you want
# the промпт to change from COLOUR_LOW to
COLOUR_HIGH
THRESHOLD_LOAD=200
COLOUR_LOW='1;34'
# light blue
COLOUR_HIGH='1;31'
# light red
function промпт_command {
ONE=$(uptime | sed -e "s/.*load average: \(.*\...\),
\(.*\...\), \(.*\...\)/\1/"
-e "s/ //g")
# Apparently, "scale" in bc doesn't apply to
multiplication, but does
# apply to division.
ONEHUNDRED=$(echo -e "scale=0 \n $ONE/0.01 \nquit \n"
| bc)
if [ $ONEHUNDRED -gt $THRESHOLD_LOAD ]
then
HOST_COLOUR=$COLOUR_HIGH
# Light Red
else
HOST_COLOUR=$COLOUR_LOW
# Light Blue
fi
}
function hostloadcolour {
PROMPT_COMMAND=промпт_command
PS1="[$(date +%H%M)][\u@\[\033[\$(echo -n
\$HOST_COLOUR)m\]\h\[\033[0m\]:\w]$ "
}
___________________________________________________
Тази статия е кратък превод на Bash-Prompt-HOWTO
Посочените примери и много други може да откриете на
адрес http://bash.current.nu.