이 스크립트를 고려해보세요.
#! /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
대신 .../mylink/package/file
../mydir/package/file
너무 많은 간접적인 내용을 피하는 것이 합리적이지만 조용히 발생하며 항상 바람직하지는 않습니다. 이 문제를 해결할 방법이 있나요?
편집하다:요청이 있을 경우 실제 경로를 확인하는 것이 불편한 사용 사례의 예를 설명하겠습니다.
때때로 심볼릭 링크호환성을 위해. 데비안도이는 공식 정책에서 언급된 내용입니다.. 일반적으로 대상은 단일 파일이지만때로는 디렉토리입니다
. 내 시스템에는 정확히 수백 개가 있습니다 /usr/share/doc/
.
$ find /usr/share/doc -xtype d -type l | wc -l
325
stow
심볼릭 링크 대상이 움직이지 않는 한 기본 동작은 괜찮습니다. 그러나 때로는 원하는 대상 디렉터리가 이동되는 경우도 있습니다. 예를 들어 Debian에서 이 패키지는 버전 6.4 vim-runtime
와 같이 버전에 따라 달라지는 /usr/share/vim/ 아래 디렉터리에 파일을 설치합니다 . /usr/share/vim/vim64
그러나 이 패키지는 또한심볼릭 링크 업데이트/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 디렉토리에 대한 절대 표준 경로가 사용되므로 다음과 같은 호출이 사용됩니다 .
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
심볼릭 링크 지점-심볼 링크 상황을 해결하려면 다음을 수행하십시오.
#! /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
, 이 예가 표준 경로를 항상 구문 분석하지 않는 것의 잠재적인 유용성을 보여주기를 바랍니다.
답변1
지금으로서는 방법이 없습니다.
내부적으로 stow
주어진 경로에 대한 절대 표준 경로는 다음을 사용하여 찾습니다.목차해당 경로로 이동하여 사용하세요.getcwd()Perl 인터페이스인 POSIX 모듈의 기능POSIX getcwd(), 절대 경로 이름을 가져옵니다.
.
POSIX에서 지정한 대로 경로 이름에는 또는 ..
또는 기호 링크 구성 요소가 포함되어서는 안 됩니다 .