a
에 대한 심볼릭 링크인 파일이 있다고 가정해 보겠습니다. b
이 파일은 에 대한 심볼릭 링크입니다 c
.
zsh의 :A
수정자를 사용하여 a 와일드카드를 사용하면 모든 기호 링크를 확인하는 절대 경로가 생성되므로 (라이브러리가 있는 시스템에서) a(:A)
절대 경로로 확장됩니다.c
realpath
임의의 심볼릭 링크 깊이까지 파일을 얻는 b
것이 (절대적으로 또는 상대적으로, 그러나 뷰의 출력을 통하지 않고 와일드카드의 결과로 직접적으로 ) 가능합니까 ?ls -l
Bash의 솔루션도 알아 둘 가치가 있습니다.
답변1
언제든지 glob 한정자와 함께 작동하는 함수를 만들 수 있습니다 +
.
$ zmodload zsh/stat $resolve() { [[ -L $REPLY ]] && stat -A REPLY +link -- ${1-$REPLY} } $ 인쇄 -r - a(+분석) 두번째 $ 인쇄 -r - a(+분석:a) /home/stephane/b (아래 경고 참조)
이렇게 하면 a(+resolve+resolve)
두 번째 파일은 첫 번째 파일 이름( )의 결과 resolve
가 아닌 원래 파일 이름( )으로 호출됩니다 . a
하지만 다음과 같이 할 수 있습니다.resolve
b
$ print -r - a(e['resolve && resolve'])
c
두 개의 resolve
s를 연결합니다. 그러나 (주의 사항은 :a
위의 사용법에도 적용됩니다.) 이 특정 예에서는 작동하지만 일반적인 경우에는 상대 경로가 만들어지면 심볼릭 링크의 대상이 Symlink는 현재 작업 디렉터리가 아니므로 dir/link
이를 가리키는 경우 대신 foo
파일이므로 현재 작업 디렉터리에서 심볼릭 링크를 확인할 때만 작동합니다.dir/foo
foo
resolve
그러나 이를 변경하면 심볼릭 링크 대상의 전체 경로가 계산되므로 더 이상 문제가 되지 않습니다.
resolve() {
local target
[[ -L $REPLY ]] &&
stat -A target +link -- ${1-$REPLY} &&
case $target in
(/*) REPLY=$target;;
(*) REPLY=${REPLY:h:a}/$target;;
esac
}
bash
readlink()
glob 한정자나 인터페이스 (내장 인터페이스와 같은 zsh
) 는 없지만 stat
일부 시스템에서는 다음 명령을 찾을 수 있습니다 readlink
.
$ readlink a
b