"সিডি" কমান্ডটি অন্তর্নিহিত কমান্ড লাইনের দ্বারা ওভাররাইড করা সম্ভব?


22

আমি যখনই আমার মেশিনের আলাদা ডিরেক্টরিতে সিডি করেছি (এই ক্ষেত্রে ম্যাক ওএস এক্স ১০.'. running চালাচ্ছি) কমান্ড লাইনের মাধ্যমে (যা বাশ), আমি অবিলম্বে বিষয়বস্তুর তালিকা পেতে 'ls' টাইপ করি ডিরেক্টরিতে। আমি 'সিডি' ওভাররাইড করার একটি উপায় বের করার চেষ্টা করছি যাতে এটি অনুরোধ করা ডিরেক্টরিতে পরিবর্তিত হয় এবং তারপরে আমাকে একটি শটে তালিকা দেয়।

নীচের লাইনটি আমার ~ / .bash_profile এ যুক্ত করে কাজ করার জন্য যে বেসিক কার্যকারিতাটি আমি খুঁজছি তা পেতে সক্ষম হয়েছি

function cl() { cd "$@"; ls -l; }

এটি প্রত্যাশার মতো কাজ করে। অনুরোধ করা ডিরেক্টরিতে পরিবর্তন করা এবং তারপরে আমাকে সামগ্রীগুলি দেখানো। আমি যেখানে কোনও ইস্যুতে চলেছি সেখানে একটি নতুন "সিএল" কমান্ড তৈরি না করে "সিডি" নিজেই ওভাররাইড করার চেষ্টা করছে।

নিম্নোক্ত না কাজ

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

আমি আরও কয়েকটি পুনরুক্তিও চেষ্টা করেছি যা তালিকাভুক্ত নয় পাশাপাশি একটি উপকরণ তৈরি করে যা কার্যকরী 'সিএল' ফাংশনটিকে নির্দেশ করে। যার কোনটিই কাজ করেনি।

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

সুতরাং, আমি বর্তমানে আমার "সিএল" কমান্ডটি ব্যবহার করতে পারি এবং যা চাই তা পেতে পারি, তবে প্রশ্নটি অবশেষ / অবশেষ:

অনুরোধ করা ডিরেক্টরিতে এটি পরিবর্তন করে তারপরে আর কিছু করার জন্য 'সিডি' এর আচরণকে ওভাররাইড করার কোনও উপায় আছে কি?

উত্তর:


30

নিম্নলিখিত কাজ করা উচিত:

function cd() { builtin cd "$@" && ls -l; }

যেহেতু ফাংশনটি একটি একক লাইনে রয়েছে তাই ;সঠিকভাবে কাজ করার জন্য নিশ্চিত করুন যে এটি উপরে হিসাবে সমাপ্ত হয়েছে ।


প্যারামিটারলেস কলের জন্য কাজ করে না।
ড্যানিয়েল বেক

3
@ ড্যানিয়েলবেক - কমপক্ষে আমার ম্যাক ওএসএক্স-এ (10.6.7) এটি প্যারামিটারলেস কল দিয়ে ভাল কাজ করছে। আচরণটি হ'ল এটি হোম ডিরেক্টরিতে পরিবর্তিত হয় এবং তারপরে সেই দিরের তালিকাটি করে। কার্যকরভাবে শেষের দিকে যুক্ত হওয়া নতুন বৈশিষ্ট্যটির সাথে প্লেইন-পুরাতন 'সিডি' এর কার্যকারিতাটিকে নকল করা।
অ্যালান ডাব্লু স্মিথ

2
@ অ্যালান ট্রু, আমি শেলটিতে সেই কোডটি অ্যাড-হক লিখে পরীক্ষা করেছি। মনে হয় cd ""(এই উত্তরটি যা মূল্যায়ন করা উচিত তার cd "$@"সাথে খালি আলাদা different $@বিভ্রান্তির জন্য দুঃখিত
ড্যানিয়েল বেক

@ ড্যানিয়েলবেক - কোনও উদ্বেগ নেই।
অ্যালান ডাব্লু স্মিথ

2
দ্রষ্টব্য: আমি এটি গ্রহণযোগ্য উত্তরে পরিবর্তন করছি কারণ এটি প্রশ্নের যথাযথ উত্তর। @ রিচহোমলকার এক এটি অধ্যক্ষকে সম্বোধন করার জন্য দুর্দান্ত তবে এটি আপনার ~ / .Bash_profile ফাইলে রাখা যেতে পারে।
অ্যালান ডাব্লু স্মিথ

10

আমি মনে করি আপনি লুপে চলেছেন। আপনার cdফাংশন কল করছে cd, যা ... ফাংশন।

আপনাকে builtinকোন কীওয়ার্ডটি সম্পর্কে জানতে হবে যা কমান্ড লুকআপকে সিডের মতো বাশ বিল্টিনগুলি ব্যবহার করে এবং আপনার ফাংশনটিকে ব্যবহার করে না

function cd
{
    builtin cd "$1"
    : do something else
}

এছাড়াও, কলিং /usr/bin/cdকখনই কাজ করবে না, এমনকি যদি এই জাতীয় আদেশ উপস্থিত থাকে।

কি হত:

  • আমার বাশ শেল দির মধ্যে আছে /bash/dir
  • আমি একটি কমান্ড চালাচ্ছি /usr/bin/cd /dir/for/cd
  • /usr/bin/cdDir যায় /dir/for/cd
  • /usr/bin/cd প্রস্থান করে।
  • বাশ এখনও রয়েছে /bash/dir, কারণ সন্তানের প্রক্রিয়া /usr/bin/cdপিতামাতার উপর প্রভাব ফেলতে পারে না।

এছাড়াও উপাধিগুলি সাধারণ পাঠ্যের বিকল্প subst তাদের কখনও পরামিতি থাকতে পারে না।


আমি পরামর্শ দিই builtin cd $@ && ls; যেহেতু cdকলটি সমস্ত কিছু বোঝার জন্য সফল হওয়া উচিত। এছাড়াও, বিশেষ ক্ষেত্রে যেমন cd(কোনও যুক্তি নেই) মনে রাখবেন ।
ড্যানিয়েল বেক

পার্শ্ব দ্রষ্টব্য: আমি এটিকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করার চেষ্টা করেছি, তবে এটি আমাকে বলছে যে এটি করার আগে আমাকে আরও 6 মিনিট অপেক্ষা করতে হবে। আপনি এটি করতে পারার আগে বিলম্বের মধ্যে একটি বিল্ট রয়েছে তা জানতেন না।
অ্যালান ডাব্লু স্মিথ

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

এবং আমরা একটি বিজয়ী আছে। এটি চ্যাম্পের মতো কাজ করে। @ ড্যানিয়েলবেকের জন্য, আমি && ব্যবহারের পরিবর্তন করেছি এবং এটির সাথে এক লাইনে কনডেন্স করেছি: ফাংশন সিডি {বিল্টিন সিডি "$ @" && ls -l; }
অ্যালান ডাব্লু স্মিথ

@ ড্যানিয়েলবেক - হ্যাঁ, আমি এটি নিয়ে চিন্তিত হতে চাই না। এর আগে কখনই লক্ষ্য করিনি। আমি এতে যুক্তি দেখতে পাচ্ছি, আমাকে একটু অবাক করে দিয়েছিল।
অ্যালান ডাব্লু স্মিথ

6

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

function d() { cd "$@" && ls;} 

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