什么是一些丰富而有用的shell提示? (Bash,csh,ksh等)

我最喜欢的Mac OS X terminal技巧之一是使用.bashrc中的以下代码将最后一个正在运行的进程添加到terminal标题中。

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

现在我正在寻找自定义我的Bash提示从默认到更多的function。 什么是一些有用的shell提示示例?

我使用一个简单的双线:

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

要么

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

如果root。 人们看着我,就像我疯狂地使用两行提示符一样,但是我讨厌只看到当前path的最后一部分,而且我工作的path太长,无法将整个事物放在同一行上input区域。

我有一个由我的.bashrc执行的脚本~/bin/setprompt ,其中包含:

 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} " 

如果最后一条命令成功,则该脚本将提示符设置为主机名后跟:)如果最后一条命令失败。

然而,这是我见过的最棒的一个:

 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\]' 

试一试。 它提供了很好的信息,但它实际上会导致您的箱子上的负载增加,只需按提示input!

我是默认的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 

我喜欢把我的时间包括在内。 在我的命令周围给我一些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)$ 

我select使用多个换行符和“水平标尺”来更容易地扫描缓冲区,所以长的path名称不会将光标向右移动太远。

在ksh:

在我的.profile中,我设置了下面的variables(所以这个variables只在每个会话中设置一次,不pipe有多less个'我是这样做的:

 PCH=\> 

在我的.kshrc中我有:

 if let "${SPID:-0} != $$"; then PCHS="$PCHS$PCH" fi 

我用以下别名成为root,而不是“su”(kroot是一个使用ksh shell而不是sh(solaris)或bash(linux)的root用户:

 alias root='PCH=\# su -m kroot' alias me="PCH=\> su -m $USER" 

我也定义了这两个function:

 function lprompt { PS1=$HOST' $? $PWD '"$PCHS " } function sprompt { PS1='$?":"${PWD##*/}'"$PCHS " } 

最后在.kshrc结尾我有:

 lprompt 

所有这些都给了我默认情况下自动设置提示的结尾,以指示我是否是root(并且反过来如果我有一个父级是root的),当前工作目录,主机名和最后进程的退出状态。 sprompt将删除主机名,将path缩小到只有基本名称,并删除空格:

 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别名是Solaris上sudo sudo前的pipe理工具,老习惯已经很难了。 我怀疑现在有谁会执行同样的事情。 瞬息万变的function和存在的状态对我来说仍然是非常宝贵的。

我有一个简单的提示,但使用颜色给一些额外的信息:

 drewble:~$ 

主机名的颜色(在本例中是drewble)在每台机器上都是不同的 – 当我得到一台新机器时,我为该机器select一种任意颜色。 这样,当我打开很多terminal时,可以很容易地告诉他们使用的是哪台机器,并通过在错误的机器上减less我犯的错误。 另外,当我做sudo -s ,我把主机名放在所有的大写字母上,然后把冒号变成红色,这样就可以通过清除你的根目录来减less错误。 path(我的主目录, ~在这种情况下)是明亮的绿色,这有助于分隔输出行; 如果产生了大量的输出,很容易向上滚动并查看输出开始的位置。

 # 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 '[az]' '[AZ]'`" 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\] "` 

这不是一个shell提示符,但它是一个定制,可能符合你所要求的精神。

我设置了以下环境variables:

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

这样,如果我有多个terminal通过屏幕或其他方式打开,我不会失去历史,当他们打破对方的变化。

  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将某些文件发送到该目录时,我可以轻松地复制整个path。

对于bash我喜欢

PS1 =“\ h \ d \ t \ w \ n \ u>”

这导致:

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

所以你得到主机名,date和时间,完整的path,然后用户名在一个新的行,提示。 这是为了尽量减less目录中的换行。 我整天都在进出箱子,所以我所能做的就是保持平稳。 我也有腻子设置logging一切。 我可以回去看看日志,看看我在做什么。 还可以方便地在一些terminal窗口中查明事件序列。

我正常的提示是

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

这给我当前用户,当前主机当前目录( 没有用$replace$ 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="" }