.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