このスクリプトについて考えてみましょう。
#! /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では、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
両方のバージョンで動作します。
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
には、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/file
or../mylink2/package/file
またはorを指すシンボリックリンクを作成する必要があるかどうかをどのように決定すべき../mydir/package/file
ですか