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

8

Один из моих любимых советов по Mac OS X Terminal заключается в добавлении последнего запущенного процесса в заголовок терминала с использованием следующего кода в вашем .bashrc .

trap 'printf "\033]0;  `history 1 | cut -b8-`  \007"' DEBUG

Теперь я пытаюсь настроить приглашение Bash по умолчанию на что-то более функциональное. Каковы некоторые полезные примеры подсказок оболочки?

Dave K
источник

Ответы:

6

Я использую простой двухслойный:

[\w]\n\u@\h>

или

[\w]\n\u@\h#

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

хаос
источник
Так что я, должно быть, безумно сумасшедший, если использую подсказку из трех строк, смеется
Иван
7

У меня есть скрипт, ~/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} "

Этот сценарий устанавливает в приглашении имя хоста, за которым следует, :)если последняя команда была успешной и :(последняя команда завершилась неудачно.

Эдди
источник
4

Это, однако, самый удивительный, который я когда-либо видел:

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 по запросу!

Глен Солсберри
источник
1
ха, очень впечатляет!
Дэйв К
Выглядит хорошо, но не работает на моей коробке freebsd :(
Евгений Ярмаш
@eugene y: Некоторые из этих путей, вероятно, отсутствуют в коробках FreeBSD ...
Глен Солсберри
Страшно выглядит, но впечатляет!
Силиконпи
3

Я болею за приглашение Cygwin bash по умолчанию:

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
spoulson
источник
2

Мне нравится включать время в моем. Дает мне что-то вроде встроенного timeвокруг моих команд:

PS1="[\t \u@\h:\w]$ "

Хотя, увидев некоторые из них, я хочу сделать свои умнее!

Глен Солсберри
источник
2

Вот мой (прокрутите вправо, чтобы увидеть более интересную часть):

'-------------------------------------------------------------------------------\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)$ 

Я предпочитаю использовать несколько разрывов строк и «горизонтальную линейку», чтобы упростить сканирование буферов, и поэтому длинные имена путей не перемещают курсор слишком далеко вправо.

Иван
источник
1

В кш:

В моем .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 созданы администрацией pre-sudo в Solaris, и старые привычки устарели. Я сомневаюсь, что кто-то может реализовать то же самое в эти дни. Функции быстрой смены и существующий статус остаются для меня очень ценными.

jj33
источник
1

У меня есть подсказка, которая проста, но использует цвета, чтобы дать некоторую дополнительную информацию:

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\] "`
Дрю Стивенс
источник
1

Это не приглашение оболочки, но это настройка, которая может соответствовать духу того, что вы просите.

Я установил следующую переменную среды:

if [ -z "$PROMPT_COMMAND" ]; then
    export PROMPT_COMMAND='history -a'
else
    export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi

Таким образом, если у меня будет несколько терминалов, открытых через экран или что-то еще, я не потеряю историю, когда они изменяют друг друга.

deinspanjer
источник
1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

Это отображает:

hostname:~
$ 

С 'hostname' зеленым, если код последней выполненной команды был '0', и красным, если он был> '0'.

jtimberman
источник
1

Подобно ответу хаоса , я вроде как

\u@\h:\w\n\u@\h:\$

что дает мне

root@host-10548:/var/www/site.org
root@host-10548:$

Включив user / host в первую строку, я могу легко скопировать всю строку пути, когда использую SCP , или rsync для отправки некоторых файлов в этот каталог.

Zoredache
источник
Отличная идея. Я вижу, что полный путь scp очень полезен. Вторая строка может быть улучшена добавлением времени, как предложено gms8994.
Дэйв К
0

Для баш мне нравится

PS1 = "\ h \ d \ t \ w \ n \ u>"

что приводит к:

myserver Mon Sep 07 07:43:11 / u08
root>

Таким образом, вы получите имя хоста, дату и время, полный путь, а затем имя пользователя в новой строке с подсказкой. Это должно минимизировать перенос строки в каталогах. Я весь день в ящиках, поэтому все, что я могу сделать - это хорошо. У меня также есть набор шпатлевки для регистрации всего. Я могу вернуться и посмотреть журналы, и точно увидеть, что я делал, когда. Также удобно для выяснения последовательности событий в нескольких окнах терминала одновременно.

Рональд Поттол
источник
0

Моя нормальная подсказка

\u@\h $PWD $WINDOW [$?] \$

Это дает мне текущего пользователя, текущий каталог текущего хоста ( без замены $ HOME на ~), текущее screenокно и возврат последней ошибки. Поскольку у меня обычно открыто 16 или более окон, знание текущего полезно.

staticsan
источник
0

Мой зш подскажу:

[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=""
}
theotherreceive
источник