Daria 14.12.2010 19:04

СкриптыRapid Prompt Switcher

Частенько при работе в консоли, прыгая из одной директории в другую, prompt разрастает под тяжестью пути, что мешает прилично работать. В такие моменты очень хочется на некоторое время заменить приглашение командной строки аскетичным молчанием. Что-либо жутко неудобное - прекрасный мотиватор для поиска быстрых решений.

Посему, азартом и мотивацией так приятно разбавить такие полезные, но сухие вещи, как самообразование. Собственно так я начала знакомство с функциями в Bash (и мы стали подружками), пересеклась с извращёнными подобиями массивов (и мы обменялись телефонами), так вот что вышло:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# prompt - меняет приглашение командной строки
# вызов: prompt <индекс>
# v 0.2
prompt(){
# количество приглашений
prompts=3
# диетическое приглашение
PS<1>='\$ ' # foo<bar> нотация извращённых словарей в Bash
# с сочными красками
PS<2>='\<\033<32m\>\h:\<\033<35m\>\w>\<\033<0;0m\>'
# третья смешная опция
PS<3>='\<\033<0;35m\>\u\<\033<1;35m\>@\<\033<0;35m\>\h\<\033<32m\>:\w/\$\<\033<0;0m\> '

#смена приглашений работает как револьвер, просто и циклично.
if < $1 > # существует-ли аргумент у функции?
then prompt_type=$1
else if < -z $prompt_type > # проверим инициализирована-ли $prompt_type
then prompt_type=0
fi
let prompt_type=($prompt_type%$prompts)+1 # % это, кстати, деление с остатком. а let
#
fi
PS1=${PS<$prompt_type>} # собственно переменная окружения $PS1 и
# отвечает за приглашение шелла. получить же
# элемент из массива можно так: ${foo</bar><bar>}
}</bar>



Эту функцию можно, к примеру, записать в файл .bash_function, а затем добавить инклюд в .bashrc:
. .bash_functions


UPT: заменила quotes


Тэги: prompt баш консоль
+ 9 -
Похожие Поделиться

saver 14.12.2010 19:19 #
(С) Взял где-то давно в интернете хорошую функцию, которая сокращает длинну промта и показывает только последние символы (функцию можно поправить для себя, самое простое вместо 9 написать например 100). Я использую двустрочный промт, по этому у меня ограничивается длинной экрана =)

function pre_prompt
{
newPWD="${PWD}"
let promptsize=$(echo -n "??< $newPWD >}?" | wc -c | tr -d " ")
width=$COLUMNS
let fillsize=${width}-${promptsize}-9
let helping=$fillsize
fill=""

while < "$fillsize" -gt "0" >
do
fill="${fill}?"
let fillsize=${fillsize}-${promptsize}
done

if < $helping == $fillsize >
then
let cutt=3-${fillsize}
newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cutt\}\)\(.*\)/\2/")"
fi
}

# Set prompt colour
if < `id -u` -eq 0 >
then
cText="${LightRed}"
cBorder="${Red}"
else
# cText="${LightCyan}"
cText="${white}"
cBorder="${white}"
fi
PROMPT_COMMAND=pre_prompt

# Display Prompt
PS1="${cBorder}??<${cText} \t ${cBorder}>?< ${cText}\$newPWD${cBorder} >\${fill}?\n${cBorder}?${cBorder}?? ${white}$normal"

Получим
??< 21:14:35 >?< ...ng/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long >?
т.е. первые папки отбрасываются, если не умещаемся на экран
kvap 14.12.2010 20:23 #
man bash
/DIRTRIM
alff31 14.12.2010 19:27 #
А у меня zsh показывает две верхние папки. Рекомендую.
other.bigmouse 14.12.2010 20:15 #
А я пользуюсь MC и не напрягаюсь))
knicefire 14.12.2010 23:23 #
подсмотрел в LiveCD ArchBang PS1, с некоторыми модификациями делюсь - вдруг пригодится кому-то.

PS1='\e<01;31m??<\e<01;35m`date "+%D %T"`\e<01;31m>??<\e<00;37m${HOSTNAME%%.*}@\u\e<01;32m>: \w\e<01;31m\n\e<01;31m???\e<01;36m$ \e<00m'
Daria 15.12.2010 21:49 #
необычный ход - hostname@user
knicefire 15.12.2010 21:52 #
:) можно и наоборот, это уже я перековеркал
lava 15.12.2010 01:31 #
$ cat /etc/bash.bashrc.local
#!/bin/sh
#

if < `whoami` = 'root' >
then
PS1="\<\033<31m\>#\<\033<0m\> "
else
PS1="$ "
fi

Мой личный выбор после пяти лет с линуксом. Если надо - pwd в помощь. А в большинстве случаев почему-то даже не проверяю где я, не смотря на то, что открыта куча консолей.
Daria 15.12.2010 21:46 #
тоже самое:
PS1="\$ "

в man bash в секции PROMPTING, есть список специальных символов, вот что там:

\$ if the effective UID is 0, a #, otherwise a $
lava 15.12.2010 21:59 #
Этого не знал, спасибо. Однако:

1) Но не красненький же! =)
2) Тестдрайв
$ su
Password:
# PS1=\$
$
$whoami
root
$PS1="\$"
$whoami
root
Daria 15.12.2010 22:11 #
hmmm... вот так будет работать:

PS1='\$ '
firegurafiku 23.03.2011 12:29 #
Помнится, в zsh можно было выделить путь в т.н. "правое" приглашение (переменная RPROMPT), которое само пропадало, когда до него допечатаешь.