Измените подсказку Korn для показа более короткого пути для рабочего каталога

В zsh:

ls -ld *(u$UIDm+7)

u и m спецификаторы globbing должны соответствовать файлам владельцем и время изменения соответственно.

2
15.10.2012, 21:08
3 ответа

Там существуйте несколько реализаций ksh:

  • Оригинал (или AT&T) один David Korn с двумя главными вариантами (ksh88 и ksh93) каждый имеющий различные версии с различным набором функций
  • pdksh (общественное достояние оболочка Korn) с несколькими производными.
  • zsh. Zsh имеет ksh режим эмуляции, который он активирует при вызове как ksh.

Можно хотеть использовать zsh в качестве ksh или даже переключиться в целом на zsh, который является намного более мощным инструментом как интерактивной оболочкой.

Если Вы называете zsh как ksh. У Вас может быть быстрое расширение, которое Вы хотите путем выполнения (добавьте его к Вашему $ENV файл):

setopt PROMPT_PERCENT # restore zsh prompt expansion disabled by the ksh mode
PS1='%! %~$ '

Иначе, если действительно необходимо придерживаться AT&T или PD, Вы могли бы приблизить ее с:

PS1='! $(pwd | sed "s,^$HOME,~,")$ '

Который работал бы на ~ но не для ~other-user.

Пример:

$ echo ${.sh.version}
Version JM 93u+ 2012-02-29
$ PS1='! $(pwd | sed "s,^$HOME,~,")$ '
85 ~$ cd /tmp
86 /tmp$ cd
87 ~$

От неопределенного воспоминания от несколько десятилетий назад, могло случиться так, что ksh88 не разворачивает замены команды внутри $PS1. В этом случае Вы могли все еще использовать некоторый прием как:

one=1
tilde='~'
PS1='! ${tilde[0${one#${PWD##"$HOME"*}1}]}${PWD#"$HOME"}$ '

(который я теперь проверил работы надо всеми ksh93u + на Debian, ksh88i на Солярисе, MirBSD ksh 40.9.20120630 (pdksh производная) на Debian и zsh 4.3.17 (при вызове как ksh) на Debian, таким образом, я был бы удивлен, был ли какой-либо ksh, где он не работал),

Причем идея - это если $PWD запускается с $HOME, затем ${PWD##"$HOME"*} пусто, таким образом, ${one#1} пусто, таким образом, мы добираемся ${tilde[0]} это $tilde. Но если это не делает затем ${PWD##"$HOME"*} $PWD, затем ${one#${PWD}1} $one, таким образом, мы добираемся ${tilde[1]} который пуст как $tilde выстройте как только один элемент.

2
27.01.2020, 21:57
  • 1
    я могу пропускать что-то, но я попробовал PS1='! $(pwd | sed "s,^$HOME,~,")$ ' и это не работало. –  cornbread ninja 15.10.2012, 19:19
  • 2
    , В котором пути разве это не работает? Какая версия/реализация ksh? –  Stéphane Chazelas 15.10.2012, 19:33
  • 3
    Это изменило подсказку на (pwd | sed "s,^$HOME,~,")$ ', в основном. Я получаю плохую замену с этим echo ${.sh.version}. Там другой путь состоит в том, чтобы найти версию? Извините, что мой n00b показывает. –  cornbread ninja 15.10.2012, 19:50
  • 4
    Это должно быть $(pwd...)$). Какой эффект Вы получаете? Если это - pdksh, можно посмотреть на echo "$KSH_VERSION". Или можно попробовать what /bin/ksh. –  Stéphane Chazelas 15.10.2012, 20:08
  • 5
    Это изменило его на 667 $(pwd | sed s,^/export/home/students/cninja,~,)$ –  cornbread ninja 15.10.2012, 20:11

Я думал, что следующее будет работать, но это оказалось ударом определенное решение. Оставляя этот ответ для ссылочной цели.

export PS1=' ! $( basename $PWD )'

Возможно, это требует обратных галочек вместо $( ) создать.

3
27.01.2020, 21:57
  • 1
    , я не уверен, под чем Вы подразумеваете basename. Был бы это быть /export? –  cornbread ninja 14.10.2012, 22:07
  • 2
    не, базовое имя является командой оболочки, которая возвращает последнюю 'часть' $PWD. –  jippie 14.10.2012, 22:15
  • 3
    ! Я попробую его снова, затем. –  cornbread ninja 14.10.2012, 22:18
  • 4
    Это не работало. Я попробовал PS1=' ! $( basename $PWD )' и PS1 ='! '$PWD базового имени' ' –  cornbread ninja 14.10.2012, 22:24
  • 5
    Мой прием должен быть ударом, конкретным затем. Bash и ksh в значительной степени подобны, но не идентичны. –  jippie 14.10.2012, 22:29
UserLoc=$(for user_loc in $(egrep -v "root|shutdown|halt|nologin" /etc/passwd | awk -F: '{print $1}' ); do echo -e "$user_loc"; done | grep $USER)

# User shell
MYSHELL=$(echo $SHELL | awk -F/ '{print $NF}')
if [ "$MYSHELL" == "bash" ] ; then
        Default=$(echo -e "\e[00m")
        Black=$(echo -e "\e[30m")
        Red=$(echo -e "\e[31m")
        Green=$(echo -e "\e[32m")
        Orange=$(echo -e "\e[33m")
        Blue=$(echo -e "\e[34m")
        Magenta=$(echo -e "\e[35m")
        Cyan=$(echo -e "\e[36m")
        White=$(echo -e "\e[37m")
        Def=$(echo -e "\e[0;0m")
        Bold=$(echo -e "\e[1m")
        Under=$(echo -e "\e[4m")
        Normal=$(tput sgr0)
        PrtF="$"
        PS1='[${Color}${USER}${Default}@${Hostname}] \W ${PrtF} '
elif [ "$MYSHELL" == "ksh" ] ; then
        esc="\033["
        Default=$(echo -e "${esc}00m")
        Black=$(echo -e "${esc}30m")
        Red=$(echo -e "${esc}31m")
        Green=$(echo -e "${esc}32m")
        Orange=$(echo -e "${esc}33m")
        Blue=$(echo -e "${esc}34m")
        Magenta=$(echo -e "${esc}35m")
        Cyan=$(echo -e "${esc}36m")
        White=$(echo -e "${esc}37m")
        Def=$(echo -e "${esc}0m")
        Bold=$(echo -e "${esc}1m")
        Under=$(echo -e "${esc}4m")
        PrtF="$"
        PS1='[${Color}${USER}${Default}@${Hostname}] $(if [ "${PWD#$HOME}" != "$PWD" ];then print "~${PWD#$HOME}"; else print "$(basename $PWD)"; fi) ${PrtF} '
else
        PS1="[\u@\h] \w \\$ "
fi

# Color for login's user
# if root or admin user => Red
if [ "$EUID" -eq 0 ] ; then
    Color=${Red}${bold}
        PrtF="#"
# if user local => Cyan
elif [ "$UserLoc" == "$USER"  ] ; then
    Color=${Cyan}${bold}
# if standard user (AD or LDAP) => green
else
   Color=${Green}${bold}
fi

export PS1
0
27.01.2020, 21:57

Теги

Похожие вопросы