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コマンドはパッケージディレクトリの../mylink/package/file実際のパスを解決するようです。そのため、それを指すのではなく、を指し../mydir/package/fileます。

これは、過度の間接参照を回避するのに意味がありますが、静かに行われ、常に望ましいとは限りません。この動作を回避する方法はありますか?

編集:リクエストに応じて、実際のパスの解決が不便な使用例を説明します。

互換性のためにシンボリックリンクが使用されることがあります。Debian はこれについて公式の方針でさえ話します。多くの場合、ターゲットは単一のファイルですが、ディレクトリの場合もあります 。私はたまたま自分のシステムに数百/usr/share/doc/人しかいない:

$ find /usr/share/doc -xtype d -type l | wc -l
325

のデフォルトの動作はstow、シンボリックリンクターゲットが移動されない限り問題ありません。ただし、目的のターゲットディレクトリが移動されることがあります。たとえば、Debianでは、vim-runtimeパッケージは/ usr / share / vim /の下の/usr/share/vim/vim64バージョン6.4 などのバージョンに依存するディレクトリにファイルをインストールします。しかし、パッケージにもなり、シンボリックリンクの更新/usr/share/vim/vimcurrent現在のバージョンを指摘しているが。これは、たとえば次を指すシンボリックリンクが

/usr/share/vim/vim64/doc/cmdline.txt

Debianの次のリリースでアップグレードすると壊れます

/usr/share/vim/vim70/doc/cmdline.txt

しかしへのシンボリックリンク

/usr/share/vim/vimcurrent/doc/cmdline.txt

両方のバージョンで動作します。

stowstowディレクトリの絶対正規パスを使用するため、次のような呼び出し

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には、vimcurrent/docs 現在のドキュメントへのシンボリックリンクと一緒に自分のvimノートを混ぜることができるようにすることです。)。なおvimcurrent、互換性のシンボリックリンクがありません 現在のDebianディストリビューションではもはや存在しそれがアーチ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

各バージョンで変更される互換性シンボリックリンクの他の例については、ラップトップで知っている2つを次に示します。

$ 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な動作では、ストウディレクトリを通常のディレクトリとして扱います。

この機能は、次のようなシナリオに適用できます

1)stowディレクトリはシンボリックリンクでなければなりません。

2)生成されたシンボリックリンクでそのリンクを保持することが望ましい。

私はこの機能の欠如をの大きな欠陥だとは考えていませんがstow、この例が常に正規パスを解決するとは限らないことの潜在的な有用性を明らかにしてくれることを願っています。


この間接参照を回避することが役立つと思われる使用例を教えてください。mylink代わりにシンボリックリンクされたmylink2ものにシンボリックリンクされた場合はどうなりmydirますか?Stowは、../mylink/package/fileor ../mylink2/package/fileまたはorを指すシンボリックリンクを作成する必要があるかどうかをどのように決定すべき../mydir/package/fileですか
Adam Spiers

@AdamSpiers少しお役に立てば幸いです。必要に応じて、これをGithubの課題トラッカーに追加することもできます。
ナサニエルM.ビーバー

@Nathanielに感謝します。はい、それは役に立ちます!
Adam Spiers

回答:


7

今のところ、方法はありません。

内部的には、chdirstow使用してパスに移動し、指定されたパスの絶対正規パスを検索してから、POSIX getcwd()の PerlインターフェースであるPOSIXモジュールのgetcwd()関数を使用して、絶対パス名を取得します。

POSIXで指定されているように、パス名には、.または..、またはシンボリックリンクのコンポーネントは含まれません。


1
これを正しく処理するための実装の修正方法に関する提案は大歓迎です。プルリクエストはさらに大歓迎です!:-)参考までに、問題はここで報告されています:github.com/aspiers/stow/issues/11
Adam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.