พิจารณาสคริปต์นี้
#! /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 เอกสารปัจจุบัน.) หมายเหตุว่าvimcurrent
symlink เข้ากันได้คือ
ไม่ได้อยู่ในการกระจาย 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
?