GNU Stowはstowディレクトリをシンボリックリンクとして使用できますか?

GNU Stowはstowディレクトリをシンボリックリンクとして使用できますか?

このスクリプトを考えてみましょう。

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

あまりにも多くの間接的な内容を避けることは合理的ですが、静かに起こり、常に望ましくない。この問題を解決する方法はありますか?

編集する:リクエストがある場合は、実際のパスを確認するのが不便なユースケースの例を説明します。

時々シンボリックリンク互換性のため。 Debianこれは公式ポリシーで言及されています。。通常、ターゲットは単一のファイルですが、時にはディレクトリです 。私のシステムにはまさに何百ものものがあります/usr/share/doc/

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

stowシンボリックリンクターゲットが動かない限り、デフォルトの動作は問題ありません。しかし、時には目的のディレクトリが移動することがあります。たとえば、Debian では、このパッケージは、バージョン 6.4vim-runtimeなど、バージョンに依存する /usr/share/vim/ の下のディレクトリにファイルをインストールします。/usr/share/vim/vim64しかし、このパッケージもシンボリックリンクの更新/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(onを使用した動機は、vimcurrent/docs 自分のvimコメントを現在のドキュメントのシンボリックリンクと混在させることでした。)vimcurrent互換性シンボリックリンクは次のとおりです。現在、Debian ディストリビューションにはもう存在しません。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

各バージョンによって変更される互換性シンボリックリンクの他の例については、私のラップトップで私が知っている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

シンボリックリンクポイント - シンボルリンクの状況を解決するには、次の手順を実行します。

#! /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で指定されているように、パス名にまたは..シンボリックリンクコンポーネントを含めないでください。

関連情報