সিডি কেন একটি প্রোগ্রাম নয়?


128

আমি সবসময় ভাবতাম কেন cdকোনও প্রোগ্রাম নয়, তবে কখনই উত্তরটি সন্ধান করতে পারেনি।

কেহ কেন জানেন কেন এই ঘটনা?



1
আমার মনে আছে পড়ার (আমি কোথায় পাই না) যে মূল ইউনিক্স cdকমান্ডটি একটি পৃথক প্রোগ্রাম ছিল। শেলটি এটি বিশেষভাবে পরিচালনা করেছিল যাতে এটি হয়নি fork, ঠিক exec। এবং যখন cdসম্পন্ন করা হয়, এটি কার্যকর করা হবে sh। আমি জানি না এটি সত্য ঘটনা কিনা।
ক্যামহ

কি হতে পারে? যদি এটি বিশেষ হ্যান্ডলিং যুক্ত করতে চলেছে তবে এটি কেবল chdirসিস্কেলকে কল করতে পারে । উত্স: v1 এ V5 v7 (বোর্ন শেল প্রথম সংস্করণ)
Mikel

2
@ ক্যাম, এটি একটি সত্য গল্প। আমি ডেনিস এম। রিচি, "ইউনিক্স টাইম শেয়ারিং সিস্টেমের বিবর্তন", এটিএন্ডটি বেল ল্যাবরেটরিজ টেকনিক্যাল জার্নাল (৩ ()), পার্ট ২, অক্টোবর, ১৯৮৪
লেখা একটি নিবন্ধেও এটি পড়েছি

@ মাইকেল: আমি সম্মত হই যে এটি অর্থহীন বলে মনে হচ্ছে তবে আমি cdযে গল্পটি পড়েছিলাম তা নিয়ে কেবল গল্পটি রিলে করছি। আমি এর দিকটি সম্পর্কে স্পষ্টতই ভুল ছিলাম, এখন যে @ জেলিয়াগ্রে বিশদটি পূরণ করেছে।
ক্যামহ

উত্তর:


171

cdকমান্ড "বর্তমান কাজ ডিরেক্টরির", ডান পরিবর্তন?

"বর্তমান ওয়ার্কিং ডিরেক্টরি" এমন একটি সম্পত্তি যা প্রতিটি প্রক্রিয়াটির জন্য স্বতন্ত্র।

সুতরাং, যদি cdকোনও প্রোগ্রাম থাকে তবে এটি এটির মতো কাজ করবে:

  1. cd foo
  2. cdপ্রক্রিয়া শুরু হয়
  3. cdপ্রক্রিয়া ডিরেক্টরি পরিবর্তন সিডি প্রক্রিয়ার জন্য
  4. cdপ্রণালী থেকে প্রস্থান করা
  5. আপনার শেলটির এখনও একই কাজ রয়েছে, বর্তমান ওয়ার্কিং ডিরেক্টরি সহ আপনি এটি শুরু করার আগেই করেছিলেন।

8
আপনার পাঁচটি পদক্ষেপ সঠিক তবে " বাহ্যিক প্রোগ্রাম প্রয়োগের ক্ষেত্রে cdএটি " যদি এমন কোনও প্রোগ্রাম হয় তবে " এটি হওয়া উচিত" cd, এটি এটির মতো কাজ করে "।
jlliagre

1
সিস্টেম প্রোগ্রামার না হওয়া বা শেলটির সাথে ইন্টারঅ্যাক্ট করার প্রকৃতপক্ষে গভীর জ্ঞান না থাকায় আমি শেলটিটির বর্তমান কার্যকরী ডিরেক্টরিটি প্রকাশ করার আশা করতাম এবং সিডি এমন একটি প্রোগ্রাম হতে পারে যা সেই বৈশিষ্ট্যটি অ্যাক্সেস করে এবং পরিবর্তন করে দেয়। এই উত্তরটি দেখার পরে বোঝা, এটি সম্ভবত এটি বেশিরভাগ কারণে কীভাবে কাজ করে তার উপ-অনুকূল।
জেসন

