zsh/bash: 논리적 디렉터리 구조 규칙을 사용하여 실행 전에 명령 매개변수의 상대 경로를 확장합니다.

zsh/bash: 논리적 디렉터리 구조 규칙을 사용하여 실행 전에 명령 매개변수의 상대 경로를 확장합니다.

그래서 나는 쉘에 "논리적" 모드와 "물리적" 모드가 있다는 pwd것을 알고 있습니다(참조:cd이 문제그리고 거기에서 연결된 질문).

이제 다음 심볼릭 링크가 있다고 가정해 보겠습니다.

/home/<username>/foo -> /tmp/bar

로컬로 수행하려면 다음을 수행하십시오.

mkdir /tmp/bar
ln -s /tmp/bar ~/foo

$HOME이제 my 및 cdinto를 시작하면 를 foo통해 "논리적" 경로(기본 설정 사용)를 얻을 수 있고 다음을 pwd통해 "물리적" 경로를 얻을 수 있습니다 -P.

$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar

물론, " .."는 항상 "물리적" 경로의 상위 경로를 나타냅니다(제가 이해한 바에 따르면 이 경로는 쉘에 의해 해석되지도 않고 있는 그대로 명령에 전달되며, 일부 특수 내장 명령(예: cd구체적으로 해석) ) ) "논리적" 동작을 얻으려면 ):

$ pwd
/home/<username>/foo
$ realpath ..
/tmp

내가 원하는 것은 $HOME/foo내가 사용하는 상대 경로(예: )가 (또는 그 하위 디렉터리에 있을 때) ls -l ../.."논리적" 경로를 기준으로 해석/확장되는 것입니다(명령 앞에 OK를 붙여야 하는 경우).

예를 들어:

$ pwd
/home/<username>/foo
$ vi ../something.txt

나는 이 문제를 해결하고 싶다 vi /home/<username>/something.txt.

다음을 수행하는 것(또는 모든 인수를 반복하기 위해 명령 앞에 추가할 수 있는 셸 함수를 작성하고 경로를 참조하는 경우 명령에 전달하기 전에 확장하는 것)보다 더 간단하고 짧은 것이 있습니까?

$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)

"셸이 명령을 실행하기 전에 명령줄 인수의 논리적 경로 확장이 상대 파일 경로로 수행됩니다"와 같은 것이 있습니까? 을 사용하고 있지만 or에 대한 zsh어떤 bash솔루션 이라도 zsh괜찮을 것입니다.

답변1

나는 Zsh를 사용하여 이 질문에 답할 것입니다. 왜냐하면 그것이 제가 사용하고 있는 것이기 때문입니다.


..사용할 때 원하는 효과를 얻으려면 파일 cd에 다음을 추가하면 됩니다 ~/.zshrc.

setopt NO_chase_dots NO_chase_links

문서는 여기에 있습니다:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS


..:h다른 모든 경우에는 ("head") 확장 수정자를 대신 사용해야 합니다 .

$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt

두 개 이상의 수준으로 이동해야 하는 경우 해당 수준에 숫자를 추가하거나(표현식을 중괄호로 묶은 경우) 다음을 반복할 수 있습니다 :h.

# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo

문서는 여기에 있습니다:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers

관련 정보