কীভাবে স্পষ্টভাবে অন্তর্নির্মিত শেলটি আহ্বান করবেন?


14

আমি cdআমার প্রয়োজন অনুসারে কমান্ডের কার্যকারিতা কাস্টমাইজ করতে চাই ।

আমি নিম্নলিখিত ফাংশনটি সংজ্ঞায়িত করেছি - function cd () { cd "$@" && pushd "$@"; }

এই ফাংশনটির উদ্দেশ্যটি হ'ল ডিরেক্টরিটিকে স্বয়ংক্রিয়ভাবে স্ট্যাকের দিকে ঠেলে দেয় যাতে এটি pushd .প্রতিটি সময় নিজেই টাইপ করার প্রচেষ্টাটি আমাকে বাঁচায় ।

যাইহোক, উপরের ফাংশনটি একটি অসীম পুনরাবৃত্ত ফাংশন, কারণ কলটি সেই ফাংশন হিসাবেই cdব্যাখ্যা করা হয় cdবিল্ট-ইন নয় not

cdএই ফাংশনে অন্তর্নির্মিতটিকে আমি কীভাবে উল্লেখ করব ?

আমি জানি যে এলিয়াসগুলি ব্যবহার করে পালানো যায় \। আরও সুস্পষ্ট উপায়ে ফাংশন বা বিল্ট-ইনগুলি রেফারেন্সগুলি এড়ানোর উপায় কী?

দ্রষ্টব্য: আমি আমার ফাংশনটির আর কোনও নাম পরিবর্তন করতে চাই না।


3
শুধু কেন নয় alias cd=pushd? আপনি এমন কোনও কিছুর সিডি করবেন যা পরম পাথ নয় (যেমন, cd ../)?
প্যাট্রিক

@ পেট্রিক pushdসমর্থন করে না -P। তবে আপনি ঠিক বলেছেন, যেমন প্রশ্নটিতে দেখানো হয়েছে function cdকিছুটা ভুল দেখায়, কারণ এটি দুবার ডিরেক্টরি পরিবর্তন করেছে।
টিনো

উত্তর:


6

commandBuiltin বাহিনী কমান্ড নাম builtin বা বহিরাগত কমান্ড (ওরফে এবং ফাংশন লুকআপ কুঁদন) হিসেবে ব্যাখ্যা করা হয়। এটি ব্যাশ সহ সমস্ত পসিক্স শেলগুলিতে উপলব্ধ।

cd () { command cd "$@" && pushd "$@"; }

(দ্রষ্টব্য যে এই উদাহরণটি একটি খারাপ উদাহরণ: এটি আপেক্ষিক পাথের সাথে কাজ করে না এবং আপনি সম্ভবত pushdপ্রথম স্থানে টাইপ করতে পারেন ))

বাশ এবং zsh (তবে ksh নয়) এ, আপনি builtinকমান্ডের নামটি বিল্টিন হিসাবে ব্যাখ্যা করতে বাধ্য করতে পারেন , এলিয়াস, ফাংশন এবং বাহ্যিক আদেশগুলি বাদ দিয়ে।


16

বাশের একটি (বিল্টিন) কমান্ড রয়েছে builtin, যা আপনার প্রয়োজন মতো করে। আপনার ফাংশনটির cdসাথে প্রতিস্থাপন করা builtin cdপুনরাবৃত্তি ঠিক করবে।


1

আমি সন্দেহ করি যখন আপনি "আপনার ফাংশনটির আর কোনও নাম পরিবর্তন করতে চান না" বললে আপনার অর্থ হ'ল আপনি আপনার ফাংশনটি মূল কমান্ডের মতো একই নামে কল করতে সক্ষম হতে চান।

সুতরাং, এটি করার আরেকটি উপায় যা বিল্ট-ইনগুলি না এমন জিনিসগুলির জন্যও কাজ করে তা হ'ল আপনার ফাংশনটির নাম রাখুন অন্য কিছু, এবং তারপরে মোড়ানো কমান্ডের জন্য একটি নাম নির্দিষ্ট করা। এটি কাজ করে কারণ আপনার ক্রিয়াকলাপের সম্পাদনের প্রসঙ্গে উপনামটির অস্তিত্ব নেই।

উদাহরণস্বরূপ র্যাপার.শ:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

এবং ইন, যেমন, .বাশ_আলিয়াস:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

তবে এটি বেশ হ্যাকি। commandসম্ভব হলে ব্যবহার করা পছন্দনীয়।


-1

এটি আপেক্ষিক পাথের সাথে কাজ করার জন্য, নিম্নলিখিতগুলির প্রয়োজন হবে:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

এটি ধরে নিয়েছে যে আপনি একটি আধুনিক পর্যাপ্ত লিনাক্স ডিস্ট্রোতে রয়েছেন যাতে 'রিয়েলপথ' ইউটিলিটি রয়েছে। (RHEL 6 উদাহরণস্বরূপ নয়)। পার্ল উপলভ্য থাকলে, 'রিয়েলপথ' ব্যবহার করে অনুকরণ করা যায়:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.