от RED(27-07-2000)

рейтинг (43)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

  1. Променяне на bash промпта
  2. Добавяне на псевдоними (alias)
  3. Променливата PROMPT_COMMAND
  4. Цветове за Bash
  5. Примери

Ако не знаете какво е това 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.



<< Linux в BBC (част 1) | Преглед на мрежовите възможности на Линукс >>