Одна из моих любимых Mac OS X Терминал советы включают добавление последнего запущенного процесса в заголовок терминала, используя следующий код в вашем .bashrc.
trap 'printf "\033]0; `history 1 | cut -b8-` \007"' DEBUG
Теперь я хочу изменить свое приглашение Bash по умолчанию на что-то более функциональное. Какие полезные примеры подсказок оболочки?
У меня есть сценарий ~/bin/setprompt
это выполняется моим .bashrc
, который содержит:
RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"
# Throw it all together
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "
Этот сценарий устанавливает приглашение для имени хоста, за которым следует :)
если последняя команда была успешной и :(
если последняя команда не удалась.
Я использую простой двухстрочный:
[\w]\n\u@\h>
или
[\w]\n\u@\h#
если root. Люди смотрят на меня так, будто я сумасшедший из-за использования двухстрочного приглашения, но я ненавидеть Я вижу только последнюю часть текущего пути, и я работаю с путями, которые слишком длинные, чтобы поместить все это в одну строку с областью ввода.
Однако это самая потрясающая из тех, что я когда-либо видел:
PS1='\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[0;28m\]Managing \033[1;31m\]\j\[\033[0m\]\[\033[1;30m\]/\[\033[0m\]\[\033[1;31m\]$(ps ax | wc -l | tr -d '\'' '\'')\[\033[0m\]\[\033[1;30m\] \[\033[0m\]\[\033[0;28m\]jobs.\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[0;28m\]CPU Load: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/loadavg) && echo ${temp%% *}) \[\033[0m\]\[\033[0;28m\]Uptime: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/uptime) && upSec=${temp%%.*} ; let secs=$((${upSec}%60)) ; let mins=$((${upSec}/60%60)) ; let hours=$((${upSec}/3600%24)) ; let days=$((${upSec}/86400)) ; if [ ${days} -ne 0 ]; then echo -n ${days}d; fi ; echo -n ${hours}h${mins}m)\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]$(ls -l | grep "^-" | wc -l | tr -d " ") \[\033[0m\]\[\033[0;28m\]files using \[\033[0m\]\[\033[1;31m\]$(ls --si -s | head -1 | awk '\''{print $2}'\'')\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[1;31m\]\u\[\033[0m\]\[\033[0;31m\]@\[\033[0m\]\[\033[1;31m\]\h \[\033[0m\]\[\033[1;34m\]\w\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]\t\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:. \[\033[0m\]\[\033[1;37m\]$ \[\033[0m\]'
Дать ему шанс. Это дает хорошую информацию, но на самом деле это приведет к увеличению нагрузки на ваши коробки, просто нажав Enter в приглашении!
Я поклонник командной строки Cygwin по умолчанию:
PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
или без цветов:
PS1='\n\u@\h \n\$ '
выглядит как:
username@hostname
$ ls -l
Мне нравится включать время в свое. Дает мне что-то вроде встроенного time
вокруг моих команд:
PS1="[\t \u@\h:\w]$ "
Хотя после того, как я увидел несколько из них, мне захотелось сделать свою немного умнее!
Вот мой (прокрутите вправо, чтобы увидеть более интересный фрагмент):
'-------------------------------------------------------------------------------\n${debian_chroot:+($debian_chroot)}[\w]\n\u@\h\[\033[1;33m\]\[\033[0m\]($(__git_ps1 "%s")$(parse_git_dirty))$
Вот результат:
-------------------------------------------------------------------------------
[~]
user@host()$
-------------------------------------------------------------------------------
[~/path_to_repo]
user@host(master)$
Я предпочитаю использовать несколько разрывов строки и «горизонтальную линейку», чтобы упростить сканирование буферов, и чтобы длинные имена путей не сдвигали курсор слишком далеко вправо.
В кш:
В моем .profile я установил следующую переменную (так что эта переменная устанавливается только один раз за сеанс, независимо от того, сколько su я делаю:
PCH=\>
В моем .kshrc у меня есть:
if let "${SPID:-0} != $$"; then
PCHS="$PCHS$PCH"
fi
Я становлюсь пользователем root со следующим псевдонимом, а не su (kroot - это пользователь root с оболочкой ksh вместо sh (solaris) или bash (linux):
alias root='PCH=\# su -m kroot'
alias me="PCH=\> su -m $USER"
Я также определил эти две функции:
function lprompt {
PS1=$HOST' $? $PWD '"$PCHS "
}
function sprompt {
PS1='$?":"${PWD##*/}'"$PCHS "
}
и, наконец, в конце .kshrc у меня есть:
lprompt
Все это дает мне по умолчанию автоматическую настройку конца моего приглашения, чтобы указать, являюсь ли я root (и, в свою очередь, если у меня есть родительский элемент, который был root), текущий рабочий каталог, имя хоста и статус выхода последнего процесса. sprompt удаляет имя хоста, сокращает путь до базового имени и удаляет пробелы:
g3 0 /home/jj33 > expr 1 / 0 expr: division by zero g3 2 /home/jj33 > expr 1 / 1 1 g3 0 /home/jj33 > root Password: g3 0 /home/jj33 ># me g3 0 /home/jj33 >#> ^D g3 0 /home/jj33 ># sprompt 0:jj33># me g3 0 /home/jj33 >#> sprompt 0:jj33>#>expr 1 / 0 expr: division by zero 2:jj33>#>
Псевдонимы root / me произошли от администрирования до sudo в Solaris, и старые привычки сильно умерли. Я сомневаюсь, что в наши дни кто-то реализовал бы то же самое. Быстро меняющиеся функции и существующий статус по-прежнему очень ценны для меня.
У меня есть простая подсказка, в которой используются цвета для дополнительной информации:
drewble:~$
Цвет имени хоста (в данном случае drewble) отличается на каждой машине - когда я получаю новую машину, на которой я работаю, я выбираю для нее произвольный цвет. Таким образом, когда у меня открыто много терминалов, легко определить, к какой машине они подключены по SSH, и сокращается количество ошибок, которые я делаю, находясь на неправильной машине. Кроме того, когда я делаю sudo -s
, Я поставил имя хоста заглавными буквами и закрасил двоеточие красным цветом, опять же, это уменьшает количество ошибок, давая понять, что вы действуете как root. Путь (мой домашний каталог, ~
в данном случае) имеет ярко-зеленый цвет, что помогает разделить строки вывода; если что-то создает много вывода, можно легко прокрутить вверх и посмотреть, где начинается вывод.
# Color the hostname
HOSTNAME=`hostname|sed -e 's/\..*$//'`
if [ $HOSTNAME = 'Caligula' ] || [ $HOSTNAME = 'Caligula.local' ]; then
export HOST_COLOR="\[\033[1;35m\]"
fi
if [ $HOSTNAME = 'drewble' ]; then
export HOST_COLOR="\[\033[1;34m\]"
fi
if [ $HOSTNAME = 'davinci' ]; then
export HOST_COLOR="\[\033[1;31m\]"
fi
# Color the colon red & capitalize hostname if root
COLON_COLOR='0m'
if [ ${UID} -eq 0 ]; then
COLON_COLOR='1;31m'
fi
if [ ${UID} -eq 0 ]; then
HOSTNAME="`echo $HOSTNAME|tr '[a-z]' '[A-Z]'`"
fi
# Set the actual prompt
PS1=`echo -ne "$HOST_COLOR$HOSTNAME\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`
Это не приглашение оболочки, но это настройка, которая может соответствовать духу того, что вы просите.
Я установил следующую переменную среды:
if [ -z "$PROMPT_COMMAND" ]; then
export PROMPT_COMMAND='history -a'
else
export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi
Таким образом, если у меня есть несколько терминалов, открытых через экран или что-то еще, я не потеряю историю, когда они будут менять друг друга.
export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "
Это отображает:
hostname:~
$
«Имя хоста» выделено зеленым цветом, если код возврата последней выполненной команды был «0», и красным, если он был> «0».
Похожий на ответ хаоса, Мне вроде как
\u@\h:\w\n\u@\h:\$
что дает мне
root@host-10548:/var/www/site.org
root@host-10548:$
Включив пользователя / хост в первую строку, я могу легко скопировать всю эту строку пути, когда использую SCP, или rsync для отправки файлов в этот каталог.
Для баш мне нравится
PS1 = "\ h \ d \ t \ w \ n \ u>"
что приводит к:
myserver Пн 07 сен 07:43:11 / u08
корень>
Таким образом, вы получаете имя хоста, дату и время, полный путь, а затем имя пользователя в новой строке с приглашением. Это необходимо для минимизации переноса строк в каталоги. Я весь день нахожусь в коробках и выхожу из них, поэтому все, что я могу сделать, чтобы все было в порядке, - хорошо. У меня также есть набор шпатлевки, чтобы все регистрировать. Я могу вернуться и посмотреть журналы, и точно увидеть, что я делал и когда. Также удобен для определения последовательности событий сразу в нескольких окнах терминала.
Моя обычная подсказка
\u@\h $PWD $WINDOW [$?] \$
Это дает мне текущего пользователя, текущий каталог текущего хоста (без замена $ HOME на ~), текущий screen
окно и возврат последней ошибки. Поскольку у меня обычно открыто 16 или более экранных окон, полезно знать текущее.
Моя подсказка zsh:
[andrew@hostname ~]%
Обычно он красный и белый, а текущий каталог - розовым. Если root, то он темно-серый, а имя хоста - красным. Если $?
не 0, тогда окончательный% отображается красным.
function precmd {
ERR=$?
if [ $UID -eq 0 ]; then
MYPROMPT="$(print '%{\e[1;30m%}[%{\e[0m%}')$(print '%{\e[1;31m%}%n%{\e[0m%}')@$(print '%{\e[1;31m%}%m%{\e[0m%}') $(print '%{\e[1;35m%}%3c%{\e[0m%}')$(print '%{\e[1;30m%}]%{\e[0m%}')"
else
MYPROMPT="[$(print '%{\e[1;31m%}%n%{\e[0m%}')@%m $(print '%{\e[1;35m%}%3c%{\e[0m%}')]"
fi
if [ $ERR -ne 0 ]; then
ERROR="$(print '%{\e[1;31m%}%#%{\e[0m%}') "
export PS1=$MYPROMPT$ERROR
else
export PS1="$MYPROMPT%# "
fi
export RPS1=""
}