如何在KornShell中自定义显示提示符以显示主机名和当前目录?

13

我正在Solaris上使用KornShell(ksh),目前我的PS1环境变量是:

PS1="${HOSTNAME}:\\\${PWD##*/} \$ "

这样提示符将显示:hostname:directory $

换句话说,我想要显示主机名和当前目录的名称,例如tmp~public_html等等。以上代码中使用了一些特殊字符来达到此效果。

7个回答

21

通过阅读ksh命令的手册页,您想要:

PS1="${HOSTNAME}:\${PWD##*/} \$ "

在SunOS 5.8上的默认ksh进行测试。


3
我好奇##*/是否是一种常见的技巧,并发现了这个网站http://cfaj.freeshell.org/shell/commands/。它还有一些其他有用的Shell技巧;) - Rudi Bierach

13

好的,虽然有点老,而且有点晚了,但这是我在Kornshell中使用的:

PS1='$(print -n "`logname`@`hostname`:";if [[ "${PWD#$HOME}" != "$PWD" ]] then; print -n "~${PWD#$HOME}"; else; print -n "$PWD";fi;print "\n$ ")'

这将创建一个与BASH中PS1="\u@\h:\w\n$ "等效的提示符。

例如:

qazwart@mybook:~
$ cd bin
qazwart@mybook:~/bin
$ cd /usr/local/bin
qazwart@mybook:/usr/local/bin
$ 

我喜欢使用两行提示符,因为有时我的目录名非常长,它们会占用很多命令行空间。如果你想要一个单行提示符,只需在最后一个print语句中省略"\n"即可:

PS1='$(print -n "`logname`@`hostname`:";if [[ "${PWD#$HOME}" != "$PWD" ]] then; print -n "~${PWD#$HOME}"; else; print -n "$PWD";fi;print "$ ")'

这相当于在BASH中的PS1="\u@\h:\w$ "

qazwart@mybook:~$ cd bin
qazwart@mybook:~/bin$ cd /usr/local/bin
qazwart@mybook:/usr/local/bin$ 

设置Kornshell提示符不像设置BASH提示符那样简单,但你可以从中得到灵感。只需编写一个 PS1 脚本,Kornshell 就会执行它。


针对 Solaris 和其他 较旧版本的 Kornshell

我发现上述方法在 Solaris 上不起作用。相反,您将不得不使用真正的 hackish 方法...

  • 在您的.profile文件中,请确保设置了ENV="$HOME/.kshrc"; export ENV。这个很可能已经为您设置好了。

  • 在您的.kshrc文件中,您需要做两件事:

    1. 定义一个名为_cd的函数。此函数将切换到指定的目录,然后根据当前工作目录设置您的 PS1 变量。
    2. 设置别名cd以运行_cd函数。

以下是 .kshrc 文件的相关部分:

function _cd {
   logname=$(logname)   #Or however you can set the login name
   machine=$(hostname)  #Or however you set your host name
   $directory = $1
   $pattern = $2        #For "cd foo bar"

   #
   # First cd to the directory
   # We can use "\cd" to evoke the non-alias original version of the cd command
   #
   if [ "$pattern" ]
   then
       \cd "$directory" "$pattern"
   elif [ "$directory" ]
   then
       \cd "$directory"
   else
       \cd
   fi

   #
   # Now that we're in the directory, let's set our prompt
   #

   $directory=$PWD
   shortname=${directory#$HOME}  #Possible Subdir of $HOME

   if [ "$shortName" = "" ]  #This is the HOME directory
   then
        prompt="~$logname"   # Or maybe just "~". Your choice
   elif [ "$shortName" = "$directory" ] #Not a subdir of $HOME
   then
        prompt="$directory"
   else
        prompt="~$shortName"
   fi
   PS1="$logname@$hostname:$prompt$ "  #You put it together the way you like
}

alias cd="_cd"

这将把你的提示符设置为等效的BASH PS1="\u@\h:\w$ "。它并不漂亮,但它能用。


好的。已添加。 - David W.
谢谢:稍微缩短一下就是PS1='$(print -n "logname@hostname:"; [[ "${PWD#$HOME}" != "$PWD" ]] && print -n "~${PWD#$HOME}" || print -n "$PWD";print "\n$ ")' - user1708042

3

在你的 .kshrc 文件中,将环境变量设置为 ENV=~/.kshrc:

function _cd {
  \cd "$@"
  PS1=$(
    print -n "$LOGNAME@$HOSTNAME:"
    if [[ "${PWD#$HOME}" != "$PWD" ]]; then
      print -n "~${PWD#$HOME}"
    else
      print -n "$PWD"
    fi
    print "$ "
  )
}

alias cd=_cd

cd "$PWD"

Brad

1
HOST=`hostname`
PS1='$(print -n "[${USER}@${HOST%%.*} ";[[ "$HOME" == "$PWD" ]] && print -n "~" ||([[ "${PWD##*/}" == "" ]] && print -n "/" || print -n "${PWD##*/}");print "]$")'

1
PS1=`id -un`@`hostname -s`:'$PWD'$

只提供代码作为答案是不被鼓励的,因为它们并没有解释它们如何解决问题。请更新您的答案以解释它如何改进其他已经被接受和赞成的答案。此外,这个问题已经存在8年了,您的努力将更受到那些有最近未回答问题的用户的欣赏。请查看如何写好答案 - FluffyKitten

-2

如果你在两个shell之间工作,主要使用ksh和bourne sh,并且希望在命令行上显示目录跟踪,则可以在ksh中轻松替换PWD,如果你使用/usr/xpg4/bin/sh作为你的sh SHELL,那么它也可以在那里使用。


-3

1
抱歉,它不能按照您输入的方式工作。我相当确定您输入的是BASH语法。谢谢。 - daveslab
2
那个提示行在OpenBSD 6 ksh上产生了更或多或少的预期结果。我自己使用PS1="\h:\W"。 - Sue Spence
1
在我的ksh上也可以运行。 - Asherah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接