GNU Stow สามารถใช้ไดเรกทอรี stow ที่เป็นลิงก์สัญลักษณ์ได้หรือไม่?


10

พิจารณาสคริปต์นี้

#! /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คำสั่งแก้ไข realpath ไดเรกทอรีแพคเกจดังนั้นแทนที่จะชี้ไปที่จะชี้ไปที่../mylink/package/file../mydir/package/file

สิ่งนี้สมเหตุสมผลสำหรับการหลีกเลี่ยงการอ้อมมากเกินไป แต่มันเกิดขึ้นอย่างเงียบ ๆ และอาจไม่เป็นที่ต้องการเสมอไป มีวิธีแก้ไขพฤติกรรมนี้หรือไม่?

แก้ไข:ตามคำขอฉันจะอธิบายตัวอย่างการใช้กรณีที่การแก้ไข realpath ไม่สะดวก

การเชื่อมโยงสัญลักษณ์บางครั้งจะใช้สำหรับการทำงานร่วมกัน Debian แม้กระทั่งพูดเกี่ยวกับเรื่องนี้อย่างเป็นทางการในการกำหนดนโยบาย มักจะเป็นเป้าหมายเป็นไฟล์เดียว แต่ บางครั้งมันก็เป็นไดเรกทอรี ฉันบังเอิญมีระบบอยู่สองสามร้อยระบบ/usr/share/doc/:

$ find /usr/share/doc -xtype d -type l | wc -l
325

พฤติกรรมเริ่มต้นของstowไม่เป็นไรตราบใดที่เป้าหมาย symlink ไม่ถูกย้าย แต่บางครั้งไดเรกทอรีเป้าหมายที่ต้องการจะถูกย้าย ตัวอย่างเช่นบน Debian vim-runtimeแพ็กเกจจะติดตั้งไฟล์ภายใต้ / usr / share / vim / ในไดเร็กทอรีที่ขึ้นอยู่กับเวอร์ชันเช่น/usr/share/vim/vim64สำหรับเวอร์ชัน 6.4 อย่างไรก็ตามแพคเกจจะอัปเดต symlink ที่/usr/share/vim/vimcurrentชี้ไปที่เวอร์ชันปัจจุบันด้วย ซึ่งหมายความว่า symlink ชี้ไปที่พูด

/usr/share/vim/vim64/doc/cmdline.txt

จะแตกเมื่อเดเบียนรุ่นถัดไปอัปเกรดเป็น

/usr/share/vim/vim70/doc/cmdline.txt

แต่ symlink ไป

/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 ที่จะสามารถที่จะคลาคล่ำบันทึกเป็นกลุ่มของตัวเองควบคู่ไปกับ symlinks เอกสารปัจจุบัน.) หมายเหตุว่าvimcurrentsymlink เข้ากันได้คือ ไม่ได้อยู่ในการกระจาย Debian ปัจจุบัน , แม้ว่ามันอาจจะอยู่ในที่คนอื่นชอบ Arch ลินุกซ์ ; ฉันไม่แน่ใจ. ในกรณีใด ๆ นี่คือสคริปต์ที่ให้ความคิดทั่วไปสำหรับเอกสาร 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

สำหรับตัวอย่างอื่น ๆ ของ symlink ที่ใช้งานร่วมกันได้ซึ่งมีการเปลี่ยนแปลงในแต่ละเวอร์ชันนี่คืออีกสองสิ่งที่ฉันรู้ในแล็ปท็อปของฉัน:

$ 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 จะต้องเป็น symlink และ

2) เป็นที่พึงปรารถนาที่จะรักษาลิงก์นั้นไว้ใน symlink ที่สร้างขึ้น

ในขณะที่ฉันไม่ได้พิจารณาว่าการขาดคุณสมบัตินี้เป็นข้อบกพร่องที่ยิ่งใหญ่stowแต่ฉันหวังว่าตัวอย่างนี้จะอธิบายถึงประโยชน์ที่เป็นไปได้ของการไม่แก้ไขเส้นทางที่เป็นที่ยอมรับเสมอไป


คุณช่วยยกตัวอย่างการใช้กรณีที่การหลีกเลี่ยงความไม่สะดวกนี้มีประโยชน์ได้ไหม? จะทำอย่างไรถ้าmylinkแทนที่จะเชื่อมโยงกับส่วนmylink2ใดmydirบ้างที่เชื่อมโยงกับ วิธี Stow ควรตัดสินใจว่าควรสร้าง symlinks ชี้ไป../mylink/package/fileหรือ../mylink2/package/fileหรือ../mydir/package/file?
Adam Spires

@ AdamSpiers ฉันหวังว่าจะช่วยได้บ้าง ฉันสามารถใช้ตัวติดตามปัญหา Github ได้เช่นกันหากคุณต้องการ
นาธาเนียลเอ็มบีเวอร์

ขอบคุณ @ นาธาเนียล ใช่โปรดนั่นจะเป็นประโยชน์!
Adam Spires

คำตอบ:


7

สำหรับตอนนี้ไม่มีทาง

ภายในstowค้นหาเส้นทางที่ยอมรับเป็นสัมบูรณ์ของเส้นทางที่กำหนดโดยใช้chdirเพื่อย้ายเข้าไปในเส้นทางจากนั้นใช้ฟังก์ชันgetcwd ()จากโมดูล POSIX ซึ่งเป็นส่วนต่อประสาน Perl สำหรับPOSIX getcwd ()เพื่อรับชื่อพา ธ สัมบูรณ์

ตามที่ระบุไว้ POSIX ชื่อพา ธ ต้องไม่มีส่วนประกอบที่เป็น.หรือ..หรือเป็นลิงก์สัญลักษณ์


1
ข้อเสนอแนะเกี่ยวกับวิธีการแก้ไขการใช้งานเพื่อจัดการนี้อย่างถูกต้องยินดีต้อนรับ คำขอดึงยินดีต้อนรับมากขึ้น! :-) สำหรับการอ้างอิงปัญหาได้รับการรายงานที่นี่: github.com/aspiers/stow/issues/11
Adam Spires
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.