このスクリプトを考えてみましょう。
#! /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
両方のバージョンで利用可能です。
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
互換性シンボリックリンクは次のとおりです。現在、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で指定されているように、パス名にまたは..
シンボリックリンクコンポーネントを含めないでください。