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

问题描述 投票:0回答:8

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

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

并显示提示:

hostname:/full/path/to/current/directory $

但是,我希望它显示:

hostname:directory $

换句话说,如何只显示主机名和当前目录的名称,即

tmp
~
public_html
等?

unix shell environment-variables customization ksh
8个回答
22
投票

阅读您想要的 ksh 手册页

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

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


14
投票
好吧,有点旧,有点晚了,但这就是我在 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 $

我喜欢两行提示符,因为有时我的目录名很长,它们会占用很多命令行。如果您想要一行提示,只需省略“ “在最后一个打印语句上:

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$

这并不像设置 BASH 提示符那么容易,但你明白了。只需为

PS1

 编写一个脚本,Kornshell 就会执行它。


适用于 Solaris 和其他

较旧的 Kornshell 版本

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

  • 在您的

    .profile

     中,确保 
    ENV="$HOME/.kshrc"; export ENV
    已设置。这可能是为您正确设置的。

  • 在您的

    .kshrc

    文件中,您将做两件事

      您将定义一个名为
    1. _cd
       的函数。此函数将更改到指定的目录,然后根据您的密码设置您的 PS1 变量。
    2. 您将设置别名
    3. 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$ "

。虽然不漂亮,但是很管用。


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"

布拉德


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'$
    

0
投票
那么,

PS1=`id -un`@`hostname -s`:`print $PWD | sed "s,$(print $HOME),~,"`$' '
in ~/.profile 应该适用于所有版本的 Korn shell,但有一个问题:PS1 变量是在 ksh 上登录时设置的,并且不会使用更改目录 (cd) 命令进行更新。

您需要按照以下方式向 ~/.profile 添加一个条目

chdir () { \cd ${*:-$HOME} && PS1=`id -un`@`hostname -s`:`print $PWD | sed "s,$(print $HOME),~,"`$' ' } alias cd=chdir cd
要使用 cd 命令更新 PS1(显然,如果通过其他方式更改目录,PS1 将不会更新,并且需要 YA kluge)。


-2
投票
还有...

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


-3
投票
试试这个:

PS1="\H:\W"

有关以下内容的更多信息:

如何:更改/设置 bash 自定义提示,我知道您说的是 ksh,但我很确定它会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.