Как настраивать подсказку отображения в KornShell для отображения имени хоста и текущего каталога?

Я использую KornShell (ksh) в Solaris, и в настоящее время мой PS1 env var:

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

И появится приглашение: hostname:/full/path/to/current/directory $

Однако я бы хотел, чтобы он отображал: hostname:directory $

Другими словами, как я могу отобразить только имя хоста и имя текущего каталога, т.е. tmp или ~ или public_html и т.д. и т.д.?

Ответ 2

Хорошо, немного старое и немного поздно, но это то, что я использую в Kornshell:

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

Это делает приглашение, эквивалентное PS1="\[email protected]\h:\w\n$ " в BASH.

Например:

[email protected]:~
$ cd bin
[email protected]:~/bin
$ cd /usr/local/bin
[email protected]:/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="\[email protected]\h:\w$ " в BASH:

[email protected]:~$ cd bin
[email protected]:~/bin$ cd /usr/local/bin
[email protected]:/usr/local/bin$ 

Не так просто, как настроить приглашение BASH, но вы получите эту идею. Просто напишите script для PS1, и Kornshell выполнит его.


Для Solaris и других старых версий Kornshell

Я обнаружил, что вышеописанное не работает на Solaris. Вместо этого вам придется сделать это реальным хакерским способом...

  • В .profile убедитесь, что ENV="$HOME/.kshrc"; export ENV установлен. Это, вероятно, правильно настроено для вас.

  • В вашем файле .kshrc вы будете делать две вещи

    • Вы определяете функцию с именем _cd. Эта функция изменится на указанный каталог, а затем установите переменную PS1 на основе вашего pwd.
    • Вы создадите псевдоним 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 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="[email protected]$hostname:$prompt$ "  #You put it together the way you like
}

alias cd="_cd"

Это приведет к тому, что ваше приглашение станет равнозначным BASH PS1="\[email protected]\h:\w$ ". Это не очень, но он работает.

Ответ 3

ENV = ~/.kshrc, а затем в вашем .kshrc:

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

alias cd=_cd

cd "$PWD"

Брэд

Ответ 4

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

Ответ 5

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

Ответ 6

и...

если вы работаете между двумя раковинами для большей части ваших усилий [ksh и bourne sh] и желание отобразить отслеживание каталогов в командной строке то PWD можно легко заменить в ksh и если вы используете /usr/xpg 4/bin/sh для своего sh SHELL, он также будет работать там