什么是有用且有用的shell提示?(bash,csh,ksh等)


8

我最喜欢的Mac OS X 终端提示之一涉及使用.bashrc中的以下代码将最后运行的进程添加到终端标题中。

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

现在,我希望将我的Bash提示从默认设置自定义为更实用的功能。有哪些有用的shell提示示例?

Answers:


6

我使用一个简单的两层:

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

要么

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

如果是根。人们看着我,就像我为使用两行提示而疯狂一样,但是我讨厌只看到当前路径的最后一部分,而我使用的路径太长,无法将整个内容与输入区域。


因此,使用3行提示时,我一定对frakin疯狂。
伊万,2009年

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
哈哈,非常令人印象深刻!
戴夫K,2009年

看起来不错,但是在我的freebsd盒子上不起作用:(
Eugene Yarmash

@eugene y:其中一些路径可能不在FreeBSD上……
Glen Solsberry 2010年

吓人,但令人印象深刻!
Siliconpi 2011年

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

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

在ksh中:

在我的.profile中,我设置了以下变量(因此,无论我执行多少次“ su”操作,此变量每次会话都只会设置一次):

PCH=\>

在我的.kshrc中,我有:

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

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

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别名来自Solaris上的pre-sudo管理,并且旧习惯很难改掉。我怀疑这些天有人会实施完全相同的事情。瞬息万变的功能和存在的状态对我仍然很有价值。


1

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

drewble:~$ 

主机名的颜色(在这种情况下为双色)在每台计算机上都不相同-当我得到要使用的新计算机时,我为该计算机选择了任意颜色。这样,当我打开许多终端时,可以很容易地知道将它们连接到哪台计算机,并减少由于使用错误的计算机而造成的错误。另外,当我这样做时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

它不是shell提示,而是一种自定义设置,可能符合您的要求。

我设置以下环境变量:

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

这样,如果我有多个通过屏幕或其他任何方式打开的终端,那么当它们相互更改时,我将不会丢失任何历史记录。


1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

显示:

hostname:~
$ 

如果最后执行的命令返回代码为“ 0”,则“ hostname”为绿色,如果>“ 0”,则为红色。


1

类似于混乱的答案,我有点喜欢

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

这给了我

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

通过在第一行包含用户/主机,当我使用SCPrsync将一些文件发送到该目录时,我可以轻松复制整个路径行。


好主意。我可以看到完整的scp路径非常有用。第二行可以通过添加建议的时间来改进,例如gms8994。
戴夫K,

0

对于bash我喜欢

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

结果是:

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

因此,您将在提示符下获得主机名,日期和时间,完整路径,然后在新行中获得用户名。那是为了最小化目录中的换行。我整天都在开箱即用,所以我能做的一切都很好。我还设置了腻子以记录所有内容。我可以回头查看日志,并确切地看到我当时在做什么。方便地一次在多个终端窗口中找出事件的顺序。


0

我的正常提示是

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

这给了我当前用户,当前主机当前目录(将$ HOME替换为〜),当前screen窗口和最后一个错误返回。由于我通常打开16个或更多的屏幕窗口,因此了解当前的窗口很有用。


0

我的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=""
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.