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, mylink
ben 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
stow
Komut, paket dizininin gerçek yolunu çözdüğü anlaşılıyor , bu yüzden işaret etmek yerine işaret ../mylink/package/file
ediyor ../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
stow
Symlink hedefi taşınmadıkça varsayılan davranışı iyidir. Ancak bazen istenen hedeflenen dizin taşınır. Örneğin, Debian üzerinde vim-runtime
paket , / usr / share / vim / altındaki dosyaları sürüme bağlı olan bir dizine yükler, örneğin /usr/share/vim/vim64
6.4 sürümü gibi . Ancak Pakette ayrıca ediyorum bir sembolik güncellemek
de /usr/share/vim/vimcurrent
geç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 stow
kullanı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 stow
için motivasyon, vimcurrent/docs
kendi vim notlarımı mevcut belgelere sembolik işaretlerle birleştirebilmektir.) vimcurrent
Uyumluluk 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 stow
olarak, 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-realpath
davranış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.
mylink
kadar yerine sembolik olarakmylink2
sırayla sembolik olarak hangimydir
? Nasıl Stow o gösteren sembolik oluşturmak olmadığına karar vermelidir../mylink/package/file
ya../mylink2/package/file
ya../mydir/package/file
?