Назад | Перейти на главную страницу

Какие информативные и полезные подсказки оболочки? (Bash, csh, ksh и т. Д.)

Одна из моих любимых 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()$ 

Когда я внутри Git хранилище:

-------------------------------------------------------------------------------
[~/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=""
}