108

cdশেল বিল্টিন হওয়ার পাশাপাশি, পসিক্স কমপ্লায়েন্ট ওএসেও একটি প্রোগ্রাম । তাদের অবশ্যই নিয়মিত ইউটিলিটির জন্য স্বতন্ত্র এক্সিকিউটেবলগুলি সরবরাহ করতে হবেcd । এটি উদাহরণস্বরূপ সোলারিস , এআইএক্স , এইচপি-ইউএক্স এবং ওএস এক্স এর ক্ষেত্রে

স্পষ্টতই, একটি বিল্টিন cdএখনও বাধ্যতামূলক কারণ এর বাহ্যিক প্রয়োগটি বর্তমান শেল ডিরেক্টরিটি পরিবর্তন করে না। তবে, পরবর্তীকালে এখনও দরকারী হতে পারে। এই cdআদেশটি কীভাবে ব্যবহার করা যেতে পারে তা POSIX কীভাবে কল্পনা করে তা দেখানোর একটি উদাহরণ এখানে দেওয়া হয়েছে :

find . -type d -exec cd {} \;

একটি POSIX সিস্টেমে, এটা oneliner সব ডিরেক্টরি আপনি অনুমতি দেওয়া হয় না জন্য একটি ত্রুটির বার্তা রিপোর্ট হবে cdসবচেয়ে জিএনইউ / লিনাক্স ডিস্ট্রিবিউশন, এটি যে ত্রুটির বার্তা যদিও সঙ্গে ব্যর্থ।

