“~”로 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

또는와 zshprint내장 :

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.