我最喜欢的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="" }