পিডাব্লুডি এবং / বিন / পিডাব্লুডির মধ্যে অদ্ভুত পার্থক্য


15

আমি বর্তমান ডিরেক্টরিটিতে একটি সিমিলিংক যুক্ত করেছি ln -s . aa। যদি আমি cd aaমৃত্যুদন্ড কার্যকর করি এবং তারপরে আমি মৃত্যুদণ্ড কার্যকর করি pwdতবে প্রতিক্রিয়া হয় /home/sim/aa

তবে আমি যদি /bin/pwdএটি চালনা করি তবে এটি মুদ্রণ করে /home/sim(বর্তমান ডিরেক্টরিটি পরিবর্তন হয়নি)।

এই পার্থক্যটি কোথা থেকে আসে?

উত্তর:


17

বাশ সহ বেশিরভাগ শেলের মধ্যে pwdএকটি শেল বিল্টিন রয়েছে:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

আপনি যদি ব্যবহার করেন তবে বিল্টিনের মতো একই ফলাফল পেতে আপনাকে বিকল্পটি /bin/pwdব্যবহার করতে হবে :-Lpwd

$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test

ডিফল্টরূপে, /bin/pwdপ্রতিলিঙ্কগুলি উপেক্ষা করে প্রকৃত ডিরেক্টরি মুদ্রণ করে।

থেকে info pwd:

