কমান্ড লাইন থেকে আমি আসলে একটি সিএমলিংক লোকেশনে আছি কিনা তা কীভাবে বলবেন?


33

ধরুন আমার একটি ফোল্ডার রয়েছে:

cd /home/cpm135/public_html

এবং একটি প্রতীকী লিঙ্ক তৈরি করুন

ln -s /var/lib/class .

পরে, আমি সেই ডিরেক্টরিতে আছি:

cd /home/cpm135/public_html/class

pwdআমাকে বলতে আমি রাজি যাচ্ছে/home/cpm135/public_html/class

আমি "সত্যই" এর মধ্যে জানার কি কোনও উপায় আছে /var/lib/class? ধন্যবাদ



1
কিছু শেল আসলে আপনাকে একটি সিমলিংকের ভিতরে থাকতে দেয় না। উদাহরণস্বরূপ, fishশেলটি যখন সিমলিংকে এতে cdপ্রবেশ করবে তখন স্বয়ংক্রিয়ভাবে সমাধান করে ।
trysis

উত্তর:


56

আপনার pwdকমান্ডটি কীভাবে কনফিগার করা হয়েছে তার উপর নির্ভর করে এটি লজিক্যাল ওয়ার্কিং ডিরেক্টরি (আউটপুট দ্বারা pwd -L) যা সিমলিংকের অবস্থান বা শারীরিক কার্যনির্বাহী ডিরেক্টরি (আউটপুট pwd -P) যা সিমলিংক উপেক্ষা করে এবং "প্রকৃত" ডিরেক্টরি দেখায় তা দেখানোর ক্ষেত্রে এটি ডিফল্ট হতে পারে ।

সম্পূর্ণ তথ্যের জন্য আপনি করতে পারেন

file "$(pwd -L)"

একটি সিমিলিংকের ভিতরে, এটি ফিরে আসবে

/path/of/symlink: symbolic link to /path/of/real/directory

1
হ্যাঁ, -Pপতাকাটি আমার যা প্রয়োজন ছিল তা ছিল। ধন্যবাদ
অলিভার উইলিয়ামস

6
এছাড়াও শিরোনাম, শুধু ব্যবহারে প্রশ্নের উত্তর দেওয়ার জন্য test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(অথবা প্রতিস্থাপন && echo No symlinksসঙ্গে || echo Symlinks)।
একটি সিভিএন

1
এটি প্রতিধ্বনিত হওয়ার প্রয়োজন ছাড়াই প্রশ্নের পুরোপুরি উত্তর দেয়। ? যদি প্রশ্ন 'ছিল আমি যদি সিমলিঙ্ক ডিরেক্টরির মধ্যে আছি আমি কিভাবে একটি বার্তা প্রদর্শন না "তারপর প্রতিধ্বনি করতে হবে।
Arronical

file "$(pwd)"কেবলমাত্র তখনই কাজ করে যদি সিমলিংকটি সর্বশেষ ডিরেক্টরি উপাদান হয়। এটি সিডি করা অবস্থায় ওপির সিমিলিংকে সনাক্ত করে না /home/cpm135/public_html/class/foo/bar। আমি এমন কোনও কিছুই সম্পর্কে অবগত নই যা কোনও পথের নাম অনুসারে সমস্ত সিমলিংকের জন্য তথ্য মুদ্রণ করে তবে আপনি এটি ব্যবহার করতে পারেন realpath .যা আমার কাছে সমান বলে মনে হয়pwd -P
পিটার কর্ডেস

17

নোট যে pwdআসলে বিল্ট ইন একটি শেল। আপনার শেল এবং এর কনফিগারেশনের উপর নির্ভর করে ফলাফল পরিবর্তন হতে পারে। আরও বহনযোগ্য সমাধানের জন্য আপনার ব্যবহার করা উচিত /bin/pwd। ম্যানুয়াল পৃষ্ঠা থেকে স্নিপেট:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

সাধারণভাবে, আপনি যে কোনও ফাইল / ডিরেক্টরি ব্যবহার করে পুরো ক্যানোনিকাল পথটি সমাধান করতে পারেন readlink -freadlink -f .অনুরূপ কাজ করে pwd -P


2
যদিও আমি কঠোর উপায়ে শিখেছি যা readlink -fসমস্ত ইউনিসে উপলভ্য নয় (যেমন ওএস-এক্স-তে পাওয়া যায় না)
17

3

আপনি সত্যিই এতে আছেন /home/cpm135/public_html/class- "আমার বর্তমান ওয়ার্কিং ডিরেক্টরিটি কী" এর প্রশ্নের একমাত্র সঠিক উত্তর।

আপনি যখন উল্লেখ করেছেন /var/lib/class... এটি আপনি কোথায় ছিলেন সে সম্পর্কে সত্যই নয়, আপনি সেখানে কী পথে যেতেন সে সম্পর্কে আরও ।

আপনি যখন চালনা করেন /bin/pwd, এটি আপনার বর্তমান কার্য সম্পাদন ডিরেক্টরিটি দেখে। এবং .. ডিরেক্টরিগুলি (শীর্ষে থাকা তালিকাভুক্ত ls -la), কোন ডিরেক্টরিতে মেলে তার সাথে কাজ করে। এবং তারপরে পিছনে কাজ করা পর্যন্ত .. এবং। একই ডিরেক্টরি দেখুন। এটি সমস্ত কাজ শেষ হয়ে গেলে, এটি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি কী তা জানে।

