আমি কেন একটি কমান্ড থেকে "সিডি" তে কোনও পাথ নামের আউটপুট পুনর্নির্দেশ করতে পারি না?


27

আমি cdঅন্য কমান্ড থেকে পুনঃনির্দেশিত ডিরেক্টরি নামটি গ্রহণ করার চেষ্টা করছি । এই পদ্ধতিগুলির কোনওটিই কাজ করে না:

$ echo $HOME | cd
$ echo $HOME | xargs cd

এটি কাজ করে:

$ cd $(echo $HOME)

প্রথম সেট কমান্ডগুলি কেন কাজ করে না, এবং এমন কি অন্যরাও আছেন যে এভাবে ব্যর্থ হয়?


অন্যদের দ্বারা আপনি সিডি ব্যবহারের জন্য অন্যান্য আদেশ বা অন্যান্য পদ্ধতিগুলি উল্লেখ করছেন যা এইভাবে ব্যর্থ হয়?
দিদি কোহেন

@ ডেভিডকোহেন আমি অন্যান্য আদেশগুলি উল্লেখ করি
ঝোনাথন

কিছু উল্লেখযোগ্য উদাহরণ হ'ল উলিমিট, উমাস্ক, পপড, পুশড, সেট, এক্সপোর্ট এবং পঠন।
দিদি কোহেন

উত্তর:


32

cdএটি বাহ্যিক আদেশ নয় - এটি শেল বিল্টিন ফাংশন। এটি বর্তমান শেল প্রসঙ্গে চালিত হয়, এবং বহিরাগত কমান্ডগুলি যেমন পৃথক প্রক্রিয়া হিসাবে কাঁটাচামক / নির্বাহী প্রসঙ্গে নয়, তা নয়।

আপনার তৃতীয় উদাহরণটি কাজ করে, কারণ শেলটি cdবিল্টিনকে কল করার আগে ভেরিয়েবল এবং কমান্ড প্রতিস্থাপনকে প্রসারিত করে , যাতে এটির যুক্তি হিসাবে cdমানটি পায় ${HOME}

POSIX সিস্টেম কি একটি বাইনারি আছে cd- আমার FreeBSD 'র মেশিনে, এটা এ এর /usr/bin/cd, কিন্তু এটা আপনি কি মনে করেন না। বাইনারি কল করার cdফলে শাইনটি কাঁটাচামচ / এক্সাইন্ট হয়ে যায় বাইনারি, যা প্রকৃতপক্ষে তার কার্য ডিরেক্টরিটি আপনার পাস করা নামটিতে পরিবর্তন করে। যাইহোক, এটি করার সাথে সাথে বাইনারিটি প্রস্থান করে এবং কাঁটাচামচ করা / চালানো প্রক্রিয়াটি অদৃশ্য হয়ে যায়, আপনাকে আপনার শেলের কাছে ফিরিয়ে দেয়, এটি আপনার শুরুর আগে যে ডিরেক্টরিতে ছিল তা এখনও রয়েছে।


10
যা একটি বিস্মিত করে তোলে বাহ্যিক cdআদেশের বিন্দুটি কী ?
কোজিরো

23

cdস্ট্যান্ডার্ড ইনপুট পড়েন না। এজন্য আপনার প্রথম উদাহরণটি কার্যকর হয় না।

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


4

বিদ্যমান ভাল উত্তরের পাশাপাশি এটিও উল্লেখযোগ্য যে একটি পাইপ একটি নতুন প্রক্রিয়া কাঁটাচ্ছে, যার নিজস্ব পৃথক ওয়ার্কিং ডিরেক্টরি রয়েছে। অতএব, এটি করার চেষ্টা করা, কাজ করবে না:

echo test | cd /

সুতরাং, এই কমান্ডটি থেকে শেলটি ফিরে আসার পরে আপনি / ফোল্ডারে থাকবেন না।


বিভিন্ন প্রসেস একটি পাইপলাইন রান সকল আদেশ, তাই a | b, এমনকি যদি aএবং bbuiltin হয়, অন্তত একটি তারপর শেল প্রক্রিয়ায় দেশ পরিচালিত না, কিন্তু কোন গ্যারান্টি এটা যা যা আছে। উদাহরণস্বরূপ এটিএন্ডটিটিতে ksh, zshবা bash -O lastpipe, bবর্তমান শেল প্রক্রিয়াতে চালিত হয়, সুতরাং আপনার কোড আপনাকে সেখানে / সেখানে নিয়ে যাবে।
স্টাফেন চেজেলাস

4

ইতিমধ্যে প্রদত্ত সঠিক উত্তরগুলি ছাড়াও: আপনি যদি বাশ চালান এবং সিডির মতো "কমান্ড" কী হয় তা আপনি টাইপটি ব্যবহার করতে পারেন তা জানতে চান

$ type cd
cd is a shell builtin

বা কেন নয়:

$ type time
time is a shell keyword

যখন উদাহরণস্বরূপ gnu সময় সাধারণত ইতিমধ্যে আপনার প্রিয় বিতরণ অন্তর্ভুক্ত করা হয়:

$ which time
/usr/bin/time

