작업 디렉토리에 대한 더 짧은 경로를 표시하도록 Korn 프롬프트를 변경합니다.

작업 디렉토리에 대한 더 짧은 경로를 표시하도록 Korn 프롬프트를 변경합니다.

.kshrc다음과 같은 프롬프트를 표시하도록 변경했습니다 . 명령 번호는 511 /export/home/students/cninja $어디에 있고 현재 작업 디렉터리는 어디에 있습니까?511../students/cninja

작업 디렉토리의 단축 버전을 표시한 다음 프롬프트에 다음과 같은 내용이 표시되는 것이 가능합니까? 511 ~/cninja $아니면 511 ../students/cninja $무엇을 갖고 있습니까?

내 행은 다음과 같습니다 .kshrc.

PS1=' ! $PWD $'; export PS1


고쳐 쓰다:내 쉘이 ksh88인지 ksh93인지 알 수 없습니다. 대부분의 echo *what have you*명령은 빈 응시를 반환하고 쉘과 echo ${.sh.version}백 에서 프롬프트를 표시합니다 /bin/ksh: ${.sh.version}: bad substitution.

답변1

ksh의 여러 구현이 존재합니다:

  • David Korn의 원래 버전(또는 AT&T)에는 두 가지 주요 변형(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"}$ '

ksh(이제 Debian의 ksh93u+, Solaris의 ksh88i, Debian의 MirBSD ksh 40.9.20120630(pdksh 파생) 및 Debian의 zsh 4.3.17( 호출 시 ) 에서 작동한다는 것을 확인했습니다. ksh는 작동하지 않습니다)

아이디어는 $PWD그것이 로 시작 하면 비어 있으므로 $HOME비어 있으므로 우리가 얻는 것은 입니다 . 그러나 그렇지 않은 경우 is , is 이므로 배열에 요소가 하나만 있기 때문에 우리가 얻는 것은 빈 배열입니다 .${PWD##"$HOME"*}${one#1}${tilde[0]}$tilde${PWD##"$HOME"*}$PWD${one#${PWD}1}$one${tilde[1]}$tilde

답변2

나는 다음이 효과가 있을 것이라고 생각했지만 그것은 bash 전용 솔루션인 것으로 나타났습니다. 이 답변은 참고용으로만 남겨두세요.

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

어쩌면 생성자 대신 백엔드가 필요할 수도 있습니다 $( ).

답변3

Korn Shell "분야 함수"(기본적으로 getter/setter)를 사용하여 경로를 원하는 형식으로 변환합니다.

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

ksh93에서 테스트되었습니다. ksh88에서 작동하는지 확실하지 않습니다.

답변4

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

관련 정보