13

我在 Solaris 上使用 KornShell (ksh),目前我的 PS1 env var 是:

PS1="${HOSTNAME}:\${PWD} \$ "

并且提示显示:hostname:/full/path/to/current/directory $

但是,我希望它显示:hostname:directory $

换句话说,我怎样才能只显示主机名和当前目录的名称,即tmp~public_html等?

4

7 回答 7

20

通过阅读您想要的ksh 手册页

PS1="${主机名}:\${密码##*/} \$"

在 SunOS 5.8 上的默认 ksh 上测试

于 2009-07-23T13:49:43.340 回答
13

好的,有点老,有点晚,但这是我在 Kornshell 中使用的:

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

这会产生一个相当于PS1="\u@\h:\w\n$ "BASH 的提示。

例如:

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

我喜欢两行提示,因为有时我的目录名很长,而且它们会占用很多命令行。如果你想要一个单行提示,只需在最后一个打印语句中去掉“\n”:

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

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

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

它不像设置 BASH 提示那么容易,但你明白了。只需编写一个脚本PS1,Kornshell 就会执行它。


对于 Solaris 和其他版本的 Kornshell

我发现上面的方法在 Solaris 上不起作用。相反,你必须以真正的黑客方式来做......

  • 在您的.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$ "。它不漂亮,但它有效。

于 2011-08-08T15:58:33.820 回答
3

ENV=~/.kshrc,然后在你的 .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"

布拉德

于 2011-12-11T22:50:07.467 回答
1
HOST=`hostname`
PS1='$(print -n "[${USER}@${HOST%%.*} ";[[ "$HOME" == "$PWD" ]] && print -n "~" ||([[ "${PWD##*/}" == "" ]] && print -n "/" || print -n "${PWD##*/}");print "]$")'
于 2012-11-09T10:13:33.740 回答
1
PS1=`id -un`@`hostname -s`:'$PWD'$
于 2017-09-10T00:14:10.220 回答
-2

和...

如果您的大部分工作都在两个 shell 之间工作 [ksh 和 bourne sh] 并希望在命令行上显示目录跟踪,那么 PWD 可以在 ksh 中轻松替换,如果您使用 /usr/xpg4/bin/sh 作为您的 sh SHELL,它也可以在那里工作

于 2016-02-25T19:15:43.907 回答
-4

试试这个:


PS1="\H:\W"

有关以下内容的更多信息:如何:更改/设置 bash 自定义提示,我知道您说的是 ksh,但我很确定它会起作用。

于 2009-07-23T13:24:21.640 回答