কেন "কমান্ড" সিডির জন্য কাজ করবে না? আমি `সিডির জন্য এক্সিকিউটেবলটিও খুঁজে পাচ্ছি না!


30

আমি চেষ্টা করেছিলাম which cdএবং এটি কোনও পথ দেয়নি তবে পরিবর্তে প্রস্থান কোড 1 (দিয়ে গেছে echo $?) দিয়েছিল। কোর্টিল cdনিজেই কাজ করছে, তাই এক্সিকিউটেবল সেখানে থাকা উচিত, তাই না? আমি একটি দৌড়ে findজন্য cd, কিন্তু কোন এক্সিকিউটেবল দেখানো ফাইল ছিল। তাহলে কীভাবে এটি বাস্তবায়ন হয়?

হালনাগাদ:

আমার অন্য পোস্টে এটি জিজ্ঞাসা করা উচিত কিনা তা আমি জানি না তবে যেহেতু আমার মনে হয় এটি এখানে ভাল, তাই আমি পোস্টটি প্রসারিত করছি (?) ... সুতরাং উত্তরটি আসলে বেশ সহজ ছিল, এর জন্য কোনও কার্যকরযোগ্য নেই - কারণ এটি একটি বিল্টিন - তবে আমি কিছু বিল্টিন (ফেডোরায় ব্যাশ শেল) এর এক্সিকিউটেবল ফাইল পেয়েছি! সুতরাং অন্তর্নির্মিত -> কোনও নির্বাহযোগ্য ঠিক নয় বলে আমি মনে করি? সম্ভবত কোনও বিল্টিনগুলি আসলে কী (বিল্টিন কমান্ড?) ব্যাখ্যা করে এমন একটি উত্তর যা আসলে এখানে বিষয়টির দিকে বেশি মনোনিবেশ করার পরিবর্তে cd... এখানে পোস্ট করা কিছু ভাল লিঙ্ক ইঙ্গিত দেয় যে বিল্টইনগুলি প্রোগ্রাম নয় ... তাই তারা কী? তারা কিভাবে কাজ করে? এগুলি কি কেবল শেলের ফাংশন বা থ্রেড?


1
এই উত্তরটি পড়ুন । এটি typeকমান্ডটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে
c0rp

7
cdএকটি বিল্টিন হওয়া দরকার কেন এই প্রশ্নোত্তরটি দেখুন : সিডি কেন কোনও প্রোগ্রাম নয়? এবং typeএটির চেয়ে কেন এটি সর্বোত্তম which: কেন "কোন" ব্যবহার করবেন না? তাহলে কী ব্যবহার করবেন?
টেরডন

অনুরূপ প্রশ্ন এখানে: askubuntu.com/q/613470/178596
উইল্ফ

উত্তর:


46

কমান্ড কার্যকর cdহতে পারে না

শেলের মধ্যে, cd"অন্য ডিরেক্টরিতে যেতে" বা আরও আনুষ্ঠানিকভাবে, ক্যুরেন্ট ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) পরিবর্তন করতে ব্যবহৃত হয়। বাহ্যিক আদেশ হিসাবে এটি কার্যকর করা অসম্ভব:

ডিরেক্টরিটি একটি প্রক্রিয়ার অন্তর্ভুক্ত

কিউরেন্ট ওয়ার্কিং ডিরেক্টরিটি এমন একটি ডিরেক্টরি যা ফাইলগুলি অ্যাক্সেস করতে ব্যবহার করা যেতে পারে এমন একটি সম্পূর্ণ পাথ পাওয়ার জন্য আপেক্ষিক পাথের ব্যাখ্যার জন্য ব্যবহৃত হয়। আপেক্ষিক পাথগুলি অনেক জায়গায় ব্যবহৃত হয় এবং এক প্রক্রিয়াতে ব্যাখ্যাটি অন্য প্রক্রিয়াটিকে প্রভাবিত করে না।
এই কারণে, প্রতিটি প্রক্রিয়াটির নিজস্ব নিজস্ব চলমান ডিরেক্টরি রয়েছে।

cdউদাহরণস্বরূপ, শেল প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করার বিষয়ে bash

যদি এটি বাহ্যিক কমান্ড হয়, তবে একটি নির্বাহযোগ্য পথে, চালানো চালানো চালকের বর্তমান শেলটি প্রভাবিত না করে তার নিজস্ব ওয়ার্কিং ডিরেক্টরি দিয়ে একটি প্রক্রিয়া তৈরি করতে পারে। এমনকি যদি বাহ্যিক কমান্ডটি ডিরেক্টরিটি পরিবর্তন করে তবে বাহ্যিক প্রক্রিয়াটি প্রস্থান করার পরে সেই পরিবর্তনটি চলে যায়।

শেল বিল্টিন কমান্ড

সুতরাং এটি কাজটির জন্য একটি বাহ্যিক কমান্ড চালানোর কোনও ধারণা নেই cd। কমান্ডটি cdবর্তমানে চলমান শেল প্রক্রিয়াতে পরিবর্তন প্রয়োগ করতে হবে।

এটি করতে, এটি শেলের একটি "বিল্টিন কমান্ড"।

বিল্টিন কমান্ডগুলি হ'ল আদেশগুলি যা বাহ্যিক কমান্ডগুলির অনুরূপ আচরণ করে তবে শেলটিতে প্রয়োগ করা হয় (সুতরাং cdএটি কোর্টিলগুলির অংশ নয়)। এটি কমান্ডটি শেলের নিজস্ব অবস্থার পরিবর্তন করতে দেয়, এই ক্ষেত্রে chdir()দেখুন (দেখুন man 2 chdir) কল করতে পারে ;

সম্পর্কিত which

এখন, শিরোনাম প্রশ্নের উত্তর সহজ:
এক্সিকিউটেবল কমান্ড whichআমাদের বলতে পারে না যে সিডি একটি বিল্টিন কমান্ড কারণ একটি এক্সিকিউটেবল কমান্ড বিল্টিনস সম্পর্কে কিছুই জানে না।

বিকল্প type -a

এর বিকল্প হিসাবে which, আপনি ব্যবহার করতে পারেন type -a; এটি এক্সিকিউটেবল কমান্ড এবং বিল্টিনগুলি দেখতে পারে; অতিরিক্তভাবে, এটি উপকরণ এবং ফাংশনগুলি দেখে - শেলটিতেও প্রয়োগ করা হয়:

$ type -a cd
cd is a shell builtin
$ type -a type
type is a shell builtin
$ type -a which
which is /usr/bin/which
which is /bin/which

1
দুর্দান্ত ব্যাখ্যা!
সল্টনিটস

3
বর্তমানে গৃহীত উত্তরের চেয়ে অনেক বেশি ভাল - এটি শেল বিল্ট ইন কেন cd তা ব্যাখ্যা করে ।
লিলি চুং

28

cdএটি একটি পসিক্স-ম্যান্ডেন্ডেট শেল অন্তর্নির্মিত:

যদি একটি সাধারণ কমান্ডের ফলে কমান্ডের নাম এবং যুক্তিগুলির একটি listচ্ছিক তালিকার ফলাফল হয় তবে নিম্নলিখিত ক্রিয়া সম্পাদন করা হবে:

  1. যদি কমান্ডের নামটিতে কোনও স্ল্যাশ না থাকে তবে নিম্নলিখিত ক্রমের প্রথম সফল পদক্ষেপটি উপস্থিত হবে:
    ...
    • কমান্ডের নামটি যদি নিম্নলিখিত সারণীতে তালিকাভুক্ত কোনও ইউটিলিটির নামের সাথে মেলে, তবে সেই ইউটিলিটিটি চাওয়া হবে।
      ...
      cd
      ...
    • অন্যথায়, কমান্ডটি PATH ব্যবহারের জন্য অনুসন্ধান করা হবে ...

যদিও এটি স্পষ্টভাবে বলে না যে এটি একটি অন্তর্নির্মিত হতে হবে, স্পেসিফিকেশনটি বলতে গেলে, এর বর্ণনায়cd :

যেহেতু সিডি বর্তমান শেল প্রয়োগের পরিবেশকে প্রভাবিত করে, তাই এটি সর্বদা শেল নিয়মিত অন্তর্নির্মিত হিসাবে সরবরাহ করা হয়।

bashম্যানুয়াল থেকে :

বোর্ন শেল থেকে নিম্নলিখিত শেল বিল্টিন কমান্ডগুলি উত্তরাধিকার সূত্রে প্রাপ্ত। এই আদেশগুলি POSIX মান দ্বারা নির্দিষ্ট হিসাবে প্রয়োগ করা হয়।
...

cd
       cd [-L|[-P [-e]]] [directory]

আমি মনে করি এটি আপনি এমন কোনও স্থাপত্যের কথা ভাবতে cdপারেন যেখানে বিল্টিন হতে হবে না। তবে আপনাকে দেখতে হবে একটি বিল্ট-ইন কী বোঝায় what আপনি যদি কিছু কমান্ডের জন্য শেলটিতে কিছু করার জন্য বিশেষ কোড লিখেন তবে আপনি একটি বিল্টিন স্থাপনের কাছাকাছি চলে যাচ্ছেন। আপনি যত বেশি করেন, কেবল একটি বিল্টিন থাকাই ভাল।

উদাহরণস্বরূপ, আপনার শেলটির উপ-প্রক্রিয়াগুলির সাথে যোগাযোগের জন্য আইপিসি থাকতে পারে, এবং এমন একটি cdপ্রোগ্রাম রয়েছে যা ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করতে পারে এবং আপনার অ্যাক্সেসের অনুমতি রয়েছে কিনা এবং তারপরে শেলটি পরিবর্তন করার জন্য এটির সাথে যোগাযোগ করে ডিরেক্টরি। যাইহোক, আপনাকে অবশ্যই পরীক্ষা করতে হবে যে আপনার সাথে যোগাযোগ করার প্রক্রিয়াটি একটি শিশু কিনা (বা কেবলমাত্র শিশুদের সাথে যোগাযোগের বিশেষ মাধ্যম তৈরি করুন, যেমন একটি বিশেষ ফাইল বিবরণকারী, ভাগ করা মেমরি ইত্যাদি), এবং যদি প্রক্রিয়াটি বাস্তবে হয় বিশ্বস্ত cdপ্রোগ্রাম বা অন্য কিছু চলমান । এটি কৃমি একটি সম্পূর্ণ ক্যান।

অথবা আপনার কাছে এমন একটি cdপ্রোগ্রাম থাকতে পারে যা chdirসিস্টেম কল করে এবং নতুন শেলের সাথে সমস্ত বর্তমান পরিবেশের ভেরিয়েবল প্রয়োগ করে একটি নতুন শেল শুরু করে, এবং তারপরে এটির প্যারেন্ট শেলটিকে (কোনওভাবে) হত্যা করে। 1

সবচেয়ে খারাপ, এমনকি আপনার এমন একটি সিস্টেম থাকতে পারে যেখানে কোনও প্রক্রিয়া অন্যান্য প্রক্রিয়াগুলির পরিবেশকে পরিবর্তিত করতে পারে (আমার মনে হয় প্রযুক্তিগতভাবে আপনি এটি ডিবাগার দিয়ে করতে পারেন)। তবে এই জাতীয় ব্যবস্থা খুব খুব দুর্বল হবে।

আপনি এই জাতীয় পদ্ধতিগুলিকে সুরক্ষিত করার জন্য নিজেকে আরও এবং আরও কোড যুক্ত করে দেখতে পাবেন এবং এটিকে বিল্টিন হিসাবে তৈরি করা যথেষ্ট সহজ।


যে কোনও বিষয় কার্যকর করার যোগ্য এটি এটিকে বিল্টিন হওয়া থেকে বাধা দেয় না। বিন্দু ক্ষেত্রে:

echo এবং test

echoএবং testPOSIX- আদেশযুক্ত ইউটিলিটিগুলি ( /bin/echoএবং /bin/test)। তবুও প্রায় প্রতিটি জনপ্রিয় শেলের একটি বিল্টিন রয়েছে echoএবং test। একইভাবে, killএটি অন্তর্নির্মিত যা একটি প্রোগ্রাম হিসাবে উপলব্ধ। অন্যদের মধ্যে রয়েছে:

  • sleep (সাধারণ হিসাবে না)
  • time
  • false
  • true
  • printf

যাইহোক, কিছু ক্ষেত্রে রয়েছে যেখানে কমান্ড একটি বিল্টিন ছাড়া কিছুই হতে পারে না। এর মধ্যে অন্যতম cd। সাধারণত, যদি পুরো পাথটি নির্দিষ্ট না করা হয় এবং কমান্ডের নামটি কোনও বিল্টিনের সাথে মেলে তবে command কমান্ডের জন্য উপযুক্ত একটি ফাংশন বলা হয়। শেলের উপর নির্ভর করে বিল্টিন এবং এক্সিকিউটেবলের আচরণের পার্থক্য থাকতে পারে (এটি বিশেষত একটি সমস্যাecho যার জন্য বন্যভাবে পৃথক আচরণ রয়েছে you আপনি যদি আচরণ সম্পর্কে নিশ্চিত হতে চান তবে এটি ব্যবহার করে এক্সিকিউটিভকে কল করা পছন্দনীয় সম্পূর্ণ পাথ এবং ভেরিয়েবলগুলি সেট করুন POSIXLY_CORRECT(তারপরেও সত্যিকারের কোনও গ্যারান্টি নেই)।

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


কেস স্টাডি: দেবিয়ান অ্যালকুইস্ট শেল ( dash)

যদি আপনি dashউত্সটি দেখেন তবে এক্সিকিউশন থ্রেডটি হ'ল কিছু (অবশ্যই পাইপ এবং অন্যান্য জিনিস ব্যবহার করার সময় অতিরিক্ত ক্রিয়াকলাপের সাথে জড়িত):

maincmdloopevaltreeevalcommand

evalcommandতারপরে findcommandআদেশটি কী তা নির্ধারণ করতে ব্যবহার করে। যদি এটি অন্তর্নির্মিত হয় তবে :

 case CMDBUILTIN:
     if (spclbltin > 0 || argc == 0) {
         poplocalvars(1);
         if (execcmd && argc > 1)
             listsetvar(varlist.list, VEXPORT);
     }
     if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) {
         if (exception == EXERROR && spclbltin <= 0) {
             FORCEINTON;
             break;

cmdentry.u.cmdএকটি struct( struct builtincmd), এক যার সদস্যদের একটি ফাংশন পয়েন্টার, একটি স্বাক্ষর টিপিক্যাল সঙ্গে main: (int, char **)evalbltinফাংশান কল (তার উপর নির্ভর করে কিনা builtin হয় evalকমান্ড বা না হোক) পারেন evalcmd, কিংবা এই ফাংশন পয়েন্টার। আসল ফাংশনগুলি বিভিন্ন উত্স ফাইলগুলিতে সংজ্ঞায়িত করা হয়। echoউদাহরণস্বরূপ :

int
echocmd(int argc, char **argv)
{
    int nonl;

    nonl = *++argv ? equal(*argv, "-n") : 0;
    argv += nonl;

    do {
        int c;

        if (likely(*argv))
            nonl += print_escape_str("%s", NULL, NULL, *argv++);
        if (nonl > 0)
            break;

        c = *argv ? ' ' : '\n';
        out1c(c);
    } while (*argv);
    return 0;
}

এই বিভাগে উত্স কোডের সমস্ত লিঙ্কগুলি লাইন নম্বর-ভিত্তিক, সুতরাং সেগুলি বিজ্ঞপ্তি ছাড়াই পরিবর্তন হতে পারে।


1 পসিক্স সিস্টেমে cdএক্সিকিউটেবল থাকে


সাইড নোট:

ইউনিক্স এবং লিনাক্সে শেল আচরণের সাথে সম্পর্কিত অনেকগুলি দুর্দান্ত পোস্ট রয়েছে। নির্দিষ্টভাবে:

যদি আপনি এখনও পর্যন্ত তালিকাভুক্ত প্রশ্নগুলির কোনও নমুনাটি লক্ষ্য না করেন, তবে তাদের প্রায় সবগুলিতে স্টাফেন চেজেলাস জড়িত ।


4
নোট করুন যে আপনি cdসাহায্যের পাঠ্যটি পেতে পারেন help cd(সমস্ত শেল বিল্টিন কমান্ডের জন্য একই জিনিস)
সিলভাইন পাইনাউ

@ স্যালভাইনপাইনাউ যদিও আমি ব্যাশ ম্যানুয়ালটিতে লিঙ্ক করেছি, সে পরামর্শটি সাধারণত zsh এর মতো অন্যান্য শেলগুলির ক্ষেত্রে প্রযোজ্য নয়।
মুড়ু

প্রকৃতপক্ষে helpএকটি বাশ অন্তর্নির্মিত (zsh এর জন্য, এটি run-help cd)
সিলভাইন পাইনাউ

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

@ পাবউক সত্যই (এটি এটিকে একটি ইউটিলিটি বলে) এবং তারপরে আরও বলে: "যেহেতু সিডি বর্তমান শেল প্রয়োগের পরিবেশকে প্রভাবিত করে, তাই এটি সর্বদা শেল নিয়মিত অন্তর্নির্মিত হিসাবে সরবরাহ করা হয়।"
মুড়ু

8

আপনি কার্যকর করতে পারেন না cdকারণ এর কিছুই নেই।

cdআপনার শেলের অভ্যন্তরীণ কমান্ড (উদাঃ bash)।


7

থেকে man which:

যা বর্তমান পরিবেশে কার্যকর করা হবে এমন ফাইলগুলির (বা লিঙ্কগুলি) নামগুলি প্রদান করে, যদি তার যুক্তিগুলি কঠোরভাবে পসিক্স-কনফর্মেন্ট শেলের কমান্ড হিসাবে দেওয়া হত। এটি আর্গুমেন্টের নামের সাথে মিলে এক্সিকিউটেবল ফাইলগুলির জন্য PATH অনুসন্ধান করে এটি করে। এটি প্রতীকী লিঙ্কগুলি অনুসরণ করে না।

আমরা বর্ণনা থেকে দেখতে পাচ্ছি which, এটি কেবল পরীক্ষা করা হচ্ছে PATH। সুতরাং আপনি যদি কিছু প্রয়োগ করেন তবে bash functionএটি আপনাকে কিছুই দেখায় না। কমান্ডটি পাশাপাশি ব্যবহার করা ভাল ।typewhich

উদাহরণস্বরূপ উবুন্টু lsকমান্ডের জন্য aliised ls --color=auto

$ type ls
ls is aliased to `ls --color=auto'

$ which ls
/bin/ls

এবং যদি আপনি পরীক্ষার ফাংশন বাস্তবায়ন করেন hello:

$ function hello() { for i in {1,2,3}; do echo Hello $i;done }
$ which hello

whichকিছুই দেখায় না তবে type:

$ type hello
hello is a function
hello () 
{ 
    for i in {1,2,3};
    do
        echo Hello $i;
    done
}

তোমার ক্ষেত্রে:

$ type cd
cd is a shell builtin

এর অর্থ এই যে cdএকটি হল শেল builtin , এটা ভিতরে bash। সমস্ত ব্যাশ বিল্টিনগুলি man bashবিভাগে শিল বিল্টিন কম্যান্ডে বর্ণিত

SHELL BUILTIN COMMANDS
       Unless otherwise noted, each builtin command documented in this section
       as accepting options preceded by - accepts -- to signify the end of the
       options.   The  :, true, false, and test builtins do not accept options
       and do not treat -- specially.  The exit, logout, break, continue, let,
       and  shift builtins accept and process arguments beginning with - with‐
       out requiring --.  Other builtins that accept  arguments  but  are  not
       specified  as accepting options interpret arguments beginning with - as
       invalid options and require -- to prevent this interpretation.


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