find: `cd': No such file or directory

এবং এখানে আপনার প্রশ্নের উত্তর, " সিডি কেন প্রোগ্রাম নয়? " মূল ইউনিক্স সহ-লেখকের একজন author খুব শীঘ্রই ইউনিক্স বাস্তবায়নের সময়, cd( chdirসেই সময়ে বানানটি ) ছিল একটি বাহ্যিক প্রোগ্রাম। এটি forkপ্রথম প্রয়োগ হওয়ার পরে অপ্রত্যাশিতভাবে কাজ করা বন্ধ করে দিয়েছে ।

ডেনিস রিচি উদ্ধৃত :

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

উত্স: ডেনিস এম রিচি, " ইউনিক্স টাইম শেয়ারিং সিস্টেমের বিবর্তন ", এটিএন্ডটি বেল ল্যাবরেটরিজ টেকনিক্যাল জার্নাল 63৩ ()), পার্ট ২, অক্টোবর, ১৯৮৪, পিপি। ১৫5–-৯৩

ইউনিক্স সংস্করণ 1 (মার্চ 1971) chdir ম্যানুয়াল পৃষ্ঠাতে বলা হয়েছে:

যেহেতু প্রতিটি কমান্ড কার্যকর করতে একটি নতুন প্রক্রিয়া তৈরি করা হয়েছে, chdir অকার্যকর হবে যদি এটি একটি সাধারণ কমান্ড হিসাবে লেখা থাকে। এটি শেল দ্বারা স্বীকৃত এবং কার্যকর করা হয়েছে।


10
... সুতরাং, স্পষ্টতই, পসিক্স আদেশ দেয় যে এখানে একটি স্বাধীন cdনির্বাহযোগ্য হবে, তবে এটি কোনও কিছুই করবে না (সম্ভবত ভুল তর্ক দিয়ে ডাকলে সম্ভবত ত্রুটি বার্তা প্রেরণ করা ব্যতীত)। রহস্যময়।
ইলমারি করোনেন

4
ওহ ভাল, যদি এটি সত্য হয় তবে পসিক্সের মধ্যে বোকামি জিনিস হবে না।
কাজ

5
POSIX সিডি পৃষ্ঠা এছাড়াও বলেন, "যেহেতু সিডি বর্তমান শেল সঞ্চালনের পরিবেশ প্রভাবিত করে, এটা সবসময় একটি শেল নিয়মিত বিল্ট-ইন হিসাবে প্রদান করা হয়।"।
মাইকেল

6
@ কাজ, তারা সম্পূর্ণ আলাদা জিনিস নয়। তারা একই কাজ করে তবে কেবল বিল্টইন বর্তমান শেলকে প্রভাবিত করে।
jlliagre

13
@ কাজ: আমি যখন কেবল একটি ঘটনা বলি তখন দয়া করে আমাকে নির্বোধ কল করবেন না। আপনি পসিক্সের সাথে একমত বা একমত হতে পারেন তবে মেসেঞ্জারকে গুলি করবেন না।
jlliagre

47

বাশ ভূমিকা ( শেল কী? ) থেকে:

শেলগুলি পৃথক ইউটিলিটিগুলির মাধ্যমে প্রাপ্ত অসম্ভব বা অসুবিধাগুলি কার্যকর কার্যকারিতা বাস্তবায়নের জন্য বিল্ট-ইন কমান্ডগুলির একটি বিল সেট (বিল্টিন) সরবরাহ করে। উদাহরণস্বরূপ, cd, break, continue, এবং exec) শেল বাইরে বাস্তবায়িত করা যাবে না কারন তারা সরাসরি শেল নিজেই নিপূণভাবে। history, getopts, kill, অথবা pwdbuiltins অন্যান্যের মধ্যে পৃথক ইউটিলিটি প্রয়োগ করা যেতে পারে, কিন্তু তারা এমন আরো অনেক builtin কমান্ডগুলি ব্যবহার সুবিধাজনক হয়। সমস্ত শেল বিল্টিনগুলি পরবর্তী বিভাগগুলিতে বর্ণিত হয়।


29

এ বছরের এপ্রিল ফুলের জন্য, আমি এর স্ট্যান্ডেলোন সংস্করণcd লিখেছিলাম ।

কেউ রসিকতা পায়নি। দীর্ঘশ্বাস.

যে কেউ নিশ্চিত যে cdশেলটি তৈরি করা উচিত তা অবশ্যই এটি ডাউনলোড করা উচিত, এটি তৈরি করা উচিত এবং এটি চেষ্টা করা উচিত।

এটির ম্যান পৃষ্ঠাটিও পড়ুন। :)


সত্যিই দরকারী কোড! :-)
ডিস্কুলজ

6
আপনি Gnu / লিনাক্সকে আরও পসিক্স অনুগত করার জন্য কাজ করছেন দেখে ভাল Good আপনার বাস্তবায়ন কেবল একটি ভাল রসিকতা নয়, তবে লিনাক্স বিতরণ থেকে কিছু হারিয়ে যাচ্ছে ...
jlliagre

8
আমি মনে করি আমি পসিক্স ইস্যুর উদ্ধৃতি দিয়ে পরের বছর আবার চেষ্টা করব ;)
ওয়ারেন ইয়ং

6 বছর পরে: আচ্ছা, তাই না?
পিটার এ স্নাইডার

@ পিটারএ.স্নাইডার: আমি ভেবেছিলাম যে এটি স্পষ্ট যে আমি মজা করছি, তাই স্পষ্ট করে বলার জন্য, না, আমি বর্তমানে এটি সিএসউইনের মতো ওএস এবং ওএস-এর মতো প্রকল্পগুলিতে আনার চেষ্টা করে একটি প্রচুর প্রচেষ্টা ব্যয় করতে যাচ্ছি না। অভাব /bin/cd। আপনি যদি আমার কোডটি নিতে চান এবং এটি নিজের ব্যক্তিগত অনুসন্ধান করতে চান তবে আপনাকে স্বাগত জানাই।
ওয়ারেন ইয়ং

4

cdশেল কমান্ড একটি পৃথক প্রক্রিয়া হতে পারে না একটি ভিন্ন প্রক্রিয়া (এমনকি পিতা বা মাতা প্রক্রিয়ার মধ্যে) বর্তমান কাজ ডিরেক্টরির পরিবর্তনের কোনো প্রক্রিয়া কারণ ইউনিক্স সেখানে।

যদি অন্য cdকোনও প্রক্রিয়া হত তবে তার প্যারেন্ট (শেল) এর বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে হবে যা ইউনিক্সে সম্ভব নয়। পরিবর্তে cdএকটি বিশেষ বিল্ট ইন কমান্ড। শেলটি তার নিজস্ব বর্তমান ওয়ার্কিং ডিরেক্টরিটি পছন্দ করে chdir()fchdir()পরিবর্তন করে বলে।

দ্রষ্টব্য: কার্নেল প্রতিটি প্রক্রিয়াটির জন্য বর্তমান ওয়ার্কিং ডিরেক্টরিের ইনোড নম্বর সংরক্ষণ করে। শিশু প্রক্রিয়াটি cwdতার পিতামাতার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ।


0

সিডি হ'ল শেল বিল্ট ইন কমান্ড। যত সহজ। লোকটি সিডি সব বলে। সিডি কমান্ড সমস্ত দোভাষী এবং (থ্রেডযুক্ত পরিবেশে) সমস্ত থ্রেডের জন্য ওয়ার্কিং ডিরেক্টরি পরিবর্তন করে।


কারণ শেলটি এমন পরিবেশ যা আপনার বর্তমান ওয়ার্কিং ডায়ারগুলি ($ PDW ...) বা সিডেবল_ভারগুলি যত্ন করে। এই বিল্টিনটি চূড়ান্তভাবে এমনভাবে হয় যে সমস্ত ব্যবহারকারীর দ্বারা দৃশ্যমান কমান্ডগুলি বর্তমান কার্যক্ষম ডিরেক্টরিটি পরিবর্তন করে change আপনি এটি সেভাবে পরীক্ষা করতে সক্ষম হন: সিডিসি ছাড়াই ব্যাশ সংকলন করুন এবং আপনার নিজের সিডি স্ক্রিপ্টটি লেখার চেষ্টা করুন, যা সমস্ত পরিবেশ সিডিএল_ভারগুলি যত্ন নেওয়ার চেষ্টা করে। এই প্রশ্নটি আরও সম্পর্কিত সম্পর্কিত বিকাশকারী। আমি বাজি ধরছি তারা আপনাকে আরও গভীরভাবে এই প্রশ্নের উত্তর দিতে পারে।

2
অন্তর্নির্মিত একটি খুব ভাল প্রযুক্তিগত কারণ cdআছে। আমি আপনাকে সর্বোচ্চ র‌্যাঙ্কড উত্তর পড়ার পরামর্শ দিচ্ছি এবং আপনার উত্তর কীভাবে উন্নত করা যায় তা বিবেচনা করব।
থরবজর্ন রাভন অ্যান্ডারসন

সর্বোচ্চ র‌্যাঙ্কিংয়ের উত্তরটি আমি সবচেয়ে খারাপ পড়েছি! তবে হাহ? আমি কে!

3
তবে কেন এই প্রশ্নের উত্তর দেয় ।
থরবজর্ন রাভন অ্যান্ডারসন

-1

আমি মনে করি জনগণের উত্তরগুলির মধ্যে একটি জিনিস অনুপস্থিত তা হ'ল বর্তমান ডিরেক্টরিটি পরিবেশগত পরিবর্তনশীল যা প্রতিটি প্রোগ্রাম পরিবর্তন করতে পারে। আপনি যদি আপনার বর্তমান পরিবেশের ভেরিয়েবল তালিকাটি দেখতে 'এক্সপোর্ট' কমান্ড ব্যবহার করেন তবে আপনার কাছে রয়েছে:

declare -x PWD="/home/erfan"

আপনার ফলাফল সুতরাং সিডি কমান্ড দ্বারা আমরা কেবল এই অভ্যন্তরীণ ভেরিয়েবলটি পরিবর্তন করতে চাই। আমি মনে করি যদি আমরা চেষ্টা করি, তবে অবশ্যই আমরা শেলের যেকোন pty এর PWD ভেরিয়েবলটি চেজ করতে পারি। ভালো লেগেছে:

cder    #change current PTY $PWD variable

তবে আমি মনে করি সাধারণ ক্ষেত্রে কোনও প্রয়োজন নেই। অন্য কথায়, আমরা এর অভ্যন্তরীণ ভেরিয়েবল সংজ্ঞায়িত করার জন্য ব্যাশ (বা কোনও শেল) থেকে সহায়তা নিই।


3
যদিও এটি সত্য যে বোর্ন শেলগুলি বর্তমান ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) কে $ পিডাব্লুডি হিসাবে প্রকাশ করে, এটি প্রাথমিক সঞ্চয় স্থান নয়; আসল অবস্থান কার্নেলের প্রতি-প্রক্রিয়া কাঠামোর মধ্যে। সুতরাং এটি বলা ভুল যে সিডাব্লুডি "একটি পরিবেশের পরিবর্তনশীল" " যদি এটি আপনি যেভাবে পরামর্শ দেন সেভাবে কাজ করে, এই সি দ্বি- লাইনারটি ..আপনি যে পথটি থেকে শুরু করেছিলেন তা নয়, পাথটি মুদ্রণ করবে : #include <stdlib.h> int main(void) { chdir(".."); puts(getenv("PWD")); }(সি শেলগুলি পরিবর্তে, সিডাব্লুডিকে% cwd হিসাবে প্রকাশ করে))
ওয়ারেন ইয়ং

আপনার অ্যাপে আরও কিছু লাইন যুক্ত করতে দিন। # অন্তর্ভুক্ত <stdlib.h> int প্রধান (শূন্য)) chdir (".."); রাখে (getenv ( "গণপূর্ত")); সেটেনভ (পি "পিডব্লিউডি", "/", 1); রাখে (getenv ( "গণপূর্ত")); Results ফলাফল হিসাবে আমাদের কী থাকবে?
এরফংকাম

3
এটি কেবলমাত্র একটি ভেরিয়েবলের মানটি ওভাররাইট করবে, সিডাব্লুডিতে কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই। এই দেখাতে হবে যে একটি ভাল পরীক্ষা #include <unistd.h> int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }এটা ডিরেক্টরি আপনি, থেকে নয় প্রোগ্রাম শুরু দেখাবে /
ওয়ারেন ইয়ং

আমি মনে করি প্রতিটি প্রক্রিয়া একটি ওয়ার্কিং ডিরেক্টরি এবং পাথ ভেরিয়েবল আছে। সুতরাং আপনি chdir দ্বারা প্রক্রিয়া এই বৈশিষ্ট্য পরিবর্তন। শেলের এই বৈশিষ্ট্যটিও খুব বেশি এবং সিডির মাধ্যমে আমরা এই বৈশিষ্ট্যটি সংশোধন করি।
এরফানকাম

4
না, আমি আপনাকে বলছি যে $PWDবোর্ন শেলটির কেবল অর্থ রয়েছে। শেলটি স্ক্রিপ্টগুলি শেল করার জন্য যা কিছু জানে তার সাথে যোগাযোগ pwdকরার এটি কেবল একটি উপায় যাতে এটি সন্ধানের জন্য তাদের কল করতে হবে না। মানটির উপর নির্ভর করে যে কোনও স্ট্যান্ডেলোন প্রোগ্রাম $PWDঅবিশ্বাস্য হবে।
ওয়ারেন ইয়ং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.