이 스크립트를 고려하십시오.
#! /usr/bin/env bash
mkdir -p target
mkdir -p mydir/package/
touch mydir/package/file
ln --symbolic mydir mylink
file mylink
stow --verbose --dir=./mylink --target=./target package
file target/file
출력은
mylink: symbolic link to mydir
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
를 실행하기 전에 stow
다음과 같이 보입니다.
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
실행 한 후 stow
에 mylink
, 나는 다음과 같이 그것을 예상 :
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mylink/package/file
그러나 대신 다음과 같습니다.
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mydir/package/file
것 같다 stow
명령이 너무 대신 가리키는의 패키지 디렉토리의 realpath 해결 ../mylink/package/file
이 가리키는 ../mydir/package/file
.
이것은 너무 많은 간접적 인 것을 피하는 것이 합리적이지만 조용히 발생하며 항상 바람직한 것은 아닙니다. 이 문제를 해결하는 방법이 있습니까?
편집 : 요청에 따라 실제 경로를 해결하는 것이 불편한 사용 사례의 예를 설명합니다.
심볼릭 링크는 때때로 호환성을 위해 사용됩니다 . 데비안 은 공식적인 정책으로 이것에 대해서도 이야기 합니다. 종종 대상은 단일 파일이지만 때로는 디렉토리
입니다. 나는 /usr/share/doc/
혼자서 내 시스템에 몇 백을 가지고 있습니다 .
$ find /usr/share/doc -xtype d -type l | wc -l
325
stow
심볼릭 링크 대상이 이동하지 않는 한 기본 동작은 정상입니다. 그러나 때로는 원하는 대상 디렉토리가 이동합니다. 예를 들어, 데비안에서 vim-runtime
패키지는 / usr / share / vim / 아래 /usr/share/vim/vim64
에 버전 6.4 와 같은 버전에 의존하는 디렉토리에 파일을 설치합니다 . 그러나 패키지는 현재 버전을 가리키는
시점에서 심볼릭 링크 도 업데이트합니다/usr/share/vim/vimcurrent
. 즉, 가리키는 심볼릭 링크는
/usr/share/vim/vim64/doc/cmdline.txt
데비안의 다음 릴리스에서 업그레이드했을 때
/usr/share/vim/vim70/doc/cmdline.txt
하지만 심볼릭 링크
/usr/share/vim/vimcurrent/doc/cmdline.txt
두 버전 모두에서 작동합니다.
이후 stow
사용 스토우 디렉토리의 절대 정규 경로 호출처럼
stow --dir=/usr/share/vim/vimcurrent --target=./my-vim-docs doc
예를 들어 다음과 같은 기호 링크가 생성됩니다.
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vim64/doc/cmdline.txt
이건 아니야:
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vimcurrent/doc/cmdline.txt
( stow
on 사용 에 대한 동기 vimcurrent/docs
는 현재 문서에 대한 심볼릭 링크와 함께 내 vim 노트를 섞을 수 있도록하는 것입니다.) vimcurrent
호환성 심볼릭 링크는
더 이상 현재 데비안 배포판 에는
존재하지 않지만 Arch Linux와 같은 다른 버전에서는 존재할 수 있습니다 . 잘 모르겠습니다. 어쨌든 vim 문서에 대한 일반적인 아이디어를 제공하는 스크립트는 다음과 같습니다.
#! /usr/bin/env bash
mkdir -p target
ln --symbolic /usr/share/vim/vim80 vimcurrent
stow --verbose --dir=./vimcurrent --target=./target pack
file target/dist
출력은 다음과 같습니다
LINK: dist => ../../../../../usr/share/vim/vim80/pack/dist
target/dist: symbolic link to ../../../../../usr/share/vim/vim80/pack/dist
가설 적으로, stow
라고 불리는 플래그를 가질 수 --no-realpath
있으므로 출력은 다음과 같이 보일 것입니다.
LINK: dist => ./vimcurrent/pack/dist
target/dist: symbolic link to ./vimcurrent/pack/dist
각 버전에 따라 변경되는 호환성 심볼릭 링크의 다른 예를 보려면 다음과 같이 랩탑에서 더 알고 있습니다.
$ file /usr/share/go
/usr/share/go: symbolic link to go-1.10
$ file /usr/share/mscore
/usr/share/mscore: symbolic link to mscore-2.1
symlink-points-to-symlink 경우를 해결하려면 :
#! /usr/bin/env bash
mkdir -p target
mkdir -p mydir/package/
touch mydir/package/file
ln --symbolic mydir mylink
ln --symbolic mylink mylink2
namei mylink2
생산 :
f: mylink2
l mylink2 -> mylink
l mylink -> mydir
d mydir
그리고:
$ stow --verbose --dir=./mylink2 --target=./target package
$ file target/file
생산 :
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
이므로
$ stow --no-realpath --verbose --dir=./mylink2 --target=./target package
$ file target/file
이것을 만들 것입니다 :
LINK: file => ../mylink2/package/file
target/file: symbolic link to ../mylink2/package/file
따라서 가상의 --no-realpath
동작에서는 stow 디렉토리를 일반 디렉토리로 취급합니다.
이 기능은 다음 시나리오에서 적용 가능합니다.
1) stow 디렉토리는 심볼릭 링크 여야하고
2) 생성 된 심볼릭 링크에서 그 링크를 보존하는 것이 바람직하다.
이 기능이 부족하다고 생각하지는 않지만 stow
이 예제가 표준 경로를 항상 해결하지는 않는 잠재적 인 유용성을 명확히하기를 바랍니다.
답변
지금은 방법이 없습니다.
내부적으로 chdir 을 stow
사용하여 경로 로 이동 하여 지정된 경로의 절대 정식 경로를 찾은 다음 POSIX getcwd () 의 Perl 인터페이스 인 POSIX 모듈의 getcwd () 함수 를 사용 하여 절대 경로 이름을 가져옵니다.
POSIX가 명시한 바와 같이, 경로명에는 .
또는 ..
, 또는 심볼릭 링크 인 구성 요소가 포함되지 않아야한다 .