`-L'
`--logical'
     If the contents of the environment variable `PWD' provide an
     absolute name of the current directory with no `.' or `..'
     components, but possibly with symbolic links, then output those
     contents.  Otherwise, fall back to default `-P' handling.

`-P'
`--physical'
     Print a fully resolved name for the current directory.  That is,
     all components of the printed name will be actual directory
     names--none will be symbolic links.

বিল্ট- pwdইনটিতে -Pবিকল্পটি ব্যবহৃত না হওয়া বা -o physicalসেট বিল্টইন সক্ষম থাকা ব্যতীত ডিফল্টরূপে সিমলিংক অন্তর্ভুক্ত থাকে ।

থেকে man bash:

pwd [-LP]
              Print the absolute pathname of the  current  working  directory.
              The pathname printed contains no symbolic links if the -P option
              is supplied or the -o physical option to the set builtin command
              is  enabled.  If the -L option is used, the pathname printed may
              contain symbolic links.  The return status is 0 unless an  error
              occurs  while  reading  the  name of the current directory or an
              invalid option is supplied.

আমি বুঝতে পারছি না যে এই পার্থক্যগুলি থেকে কোথা থেকে আসে
ব্যবহারকারী 3581976

/bin/pwdডিফল্টরূপে সিমলিংক উপেক্ষা করুন, info pwdআমার উত্তরে অংশটি পড়ুন : বর্তমান ডিরেক্টরিটির জন্য একটি সম্পূর্ণ সমাধান করা নাম মুদ্রণ করুন। অর্থাৎ মুদ্রিত নামের সমস্ত উপাদানগুলি প্রকৃত ডিরেক্টরি নাম হবে - কোনওটি প্রতীকী লিঙ্ক হবে না।
cuonglm

@ ব্যবহারকারী 3581976: আরও পরিষ্কারভাবে আমার আপডেট দেখুন।
cuonglm

পিডাব্লুডির জন্য এটি একটি এল-কমান্ড রয়েছে যদিও এটি ডিফল্টরূপে সেট করা আছে? এবং শেল পিডাব্লুডি চালানোর জন্য / bin / pwd কমান্ড ব্যবহার করে না?
ব্যবহারকারী 3581976

2
@ ইউজার 3581976: আপনি নিজের শেলটি দিয়ে যে চিত্রটি শুরু করেছেন set -o physical, সেটি এখন ডিফল্টরূপে অপশন pwdহিসাবে ব্যবহার করা হচ্ছে -P, যদি আপনার -Lবিকল্প না থাকে তবে আপনি কীভাবে প্রিন্ট করবেন সিমলিংক? https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.htmlকি set -o physicalকরে তা জানতে এটি পড়ুন ।
কিউংলম

7

এই প্রক্রিয়াটির পক্ষে বর্তমান সিস্টেমের কার্যনির্বাহী ডিরেক্টরি নির্ধারণের জন্য ফাইল সিস্টেমকে জিজ্ঞাসাবাদ করা সম্ভব হয় এবং এই প্রশ্নের উত্তর হিসাবে বিষয়টিতে থাকা কিছুটা জটিল বলে একটি পদ্ধতি ব্যবহার করে। এই কি pwdপ্রোগ্রাম এবং getcwdলাইব্রেরি ফাংশন না। ইউনিক্সের প্রথম দিনগুলিতে, আপনার ওয়ার্কিং ডিরেক্টরিটি কী তা জানার একমাত্র উপায় ছিল। আপনার প্রশ্নের উত্তরের অংশটি যা আমি অন্য কোনও উত্তর, বা এই সাইটের অন্য কোথাও (42 সেকেন্ডের পরে অনুসন্ধানের উপযুক্ত) খুঁজে পাচ্ছি না:

  • শেলটি শুরু হওয়ার সাথে সাথে এটির বর্তমান কার্যকরী ডিরেক্টরিটি পাওয়া যায় (সম্ভবত কল করে getcwd)।
  • এরপর, যখনই আপনি কি একটি cd, pushdবা popd, শেল ট্র্যাক রাখে কাজ ডিরেক্টরি স্ট্রিং ম্যানিপুলেশন ফাংশন ব্যবহার করে করুন। উদাহরণ স্বরূপ,

    • যদি আপনার ওয়ার্কিং ডিরেক্টরি হয় /home/simএবং আপনি টাইপ করেন তবে আপনার কার্যকরী ডিরেক্টরিটি cd ..শেল গণনা করে /home
    • যদি আপনার ওয়ার্কিং ডিরেক্টরি হয় /home/simএবং আপনি টাইপ করেন cd .তবে শেলটি গণনা করে যে আপনার কার্যকরী ডিরেক্টরিটি এখনও রয়েছে /home/sim
    • যদি আপনার ওয়ার্কিং ডিরেক্টরি হয় /home/simএবং আপনি টাইপ করেন cd aaতবে শেলটি আপনার কার্যনির্বাহী ডিরেক্টরিটি গণনা করে /home/sim/aa- এটি aaপ্রতীকী লিঙ্ক কিনা তা পরীক্ষা করে না ।

    কল করার "ব্যয়" বাঁচাতে এটি এটি করে getcwd। তবে এটি একটি বাণিজ্য বন্ধ, যেহেতু এটির ফলে ভুল তথ্যের ফলাফল হতে পারে।

  • pwd(Builtin) কমান্ড কেবল শেল এর স্মরণ / কি কাজ ডিরেক্টরি হয় নির্ণিত ধারণা প্রদর্শন করা হয়।
  • এছাড়াও, শেলটি ব্যবহারকারীর প্রক্রিয়াগুলির সুবিধার্থে , ওয়ার্ল্ড ডিরেক্টরিটি পিডব্লুডি এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে কী রয়েছে তার তার মনে রাখা / গণিত ধারণা রাখে । কোনও প্রক্রিয়া কখনই সঠিক তথ্য চাইলে এটির উপর নির্ভর করা উচিত নয়।

সুতরাং, নীচের লাইনটি হ'ল শেলটি এটি কোথায় রয়েছে তা সম্পর্কে বিভ্রান্ত হতে পারে। তবে আপনি যদি টাইপ করেন /bin/pwd, এটি একটি পৃথক প্রক্রিয়াতে চলবে যা কার্যকরী ডিরেক্টরিটি কী তা সম্পর্কে শেলের ধারণার অ্যাক্সেস নেই এবং তাই এটি সত্যিকারের কার্যকরী ডিরেক্টরিটি নিজেই নির্ধারণ করে, পুরাতন পদ্ধতি ed (ব্যতিক্রম: /bin/pwdপ্রোগ্রামটি PWD এনভায়রনমেন্ট ভেরিয়েবলের দিকে নজর দিতে পারে এবং আপনি নির্দিষ্ট করার সময় স্পষ্টতই তা ঘটবে -L)) শেল কীভাবে বিভ্রান্ত হতে পারে তার আরও একটি উদাহরণ এখানে:

cd /home/sim/aa # অনুমান /home, /home/simএবং /home/sim/aa
# সব বাস্তব ডিরেক্টরি (না সিম্বলিক লিংক) হয়।
pwd # আউটপুট: /home/sim/aaযা সঠিক।
mv ../aa ../bb
pwd # আউটপুট: /home/sim/aaযা ভুল।
/bin/pwd # আউটপুট: /home/sim/bbযা সঠিক।


এবং, আপনি যদি এ বিষয়ে পরিষ্কার হন না, যদি আপনি টাইপ করেন ln -s . aaএবং cd aa, আপনার টাইপ করার সময় আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তিত হয়নি , এটির চেয়ে আর কোনও কিছুই নেই cd .- কারণ, আপনি টাইপ করার সময় এটিই মূলত আপনি যা করছেন cd aa


ধন্যবাদ, খুব ভাল উত্তর, এটিই আমি অপেক্ষা করছিলাম;)
ব্যবহারকার 3581976

2
এই উত্তরটি কিছুটা বাঁকানো মনে হচ্ছে । সাশ্রয় ব্যয়-L ব্যতীত আরও অনেক কিছুই রয়েছে - এবং এটি একটি ব্যবহারকারী-সংজ্ঞায়িত POSIX- নির্দিষ্ট পরিবেশের পরিবর্তনশীল - ব্যবহারকারী-স্পেস অ্যাপ্লিকেশনগুলির সম্ভবত এটি বিশ্বাস করা উচিত (যার অর্থ যাই হোক না কেন ...?) । যাইহোক, যদিও আমি সিমলিংকের কোনও অনুরাগী নই, তবে ব্যবহারকারীদের যতটা পাগল দিকগুলি তাকে বা তার সাথে বেছে নেওয়া উচিত তা পরোক্ষভাবে প্রচার করা - এবং এটাই কোনও কিছুর চেয়ে বেশি বিষয়। $PWD -L
মাইকজার্ভ

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