ডিরেক্টরি এবং আপেক্ষিক পাথের প্রতীকী লিঙ্ক


15

আমি ডিরেক্টরি (ব্লিঙ্ক) এর নিখুঁত পথ সহ সিমলিংক তৈরি করেছি এবং উদাহরণস্বরূপ নিম্নলিখিত গাছটি করেছি:

$ ls -l /tmp/A
total 0
lrwxrwxrwx 1 root root 6 Apr  3 12:27 Blink -> /tmp/B
-rw-r--r-- 1 root root 0 Apr  3 12:27 foo

$ ls -l /tmp/B
total 0
-rw-r--r-- 1 root root 0 Apr  3 12:27 bar

তারপরে আমি / tmp / A এ যাই এবং ডিরেক্টরিটি ব্লিঙ্কে পরিবর্তন করি:

$ cd /tmp/A
$ pwd
/tmp/A
$ cd Blink
$ pwd
/tmp/A/Blink

cd ..আমাকে প্রত্যাবর্তন করে /tmp/A তবে আমি উদাহরণস্বরূপ লিখলে ls ../fooআমার ত্রুটি হবে:

ls: ../foo: No such file or directory

বিল্টিন সিডি কমান্ডটি প্রয়োজন অনুসারে সমাধানের পথটি তৈরি করে তবে বহিরাগত ls .. টিএমপি / বি এর উচ্চ স্তরের হিসাবে বিবেচনা করে এবং এর ফলে ফু খুঁজে পাওয়া যায় না।

এখানে কি সমস্যা? আমি কি / টিএমপি / এ / ব্লিঙ্কের কাছ থেকে ../foo এর মতো আপেক্ষিক পথে ফু ফাইল পেতে পারি?


একই প্রশ্নে ক্রস পোস্ট করা হয় superuser
Peter.O

উত্তর:


13

আমি মনে করি না আপনি এটি করতে পারেন। শেলগুলি আজকাল তারা কোথায় ছিল সেগুলি ট্র্যাক করে রাখে, তারা চালিয়ে যাওয়ার জন্য কেবল ফাইল সিস্টেম এবং ওএসের উপর নির্ভর না করে নাম অনুসারে বর্তমান ওয়ার্কিং ডিরেক্টরিটি ট্র্যাক করে। তার মানে বিল্ট- cdইনগুলি কেবল ".." সরাসরি চেইন অনুসরণ না করে প্রতীকী লিঙ্কটিকে "ব্যাক আপ" যেতে পারে।

তবে আপনি যখন চালনা করছেন ls ../foo, lsসচেতন নয় যে শেলটি প্রতীকী লিঙ্কগুলি অনুসরণ করে কোনও ডিরেক্টরিতে পেয়েছে। "../foo" এ lsএকটি করবে stat()। ".." অংশটি বর্তমান ডিরেক্টরি থেকে এসেছে, যার পিতামাতার জন্য কেবল একটি "" "প্রবেশ রয়েছে। পুরো প্রতীকী লিঙ্ক জিনিসটি ডিরেক্টরিগুলির একটিতে যেভাবে পরিবর্তন হয় তা "" পরিবর্তন করে না " এবং একটি একক ".." এন্ট্রি। সিম্বলিক লিঙ্কগুলি কার্নেলটিকে ফাইল পাথগুলিতে ইন্ডিয়ারেশনের একটি অতিরিক্ত স্তর প্রবেশ করতে দেয়। যখন আপনাকে "../whatever" পাস open()বা stat(), কার্নেল মাত্র প্রক্রিয়া চিত্র আউট যা একক ডিরেক্টরি দ্বারা নামকরণ করা হয় থেকে কল করছেন সাম্প্রতিক কাজ করা ব্যবহার করে ".."।


17

শেলটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে সঞ্চয় করে $PWD। এটা কি শেল builtins জন্য ব্যবহৃত হচ্ছে cdএবং pwd, এবং এটি, স্বাভাবিক ডিরেক্টরি যেমন symlinks একইরূপে হিসাবে আপনি দেখেছি। কখনও কখনও এটি সহায়ক, কখনও কখনও না।

আপনি ব্যবহার করে আসল ডিরেক্টরিটি খুঁজে পেতে পারেন pwd( help pwdআরও তথ্যের জন্য টাইপ করুন):

$ pwd
/tmp/A/Blink
$ pwd -L
/tmp/A/Blink
$ pwd -P
/tmp/B

তেমনি, cdএকটি বিকল্প আছে -P(আবার, help cdআপনার বন্ধু):

$ cd /tmp/A/Blink
$ pwd
/tmp/A/Blink
$ cd -P ..
$ pwd -P
/tmp

অবশেষে, আপনি "বৈশিষ্ট্য" পুরোপুরি বন্ধ করতে পারেন:

$ set -P
$ cd /tmp/A/Blink
$ pwd
/tmp/B

ধন্যবাদ, আমি সেট-পি বৈশিষ্ট্য সম্পর্কে সচেতন, কিন্তু
এলএস

আমি যেমন বলেছি, ব্যবহার set -Pএবং ls আচরণটি বোঝার জন্য শুরু হয়। :)
এএমএস

2

ব্রুস এবং আমস পিছনে আচরণ ব্যাখ্যা করে সুন্দর উত্তর দিয়েছেন। তবে আপনি ls ../fooযা যা চেয়েছিলেন তা করতে আপনি এরকম কিছু নিয়ে যেতে পারেন

ls $(dirname $PWD)/foo

1

আপনি এটি করতে পারবেন না, কারণ /tmp/A/Blink এটি আসলে /tmp/B। সুতরাং, ls ../A/fooকাজ করে।

পরিবর্তে আপনি এটা দরকারী সক্ষম হতে খুঁজে পেতে পারেন সিডি থেকে বাস্তব /tmp/B ডিরেক্টরি, বরং ওরফে চেয়ে /tmp/A/Blink। এটি করতে, আপনি এর পরিবর্তে নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন cd(যা আপনি আপনার .bashrc এ রাখতে পারেন)

lcd() { cd $(readlink -f "$1"); }

lcdঅবশ্যই, বিরক্তিকর সাধারণ এবং প্রতীকযুক্ত ডিরেক্টরিতে কাজ করে।
দ্রষ্টব্য: readlink -fলিঙ্কের চূড়ান্ত লক্ষ্য নিয়ে কাজ করে (যখন লিঙ্কগুলি ডেইজি বেঁধে রাখা হয়) ..


1
cd -Pসহজ বলে মনে হচ্ছে
jw013

@ jw013: আপনি ঠিক বলেছেন; এটা. আমি এটি সম্পর্কে অবগত ছিলাম না .. ধন্যবাদ ..
পিটার.ও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.