বিদ্যমান ফাংশন হিসাবে একই নাম দিয়ে PATH এ এক্সিকিউটেবল চালানো


16

কখনও কখনও আমি একটি ফাংশন সংজ্ঞায়িত করি যা একটি এক্সিকিউটেবলের ছায়া দেয় এবং তার যুক্তি বা আউটপুটটিকে টুইট করে। সুতরাং ফাংশনটির এক্সিকিউটেবলের একই নাম রয়েছে এবং ফাংশনটিকে পুনরাবৃত্তি না বলে ফাংশন থেকে এক্সিকিউটেবলকে কীভাবে চালানো যায় তার একটি উপায় আমার প্রয়োজন। উদাহরণস্বরূপ, এর fossil diffমাধ্যমে আউটপুট স্বয়ংক্রিয়ভাবে চালাতে colordiffএবং less -Rআমি ব্যবহার করি:

function fossil () {
    local EX=$(which fossil)
    if [ -z "$EX" ] ; then
        echo "Unable to find 'fossil' executable." >&2
        return 1
    fi
    if [ -t 1 ] && [ "$1" == "diff" ] ; then
        "$EX" "$@" | colordiff | less -R
        return
    fi
    "$EX" "$@"
}

যদি আমি এক্সিকিউটেবলের অবস্থান সম্পর্কে নিশ্চিত হই তবে আমি কেবল টাইপ করতে পারি /usr/bin/fossil। বাশ চিনতে পারে তার /মানে কমান্ড এটি একটি এক্সিকিউটেবল, ফাংশন নয়। তবে যেহেতু আমি সঠিক অবস্থানটি জানি না, তাই আমাকে কল করতে whichএবং ফলাফলটি পরীক্ষা করতে হবে। একটি সহজ উপায় আছে কি?


1
আপনি বলছেন, "বাশ স্বীকৃতি দেয় এর /অর্থ হ'ল কমান্ড একটি কার্যকর নয়, কোনও ফাংশন নয়।" কড়া কথা বলতে গেলে, এটি সত্য নয়। আমি যেটিকে একটি ভয়ঙ্কর (এবং অনির্ধারিত) ডিজাইন সিদ্ধান্ত বলে বিশ্বাস করি তাতে বাশ ফাংশন নামগুলিকে স্ল্যাশ ধারণ করতে দেয়। স্ল্যাশ কেবল কারণ /usr/bin/fossilএকটি আলাদা হতে স্ট্রিং থেকে fossil, তাই, যখন আপনি বলে /usr/bin/fossil, এটা চালানোর চেষ্টা করে না fossilফাংশন।
জি-ম্যান

উত্তর:


19

commandশেল বিল্টিন ব্যবহার করুন :

bash-4.2$ function date() { echo 'at the end of days...'; }

bash-4.2$ date
at the end of days...

bash-4.2$ command date
Mon Jan 21 16:24:33 EET 2013

bash-4.2$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

2
কমান্ড থেকে বাঁচার জন্য আরও একটি বিকল্প \date
jordanm

4
@ জোর্ডানম, এটি কেবলমাত্র এলিয়াসের জন্য কাজ করে। প্রশ্ন ছিল ফাংশন সম্পর্কে। পেস্টবিন.
com

3

স্ক্রিপ্টগুলিতে, #!লাইনটি প্রায়শই /bin/env bashপাথের উপর ভিত্তি করে ব্যাশ কমান্ড চালাতে ব্যবহার করে। (এটি কিছু ইউটিলিটির জন্য পৃথক হতে পারে)। এটি এখানে কাজ করা উচিত ...

( commandবিকল্পটিও কাজ করা উচিত, তবে এটি একটি নির্দিষ্ট শেলের উপর নির্ভরশীল হতে পারে) (এটি সোলারিসের বোর্ন শেলের উপর কাজ করে তবে এটি বাস্তবে এটি চালায় /bin/command, যা এটি বাশের উপর নির্মিত একটি শেল)

উভয়ই /bin/commandএবং এসইএস - /bin/envএ তালিকাভুক্ত, সুতরাং সমস্ত আনুগত্য বাস্তবায়নের এটি থাকা উচিত।


নির্দেশ করার জন্য ধন্যবাদ env। আমার সন্দেহ ছিল যে কোন উত্তরটি গ্রহণ করা উচিত, তবে প্রশ্নটি যেহেতু বাশ সম্পর্কে , তাই এর অন্তর্নির্মিতাই commandসেরা সমাধান।
পেটর পুদলেক

1
আমার লিনাক্স কোন আছে commandএক্সিকিউটেবল কিন্তু commandএছাড়াও কাজ করে dash, kshএবং zsh। সুতরাং আমি ধরে নিই এটি কেবল একটি শেল অন্তর্নির্মিত নয় bashপেস্টবিন.ফিউআইজিএনস
মানবকর্ম

এটি সোলারিস 10 বোর্নে কোনও বিল্টিন নয় (এটি উত্তরাধিকারী-শের হিসাবেও উপলব্ধ)। একটি পরিচিত পাথের সাথে এক্সিকিউটেবলের সুবিধাগুলি হ'ল এটি কোনও ফাংশন দ্বারা ওভাররাইট করা যায় না।
গার্ট ভ্যান ডেন বার্গ

(/ বিন / কমান্ডের অনুপস্থিতি ব্যাখ্যা করতে পারে যে শেলপথটি /bin/envহার্ড-কোড করতে না চাইলে স্ক্রিপ্টগুলি কেন হ্যাশ-ব্যাংয়ের পরে ব্যবহার করে)
জার্ট ভ্যান ড্যান বার্গ

3

গার্টের উত্তর আমাকে বুঝতে পেরেছিল যে কেউ niceসেই উদ্দেশ্যেও এটি ব্যবহার করতে পারে (আমি আসলে এটি উপলব্ধি না করে আমার একটি স্ক্রিপ্টে রেখেছিলাম):

$ function date() { echo 'at the end of days...'; }
$ date
at the end of days...
$ nice -n0 date
Mon Jan 21 16:45:21 CET 2013

অন্যান্য উত্তরগুলির তুলনায় এটি কম মার্জিত, তবে কিছু পরিস্থিতিতে এটি একটি দরকারী বিকল্প হতে পারে।


আপনি এই প্রসারিত করতে একটি অনুরূপ বিকল্প অন্তর্ভুক্ত করতে চান করতে পারেন: `which date`
এলিয়াহ কাগন

1
@ এলিয়াকাগান সমস্যাটি `which something`হ'ল যদি কার্যকর কার্যকর না হয় তবে somethingদুর্ভাগ্যজনক ঘটনা ঘটতে পারে। উদাহরণস্বরূপ, যদি echoঅনুপস্থিত থাকে তবে `which echo` /bin/rm preciousFileউদ্দেশ্য থেকে ভিন্ন কিছু করে।
পেটর পুডলিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.