GNU Stow sembolik bir link olan bir istif dizini kullanabilir mi?


10

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.


Lütfen bu dolaylı ifadeden kaçınmanın faydalı olacağı bir örnek kullanım örneği verebilir misiniz? Ne mylinkkadar yerine sembolik olarak mylink2sırayla sembolik olarak hangi mydir? Nasıl Stow o gösteren sembolik oluşturmak olmadığına karar vermelidir ../mylink/package/fileya ../mylink2/package/fileya ../mydir/package/file?
Adam Spires

@AdamSpiers Umarım bu biraz yardımcı olur. İsterseniz bunu Github sorun izleyicisine de koyabilirim.
Nathaniel M. Beaver

Teşekkürler @Nathaniel. Evet, lütfen bu yardımcı olur!
Adam Spires

Yanıtlar:


7

Şimdilik bir yolu yok.

Dahili olarak, stowyola gitmek için chdir kullanarak verilen yolun mutlak kanonik yolunu bulun , ardından mutlak yol adını almak için POSIX getcwd () için Perl arabirimi olan POSIX modülünden getcwd () işlevini kullanın .

POSIX belirtildiği gibi, yol adı olan hiçbir bileşenleri içerecek .ya .., veya sembolik bağlantılardır.


1
Bunu doğru şekilde işlemek için uygulamanın nasıl düzeltileceğine dair öneriler çok açıktır. Çekme istekleri daha açıktır! :-) Referans olarak, sorun burada bildirilmiştir: github.com/aspiers/stow/issues/11
Adam Spires
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.