জিএনইউ স্টো কি স্টো ডিরেক্টরি ব্যবহার করতে পারে যা প্রতীকী লিঙ্ক?


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কমান্ডটি প্যাকেজ ডিরেক্টরিটির রিয়েলপথটি সমাধান করেছে, সুতরাং ../mylink/package/fileএটি নির্দেশ করার পরিবর্তে এটি নির্দেশ করে ../mydir/package/file

এটি অত্যধিক ইন্ডিरेশন এড়ানোর জন্য অর্থবোধ করে, তবে এটি নিঃশব্দে ঘটে এবং সর্বদা কাম্য হতে পারে না। এই আচরণটি ঘিরে কাজ করার কোনও উপায় আছে কি?

সম্পাদনা: অনুরোধ অনুযায়ী, আমি উদাহরণ ব্যবহারের ক্ষেত্রে বর্ণনা করব যেখানে রিয়েলপথটি সমাধান করা অসুবিধাজনক।

প্রতীকী লিঙ্কগুলি কখনও কখনও সামঞ্জস্যের জন্য ব্যবহৃত হয় । দেবিয়ান এমনকি সরকারী নীতিতে এ সম্পর্কে কথা বলেন । প্রায়শই লক্ষ্য একটি একক ফাইল, তবে কখনও কখনও এটি ডিরেক্টরি হয় । আমার সিস্টেমে /usr/share/doc/একা একা কয়েকশ থাকতে পারে:

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

ডিফল্ট আচরণ stowততক্ষণ ঠিক থাকে যতক্ষণ না সিমলিংক টার্গেটটি সরানো হয়। তবে কখনও কখনও পছন্দসই লক্ষ্যযুক্ত ডিরেক্টরি সরানো হয়। উদাহরণস্বরূপ, দেবিয়ান-এ, vim-runtimeপ্যাকেজটি একটি ডিরেক্টরিতে / usr / share / vim / এর অধীনে ফাইলগুলি ইনস্টল করে যা সংস্করণটির উপর নির্ভর করে যেমন /usr/share/vim/vim64সংস্করণ 6.4। তবে, প্যাকেজ এছাড়াও হবে একটি সিমবলিক লিঙ্ক আপডেট/usr/share/vim/vimcurrentবর্তমান সংস্করণটি যে সরু। এর অর্থ একটি সিমলিংক যা বলছে say

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

দেবিয়ানের পরবর্তী প্রকাশটি এটিকে আপগ্রেড করলে ভেঙে যায়

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

কিন্তু একটি syMLink

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

উভয় সংস্করণে কাজ করবে।

যেহেতু 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 হ'ল বর্তমান ডকুমেন্টেশনের সাথে আমার নিজস্ব ভিআইএম নোটগুলি মিশ্রিত করতে সক্ষম হবে।) নোট করুন যে vimcurrentসামঞ্জস্যতা সিমিলিংক বর্তমান দেবিয়ান বিতরণগুলিতে আর উপস্থিত নেই , যদিও এটি আর্ক লিনাক্সের মতো অন্যদের মধ্যে থাকতে পারে ; আমি নিশ্চিত নই. যাই হোক না কেন, এখানে একটি স্ক্রিপ্ট যা ভিম ডকুমেন্টেশনের জন্য সাধারণ ধারণা দেয়:

#! /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

প্রতিটি সংস্করণের সাথে পরিবর্তনযোগ্য সামঞ্জস্যের অন্যান্য উদাহরণগুলির জন্য, এখানে আমার ল্যাপটপে আরও দুটি আমি জানি:

$ 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

সিমলিংক-পয়েন্ট-টু-সিমিলিং কেসটির সমাধান করতে:

#! /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) স্টো ডিরেক্টরিটি একটি সিমিলিংক হতে হবে এবং

2) উত্পন্ন সিমলিঙ্কগুলিতে সেই লিঙ্কটি সংরক্ষণ করা বাঞ্ছনীয়।

যদিও আমি এই বৈশিষ্ট্যের অভাবটিকে একটি বড় ঘাটতি হিসাবে বিবেচনা করি না stow, আমি আশা করি যে এই উদাহরণটি সর্বদা নীতিগত পথগুলি সমাধান না করার সম্ভাব্য কার্যকারিতাটি স্পষ্ট করে দেয়।


আপনি দয়া করে উদাহরণ ব্যবহারের ক্ষেত্রে একটি উদাহরণ দিতে পারেন যেখানে এই দিকনির্দেশনা এড়ানো সহায়ক হবে? কি হবে যদি mylinkপরিবর্তে সিমলিঙ্ক করতে mylink2যা আবার সিমলিঙ্ক mydir? স্টো কীভাবে সিদ্ধান্ত নিতে পারে যে এটি নির্দেশিত প্রতিলিঙ্ক তৈরি করবে ../mylink/package/fileবা ../mylink2/package/fileবা ../mydir/package/file?
অ্যাডাম স্পায়ার্স

@ অ্যাডামস্পিয়ার্স আমি আশা করি এটি কিছুটা সাহায্য করবে। আপনি চাইলে আমি গিথুব ইস্যু ট্র্যাকারটিতে এটি রাখতে পারি।
নাথানিয়েল এম বিভার

ধন্যবাদ @ নাথানিয়েল হ্যাঁ দয়া করে এটি সহায়ক হবে!
অ্যাডাম স্পায়ার্স

1
@ অ্যাডামস্পিয়ার্স সম্পন্ন! github.com/aspiers/stow/issues/11#issuecomment-507073811
নাথানিয়েল এম। বেভার

উত্তর:


7

আপাতত, উপায় নেই।

অভ্যন্তরীণভাবে, stowপথে প্রবেশের জন্য chdir ব্যবহার করে প্রদত্ত পাথের পরম ক্যানোনিকাল পাথটি সন্ধান করুন , তারপরে POSIX মডিউল থেকে getcwd () ফাংশনটি ব্যবহার করুন যা পরম পথের নাম পেতে POSIX getcwd () এর পার্ল ইন্টারফেস ।

POSIX হিসাবে নির্দিষ্ট পথ নাম কোন উপাদান যে থাকিতে হইবে .বা .., বা সিম্বলিক লিঙ্ক দেওয়া হয়েছে।


1
এটিকে সঠিকভাবে পরিচালনা করতে কীভাবে বাস্তবায়ন ঠিক করা যায় সে সম্পর্কে পরামর্শগুলি অত্যন্ত স্বাগত। টানুন অনুরোধগুলি আরও স্বাগত! :-) রেফারেন্সের জন্য, বিষয়টি এখানে প্রতিবেদন করা হয়েছে: github.com/aspiers/stow/issues/11
অ্যাডাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.