LINUX-BG   Адрес : http://www.linux-bg.org
Трикове за Bash
От: RED
Публикувана на: 27-07-2000
Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=321561786
  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) | Преглед на мрежовите възможности на Линукс >>

Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук, но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора, както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Линукс за българи ЕООД 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 1 wallclock secs ( 0.17 usr + 0.02 sys = 0.19 CPU)