zsh/Bash에서 globbing을 수행할 때 부분적으로 심볼릭 링크를 확인/따르기

zsh/Bash에서 globbing을 수행할 때 부분적으로 심볼릭 링크를 확인/따르기

a에 대한 심볼릭 링크인 파일이 있다고 가정해 보겠습니다. b이 파일은 에 대한 심볼릭 링크입니다 c.

zsh의 :A수정자를 사용하여 a 와일드카드를 사용하면 모든 기호 링크를 확인하는 절대 경로가 생성되므로 (라이브러리가 있는 시스템에서) a(:A)절대 경로로 확장됩니다.crealpath

임의의 심볼릭 링크 깊이까지 파일을 얻는 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하지만 다음과 같이 할 수 있습니다.resolveb

$ print -r - a(e['resolve && resolve'])
c

두 개의 resolves를 연결합니다. 그러나 (주의 사항은 :a위의 사용법에도 적용됩니다.) 이 특정 예에서는 작동하지만 일반적인 경우에는 상대 경로가 만들어지면 심볼릭 링크의 대상이 Symlink는 현재 작업 디렉터리가 아니므로 dir/link이를 가리키는 경우 대신 foo파일이므로 현재 작업 디렉터리에서 심볼릭 링크를 확인할 때만 작동합니다.dir/foofoo

resolve그러나 이를 변경하면 심볼릭 링크 대상의 전체 경로가 계산되므로 더 이상 문제가 되지 않습니다.

resolve() {
  local target
  [[ -L $REPLY ]] &&
    stat -A target +link -- ${1-$REPLY} &&
    case $target in
      (/*) REPLY=$target;;
      (*) REPLY=${REPLY:h:a}/$target;;
    esac
}

bashreadlink()glob 한정자나 인터페이스 (내장 인터페이스와 같은 zsh) 는 없지만 stat일부 시스템에서는 다음 명령을 찾을 수 있습니다 readlink.

$ readlink a
b

관련 정보