ওকে ওকি আপনি ধারণাটি পেয়েছেন, তাহলে হেকের ধরনটি কী?

$ type type
type is a shell builtin

এখানে একটি বাশ ম্যানুয়াল স্নিপেট রয়েছে:

       type [-aftpP] name [name ...]
          With no options, indicate how each name would be interpreted  if  used  as  a
          command name.  If the -t option is used, type prints a string which is one of
          alias, keyword, function, builtin,  or  file  if  name  is  an  alias,  shell
          reserved word, function, builtin, or disk file, respectively.  If the name is
          not found, then nothing is printed, and an exit status of false is  returned.
          If  the -p option is used, type either returns the name of the disk file that
          would be executed if name were specified as a command  name,  or  nothing  if
          ‘‘type  -t  name’’ would not return file.  The -P option forces a PATH search
          for each name, even if ‘‘type -t name’’ would not return file.  If a  command
          is  hashed,  -p  and -P print the hashed value, not necessarily the file that
          appears first in PATH.  If the -a option is used,  type  prints  all  of  the
          places  that  contain  an  executable  named name.  This includes aliases and
          functions, if and only if the -p option is  not  also  used.   The  table  of
          hashed  commands  is  not  consulted when using -a.  The -f option suppresses
          shell function lookup, as with the command builtin.  type returns true if any
          of the arguments are found, false if none are found.

0

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

তবে, এটি যদি কাজ করেও, এটি আপনার ইচ্ছা মতো করে না: একটি পাইপ একটি নতুন প্রক্রিয়া তৈরি করে এবং প্রথম কমান্ডের স্ট্যান্ডার্ড আউটপুটটিকে দ্বিতীয়টির স্ট্যান্ডার্ড ইনপুটটিতে পুনর্নির্দেশ করে, সুতরাং কেবলমাত্র নতুন প্রক্রিয়াটি তার বর্তমান কাজকে বদলে দেবে ডিরেক্টরি; এটি কোনওভাবেই প্রথম প্রক্রিয়াটিকে প্রভাবিত করতে পারে না।


2
আপনার দ্বিতীয় অনুচ্ছেদটি ঠিক। তবে প্রথম অনুচ্ছেদটি আবার: আপনি কেন ধরে নিচ্ছেন যে শেল বিল্টিনগুলির কোনও স্টিডিন নেই? readসাধারণত (সর্বদা?) একটি শেল অন্তর্নির্মিত। এটি সত্য যে cdস্টিডিনকে উপেক্ষা করে, তবে এটি বিল্টিন হওয়ার কারণে নয়।
dubiousjim

-2

অন্য বিকল্পটি ব্যাকটিক্স, যা একটি কমান্ডের স্টাডআউটকে দ্বিতীয় কমান্ডের কমান্ড লাইন আর্গুমেন্ট হিসাবে রাখে এবং এর চেয়ে বেশি বহনযোগ্য $(...)। উদাহরণ স্বরূপ:

cd `echo $HOME`

বা আরও সাধারণভাবে;

cd `anycommand -and whatever args`

নোট করুন যে কমান্ডটি কার্যকর করতে এবং কমান্ড লাইনে আউটপুট প্রতিস্থাপনের জন্য ব্যাকটিক্সের ব্যবহার শেলের উপর নির্ভর করে। বেশিরভাগ শেল এটি সমর্থন করে।


3
ওপি ইতিমধ্যে তার / তার প্রশ্নে জানিয়েছে, এটি কার্যকর $(...)। এর পরিবর্তে ব্যাকটিক্সের প্রস্তাব দেওয়া ভাল পরামর্শ বলে আমি মনে করি না, কারণ তাদের কাছে অনেক বেশি সংশ্লেষিত উদ্ধৃতি বিধি রয়েছে এবং সাধারণত ত্রুটি-ঝুঁকির বেশি থাকে। (দেখুন §3.5.4 "কমান্ড উপকল্পন" এ ব্যাশ রেফারেন্স ম্যানুয়াল ।)
ruakh

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

বিভিন্ন শাঁস, হ্যাঁ; কিন্তু বিভিন্ন "সিস্টেম"? সত্যিই এমন কোনও শেল রয়েছে যা $(...)একটি সিস্টেমে সমর্থন করবে তবে অন্যটিতে নয় ??
রুখ

4
-1, এটি মোটেই প্রশ্নের উত্তর দেয় না।
বার্নহার্ড

3
@রুখ এবং শেঠ: সমস্ত পসিক্স শেল সমর্থন করে $(…)। পসিক্স শেলবিহীন সিস্টেমগুলি (যেমন একটি আসল বোর্ন শেল সহ) অত্যন্ত পুরানো হবে। এমনকি সিস্টেম যেখানে /bin/shবোর্ন শেল এবং আপনার অন্য কোনও পাথ প্রয়োজন যেমন /usr/xpg4/bin/shএকটি পসিক্স শেল পেতে আজকাল বিরল। যে কেউ প্রাচীন ইউনিক্স বক্সেনকে পেশাদারভাবে পরিচালনা করেন না তাদের ব্যাকটিক্সের প্রস্তাব দেওয়া হচ্ছে তাদের অবিচ্ছিন্নতা।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.