답변:
bash를 사용하는 경우 dirs
내장 기능에 원하는 동작이 있습니다.
dirs +0
~/some/random/folder
(참고 +0
가 아닙니다-0
.)
로 zsh
:
dirs
~/some/random/folder
정확히 말하자면, 먼저 디렉토리 스택을 지워야합니다. 그렇지 않으면 dirs
모든 내용이 인쇄됩니다.
dirs -c; dirs
또는와 zsh
의 print
내장 :
print -rD $PWD
또는
print -P %~
(사람이 켜지는지 프롬프트 확장 .에을 %~
의 $PS1
와 현재 디렉토리로 확장 $HOME
으로 대체 ~
뿐만 아니라 다른 처리 라는 이름의 디렉토리를 다른 사용자 나의 홈 디렉토리와 같은 이름의 디렉토리 당신이 자신을 정의하는 것이 참조).
Bash 변수 서브 스트링 대체 기능을 사용할 수 있습니다.
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
ksh
하고 zsh
.
${string/#substring/replacement}
이 동작을 방지하기 위해 버전에 대한 답변을 바꿨습니다.
echo
에서) zsh
. 다른 껍질에서는 $HOME
패턴으로 취급되며 모든 것이 split + glob 대상입니다.
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
사용 sed
:
pwd | sed "s|^$HOME|~|"
아이디어는 홈 디렉토리 경로에 sed
정규 표현식 의 구분 기호로 표시되지 않는 문자를 사용하는 것 입니다. 위의 예에서는을 사용하고 |
있습니다.
이 기술의 좋은 점은 실제로 쉘과 무관하다는 것입니다.
별칭 pwd
을 /bin/pwd | sed "s|$HOME|~|"
사용하여 다른 스크립트에서이 동작을 수행 할 수도 있습니다 pwd
.
^
정규식에 앵커 를 포함해야합니다 . 그렇지 않으면 경로 중간에있는 세그먼트를 대체 할 수 있습니다 (그러나 가능성은 낮음).
"s|^/home/user\(/.*\)\?$|~\1|"
. 이름이 같은 경우 그렇지 않으면 다른 사용자의 경로를 일치 user1
, user2
, user3
당신은 단지 일치user
tilde=\~${PWD#~}
그게 당신이 원하는 것 같아요?
물결표의 장점은 인용 할 필요가없는 패턴으로 확장 될 때입니다. $HOME
따옴표없이 동일한 방식으로 사용하면 구성 문자 중 하나라도 패턴 문자가 될 수 있기 때문에 예측할 수없는 결과를 얻을 수 있으므로 항상 결과가 예상되는 것은 아닙니다.
그러나 물결표 확장은 인용 된 확장의 결과 인 것처럼 항상 발생하도록 지정되므로 결과를 예측할 수 있습니다. 이것은 case
패턴과 매개 변수 패턴 을 모두 테스트 한 거의 모든 쉘에서 두 가지를 제외 ksh93
하고 mksh
는 어떤 이유로 든 예외를 제외하고 는 실제로 적용 되는 것으로 보입니다.
이것에 대한 또 다른 깔끔한 점은 $HOME
모든 디렉토리를 동일한 방식으로 처리하도록 재정의 할 수 있다는 것 입니다. 예를 들면 다음과 같습니다.
cd ~
HOME=/some/prefix/I/would/like/to/trim
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD
또 다른 예는 다음과 같습니다.
set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
HOME=${*#~/}/$d
set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~
$PWD
아래에 있다고 가정합니다 $HOME
. 동일한 아이디어를 패턴 대체와 결합하여 더 일반적으로 만들 수 있습니다. 어때요 ${PWD/#~/\~}
?
원하지 않는 부분을 sed
다음 과 같이 교체해보십시오 .
pwd | sed 's,^/data/users/me,~,'
또는 더 나은 :
pwd | sed "s,^$HOME,~,"
^
디렉토리 경로의 시작 부분에서 일치하는 항목 만 바꾸 려면 앵커 를 사용해야합니다 . 또한 g
명령이 최대 한 번 발생해야하므로 사용할 필요가 없습니다 .
/home/alice
있고 현재 디렉토리가 인 경우 문제 가 /home/aliceinchains
있습니다. 그러나이 기능을 사용하려는 유일한 시간이 내 홈 디렉토리 또는 하위 디렉토리 중 하나라는 것을 알 때만 작동합니다.