“~”로 pwd 결과를 만드시겠습니까?


28

pwd 나에게 준다

/data/users/me/some/random/folder

얻는 쉬운 방법이 있습니까

~/some/random/folder

에서 pwd?


sed를 통한 배관은 옵션입니까?
— Matthew D. Scholefield

7
이 작업을 수행 위하여려고하는 경우에, 나는 거라고 강하게 이외의 결과 명령 뭔가를 명명하는 것이 좋습니다 pwd. 그렇지 않으면 물결표 확장을 수행하지 않는 컨텍스트에서 출력을 사용할 것으로 예상되는 스크립트가 중단됩니다.
— 찰스 더피

답변:


25

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와 zsh 사이를 항상 전환합니다. 불행히도이 솔루션은 쉘 간의 차이점을 기억하고 현재 위치를 기억 (확인)해야합니다. @Bichoy의 대답은이 두 가지에 대해 쉘에 독립적입니다.
— avp

18

Bash 변수 서브 스트링 대체 기능을 사용할 수 있습니다.

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar

2
이것은 또한 작동 ksh하고 zsh.
— mr.spuratic

1
가장 쉬운 방법 으로이 답변을 찬성했지만 여기에는 / tmp / home / username 안에 작은 경고가 있습니다. 이것은 / tmp ~를 반환합니다. 이 문제를 해결하기 위해 $ HOME 전에 캐럿 부호를 삽입하는 방법을 찾을 수 없습니다. 완벽한 솔루션이 필요하다면 이것을 사용하지 마십시오 ...
— 0fnt

1
@ user18151, 이것을 지적 해 주셔서 감사합니다. ${string/#substring/replacement}이 동작을 방지하기 위해 버전에 대한 답변을 바꿨습니다.
— Nykakin

1
@ mr.spuratic는 (의 사용을 제외하고 유일한 맞습니다 echo에서) zsh. 다른 껍질에서는 $HOME패턴으로 취급되며 모든 것이 split + glob 대상입니다.
— Stéphane Chazelas 2016 년

물결표 ( '~')를 빠져 나가는 것이 속임수였습니다. \ ~도 작동합니다. 이것은 이미 상황에있을 때 편리합니다 : 예 :PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
— Atafar

7

사용 sed:

pwd | sed "s|^$HOME|~|"

아이디어는 홈 디렉토리 경로에 sed정규 표현식 의 구분 기호로 표시되지 않는 문자를 사용하는 것 입니다. 위의 예에서는을 사용하고 |있습니다.

이 기술의 좋은 점은 실제로 쉘과 무관하다는 것입니다.

별칭 pwd을 /bin/pwd | sed "s|$HOME|~|"사용하여 다른 스크립트에서이 동작을 수행 할 수도 있습니다 pwd.


2
^정규식에 앵커 를 포함해야합니다 . 그렇지 않으면 경로 중간에있는 세그먼트를 대체 할 수 있습니다 (그러나 가능성은 낮음).
— Sildoreth

실제로 정규식은 다음과 같아야합니다 "s|^/home/user\(/.*\)\?$|~\1|". 이름이 같은 경우 그렇지 않으면 다른 사용자의 경로를 일치 user1, user2, user3당신은 단지 일치user
— AVP

3
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
~

1
정말 흥미로운 접근법입니다. 그러나 그것은 $PWD아래에 있다고 가정합니다 $HOME. 동일한 아이디어를 패턴 대체와 결합하여 더 일반적으로 만들 수 있습니다. 어때요 ${PWD/#~/\~}?
— Mikel

1
실제로 Nykakin의 대답은 기본적으로입니다.
— Mikel

0

원하지 않는 부분을 sed다음 과 같이 교체해보십시오 .

pwd | sed 's,^/data/users/me,~,'

또는 더 나은 :

pwd | sed "s,^$HOME,~,"

1
^디렉토리 경로의 시작 부분에서 일치하는 항목 만 바꾸 려면 앵커 를 사용해야합니다 . 또한 g명령이 최대 한 번 발생해야하므로 사용할 필요가 없습니다 .
— Sildoreth

고맙습니다. 나는 아직도이 것들을 배우고 있으며 당신의 의견은 정말 도움이됩니다.
— user1403360

내 홈 디렉토리가 /home/alice있고 현재 디렉토리가 인 경우 문제 가 /home/aliceinchains있습니다. 그러나이 기능을 사용하려는 유일한 시간이 내 홈 디렉토리 또는 하위 디렉토리 중 하나라는 것을 알 때만 작동합니다.
— Mihai Danila
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.