Bu komut dosyasını düşünün.
#! /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
Çıktı
mylink: symbolic link to mydir
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
Koşmadan önce stowşöyle görünür:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
Çalıştırdıktan sonra stowüzerine, mylinkben böyle bakmak için beklenen:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mylink/package/file
Ancak bunun yerine şöyle görünür:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mydir/package/file
stowKomut, paket dizininin gerçek yolunu çözdüğü anlaşılıyor , bu yüzden işaret etmek yerine işaret ../mylink/package/fileediyor ../mydir/package/file.
Bu, çok fazla dolaydan kaçınmak için mantıklıdır, ancak sessizce gerçekleşir ve her zaman arzu edilmeyebilir. Bu davranışa geçici bir çözüm bulmak için bir yolu var mı?
Düzenleme: İsteğe bağlı olarak, realpath çözümlemesinin elverişsiz olduğu bir örnek kullanım durumunu anlatacağım.
Sembolik bağlantılar bazen uyumluluk için kullanılır . Debian bu konuyu resmi politikada bile konuşuyor . Genellikle hedef tek bir dosyadır, ancak bazen bir dizindir
. /usr/share/doc/Tek başıma sistemimde birkaç yüz var :
$ find /usr/share/doc -xtype d -type l | wc -l
325
stowSymlink hedefi taşınmadıkça varsayılan davranışı iyidir. Ancak bazen istenen hedeflenen dizin taşınır. Örneğin, Debian üzerinde vim-runtimepaket , / usr / share / vim / altındaki dosyaları sürüme bağlı olan bir dizine yükler, örneğin /usr/share/vim/vim646.4 sürümü gibi . Ancak Pakette ayrıca ediyorum bir sembolik güncellemek
de /usr/share/vim/vimcurrentgeçerli sürüme o sivri. Bu, işaret eden bir sembolik bağın
/usr/share/vim/vim64/doc/cmdline.txt
Debian'ın bir sonraki sürümü bu sürüme yükseltildiğinde
/usr/share/vim/vim70/doc/cmdline.txt
ama bir sembolik bağlantı
/usr/share/vim/vimcurrent/doc/cmdline.txt
her iki sürümde de çalışır.
Yana stowkullanımlar istif dizinin mutlak kanonik yolu, bir çağırma gibi
stow --dir=/usr/share/vim/vimcurrent --target=./my-vim-docs doc
aşağıdaki gibi sembolik bağlantılarla sonuçlanır:
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vim64/doc/cmdline.txt
böyle değil:
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vimcurrent/doc/cmdline.txt
(Kullanmak stowiçin motivasyon, vimcurrent/docs
kendi vim notlarımı mevcut belgelere sembolik işaretlerle birleştirebilmektir.) vimcurrentUyumluluk symlink'inin
artık Debian dağıtımlarında mevcut olmadığını ,
ancak Arch Linux gibi diğerlerinde olabileceğini unutmayın ; Emin değilim. Her durumda, vim dokümantasyonu için genel fikri veren bir komut dosyası:
#! /usr/bin/env bash
mkdir -p target
ln --symbolic /usr/share/vim/vim80 vimcurrent
stow --verbose --dir=./vimcurrent --target=./target pack
file target/dist
Çıktı:
LINK: dist => ../../../../../usr/share/vim/vim80/pack/dist
target/dist: symbolic link to ../../../../../usr/share/vim/vim80/pack/dist
Varsayımsal stowolarak, diyelim ki, denilen bir bayrak olabilir --no-realpath, böylece çıktı bunun yerine şöyle görünecektir:
LINK: dist => ./vimcurrent/pack/dist
target/dist: symbolic link to ./vimcurrent/pack/dist
Her sürümle değişen diğer uyumluluk simgeleri için, dizüstü bilgisayarımda bildiğim iki tane daha:
$ 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-to-symlink durumunu ele almak için:
#! /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
üretir:
f: mylink2
l mylink2 -> mylink
l mylink -> mydir
d mydir
ve sonra:
$ stow --verbose --dir=./mylink2 --target=./target package
$ file target/file
üretir:
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
buna karşılık
$ stow --no-realpath --verbose --dir=./mylink2 --target=./target package
$ file target/file
bunu üretecekti:
LINK: file => ../mylink2/package/file
target/file: symbolic link to ../mylink2/package/file
Bu nedenle varsayımsal --no-realpathdavranışta stow dizinine normal bir dizin gibi davranırdı.
Bu özellik, aşağıdaki durumlarda kullanılabilir:
1) istifleme dizini bir sembolik bağlantı olmalıdır ve
2) oluşturulan bağlantının bu bağın korunması arzu edilir.
Bu özelliğin eksikliğini büyük bir eksiklik olarak görmese de stow, umarım bu örnek kanonik yolları her zaman çözmemenin potansiyel faydasını açıklığa kavuşturur.
mylinkkadar yerine sembolik olarakmylink2sırayla sembolik olarak hangimydir? Nasıl Stow o gösteren sembolik oluşturmak olmadığına karar vermelidir../mylink/package/fileya../mylink2/package/fileya../mydir/package/file?