GNU Stow가 심볼릭 링크 인 stow 디렉토리를 사용할 수 있습니까?


10

이 스크립트를 고려하십시오.

#! /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

실행 한 후 stowmylink, 나는 다음과 같이 그것을 예상 :

.
├── 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

( stowon 사용 에 대한 동기 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이 예제가 표준 경로를 항상 해결하지는 않는 잠재적 인 유용성을 명확히하기를 바랍니다.


이 간접적 인 것을 피하는 것이 도움이되는 사용 사례를 제시해 주시겠습니까? 경우 무엇 mylink에 대신 심볼릭 링크 mylink2차례에 심볼릭 링크하는 mydir? 어떻게 스토우는 가리키는 심볼릭 링크를 생성할지 여부를 결정해야 ../mylink/package/file하거나 ../mylink2/package/file또는 ../mydir/package/file?
Adam

@AdamSpiers 다소 도움이되기를 바랍니다. 원한다면 이것을 Github 이슈 트래커에도 넣을 수 있습니다.
Nathaniel M. Beaver

감사합니다 @Nathaniel. 네 도움이 될 것입니다!
Adam Spiers 2016 년

답변:


7

지금은 방법이 없습니다.

내부적으로 chdirstow사용하여 경로 로 이동 하여 지정된 경로의 절대 정식 경로를 찾은 다음 POSIX getcwd () 의 Perl 인터페이스 인 POSIX 모듈의 getcwd () 함수 를 사용 하여 절대 경로 이름을 가져옵니다.

POSIX가 명시한 바와 같이, 경로명에는 .또는 .., 또는 심볼릭 링크 인 구성 요소가 포함되지 않아야한다 .


1
이것을 올바르게 처리하기 위해 구현을 수정하는 방법에 대한 제안은 매우 환영합니다. 풀 요청은 더욱 환영합니다! :-) 참고로, 문제는 여기에보고되었습니다 github.com/aspiers/stow/issues/11
아담 첨탑
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.