যখন আপনি pwdশেলটি অন্তর্নির্মিতভাবে চালান , এটি এই প্রক্রিয়াটি অনুসরণ করে না (যদিও এটি প্রয়োজনে এটি কিছুটা করতে পারে) - পরিবর্তে, আপনি এখানে পৌঁছানোর পথটি মনে পড়ে। প্রতিবার আপনি যখন কোনও cdকমান্ড করেন, আপনার শেলটি মনে করে যে আপনি এখন কোথায় ছিলেন সেই পথের অংশ হিসাবে এবং pwdএটি আপনার সমস্ত cdকমান্ডের উপর ভিত্তি করে যা গণনা করেছে তা মুদ্রণ করে - যা আপনার প্রকৃত বা নাও হতে পারে ওয়ার্কিং ডিরেক্টরি।

আপনি যখন কিছু করেন ln -s . fooএবং foo- এ যুক্ত হন তখন বিষয়গুলি সত্যই অদ্ভুত হতে পারে cd- /bin/pwdবলবে আপনি এখনও একই ডিরেক্টরিতে রয়েছেন, তবে শেল বিল্টইন pwdআপনাকে বলবে যে আপনি রয়েছেন /foo/foo/foo/foo/foo/foo- যদিও এমন কোনও ডিরেক্টরি সত্যই বিদ্যমান নেই। (এটি বলেছিল - আপনি সম্ভবত এটিতে পারেন cd )

ডিরেক্টরিগুলির নতুন নামকরণ করা হলে বিভ্রান্তির আরেকটি উত্স রয়েছে। /bin/pwdতারপরে তাত্ক্ষণিকভাবে এই পরিবর্তনটি গ্রহণ করবে, তবে বিল্ট- pwdইনটি এমন না হবে যতক্ষণ না আপনি এমন কিছু না করেন যা এটি বলে দেয় যে পুরানো ডিরেক্টরি নামটির কোনও গুরুত্ব নেই।


1
আপনি প্রশ্নের উত্তর দিচ্ছেন না, আপনি এটি খারিজ করে দিচ্ছেন।
দিমিত্রি গ্রিগরিয়েভ

4
যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না , আমি মনে করি এটি শেলের pwdবিল্টিনের মধ্যে পার্থক্য বোঝার জন্য এবং /bin/pwdস্ট্যান্ড-একা সংস্করণ কীভাবে আরও দরকারী তথ্য সরবরাহ করে (যা মূল প্রশ্নের উত্তর দিতে পারে) ব্যাখ্যা করার জন্য এটি একটি দরকারী পোস্ট think
অ্যান্টনি জি - মনিকা

1
এই পার্থক্যগুলি সমস্ত উত্তর -Pএবং -Lউল্লিখিত বিকল্পগুলিতে সিদ্ধ হয় to সংক্ষেপে, কিছু বাস্তবায়ন একটিতে ডিফল্ট, কিছু অন্যটিতে। সেন্টো সিস্টেমে আমাকে হস্তান্তর করতে হবে, বাশের বিল্টিনটি যৌক্তিকের জন্য ডিফল্ট এবং /bin/pwdশারীরিক দিক থেকে ডিফল্ট হচ্ছে, তবে উভয়ই কমান্ড-লাইন উভয় বিকল্প গ্রহণ করে এবং ফলাফল দেওয়ার পরে সম্মত হয়।
আইএমএসওপি

1
প্রশ্নটি একটি ভুল ভিত্তির উপর ভিত্তি করে - 'আমি জানার কোনও উপায় আছে যে আমি / ভার্ / লিব / শ্রেণিতে "সত্যই" আছি?' যা বলেছিল ... এর প্রকৃত অর্থ কী তা ব্যাখ্যা করে, এটি তাকে সত্যিকারের সন্ধান করছে তা বুঝতে সহায়তা করে।
Pwd

1
আপনার যুক্তি পিছনের দিকে আছে। ls ..এর বিষয়বস্তু প্রদর্শন করবে /var/lib, না /home/cpm135/public_html cd ..বিশেষ: শেলটি "আপনি সেখানে কীভাবে এসেছেন" এর বিশেষ ট্র্যাকিং করে এবং আসলে কোনও chdir("..")সিস্টেম কল করে না । কার্নেলের সাথে সম্পর্কিত হিসাবে, আপনার শেলের বর্তমান কার্যকরী ডিরেক্টরি ( /proc/self/cwd) কেবল একটি মাউন্টপয়েন্ট: ইনড জোড়। এটি ডিরেক্টরিতে একটি ওপেন ফাইল বর্ণনাকারীর মতো, এই কারণেই ডিরেক্টরিটির নামকরণ করা আপনার শেলটি ভেঙে দেয় না। ( cd .শেলের $PWDভেরিয়েবলটি আপডেট করতে )। আপনি একটি দরকারী পয়েন্ট করছেন, সুতরাং আমি ঠিক হয়ে গেলে এটিকে উপস্থাপন করব
পিটার কর্ডেস

1

মূলত আপনি জিজ্ঞাসা করছেন যে বর্তমান ওয়ার্কিং ডিরেক্টরিটির প্রকৃত পথ প্রদর্শন করতে হবে কিনা। ঠিক আছে, অজগর এবং os.getcwd()ফাংশন আছে

আপনি নীচে যা দেখছেন তা হল আমার হোম ডিরেক্টরিতে অবস্থিত "ভার্চুয়ালবক্স ভিএমএস" ডিরেক্টরি থেকে একটি ছোট পরীক্ষা। বাস্তবে, এটি মাউন্ট করা বিভিন্ন হার্ড ড্রাইভে অবস্থিত একটি ভিন্ন ডিরেক্টরিতে একটি সিমিলিংক /mnt/HDD

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

যেমন আপনি দেখতে পাচ্ছেন, পাইথনের os.getcwd()ডিরেক্টরীটির আসল পথটি সমাধান করে, সিমলিংকের পথ নয়।

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