Alterar prompt do Korn para mostrar caminho mais curto para o diretório de trabalho

2

Alterei meu .kshrc para mostrar meu prompt da seguinte maneira: 511 /export/home/students/cninja $ em que 511 é o número do comando e ../students/cninja é o diretório de trabalho atual.

É possível mostrar uma versão abreviada do diretório de trabalho, o prompt mostrando algo como: 511 ~/cninja $ ou 511 ../students/cninja $ ou o que você tem?

Esta é a aparência da minha linha em .kshrc :

PS1=' ! $PWD $'; export PS1

Update: Não consegui determinar se tenho um shell ksh88 ou ksh93. A maioria dos comandos echo *what have you* retorna um stare em branco e um prompt do shell, e echo ${.sh.version} retorna /bin/ksh: ${.sh.version}: bad substitution .

    
por cornbread ninja 14.10.2012 / 20:53

4 respostas

2

Existem algumas implementações do ksh:

  • O original (ou AT & T) de David Korn com duas variantes principais (ksh88 e ksh93), cada uma com versões diferentes com um conjunto de recursos diferente
  • pdksh (o shell Korn de domínio público) com alguns derivativos.
  • %código%. Zsh tem um modo de emulação ksh que é ativado quando chamado como zsh .

Você pode querer usar o zsh como seu ksh, ou até mesmo mudar para o zsh, que é uma ferramenta muito mais poderosa como um shell interativo.

Se você chamar zsh como ksh . Você pode fazer a expansão de prompt desejada (adicioná-lo ao seu arquivo ksh ):

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

Caso contrário, se você precisar ficar com os do AT & T ou do PD, poderá aproximá-lo com:

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

O que funcionaria para $ENV , mas não para ~ .

Exemplo:

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

De uma lembrança vaga de décadas atrás, pode ser que o ksh88 não expanda as substituições de comandos dentro de ~other-user . Nesse caso, você ainda pode usar algum truque como:

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

(que eu agora verifiquei funciona em todos do ksh93u + no Debian, ksh88i no Solaris, MirBSD ksh 40.9.20120630 (derivada pdksh) no Debian, e zsh 4.3.17 (quando chamado como $PS1 ) no Debian, então eu ficaria surpreso se houvesse algum ksh onde ele não funcionou)

A ideia é que, se ksh começar com $PWD , então $HOME estará vazio, então ${PWD##"$HOME"*} estará vazio, por isso, obteremos ${one#1} , que é ${tilde[0]} . Mas se não for assim, $tilde é ${PWD##"$HOME"*} , então $PWD é ${one#${PWD}1} , por isso, obtemos $one , que é vazio como a matriz ${tilde[1]} como apenas um elemento.

    
por 14.10.2012 / 22:30
3

Eu achei que o seguinte funcionaria, mas acabou sendo uma solução específica para o bash. Deixando esta resposta para fins de referência.

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

Talvez seja necessário um backtics em vez da construção $( ) .

    
por 14.10.2012 / 21:00
0

Use uma "função de disciplina" do Korn Shell (basicamente um getter / setter) para obter o caminho que você deseja:

function RELATIVE_PWD.get {
    if [ "${PWD:0:${#HOME}}" = "$HOME" ]
    then
            .sh.value="~${PWD:${#HOME}}"
    else
            .sh.value="$PWD"
    fi
}
PS1='! ${RELATIVE_PWD} \$ '

Testado no ksh93. Não tenho certeza se funciona no ksh88.

    
por 17.01.2018 / 07:44
0
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="3["
        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
    
por 06.06.2018 / 15:05

Tags