मौजूदा फ़ंक्शन के समान नाम के साथ 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
आप कहते हैं, "बैश यह मानता है कि /कमांड एक निष्पादन योग्य है, एक फ़ंक्शन नहीं है।" कड़े शब्दों में, यह सच नहीं है। में जो मैं एक भयानक (और undocumented) डिजाइन निर्णय मानता हूं, बैश फ़ंक्शन नामों को स्लैश को शामिल करने की अनुमति देता है। स्लैश बस का कारण /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
जोर्डनम

4
@ जोर्डनम, जो केवल उपनामों के लिए काम करता है। प्रश्न कार्यों के बारे में था। pastebin.com/TgkHQwbb
manatwork

3

स्क्रिप्ट में, #!लाइन अक्सर /bin/env bashपथ के आधार पर बैश कमांड को चलाने के लिए उपयोग करती है। (यह कुछ उपयोगिताओं के लिए भिन्न हो सकता है)। यह यहाँ भी काम करना चाहिए ...

( commandविकल्प भी काम करना चाहिए, लेकिन एक विशिष्ट शेल पर निर्भर हो सकता है) (यह सोलारिस पर बॉर्न शेल पर काम करता है, लेकिन यह वास्तव /bin/commandमें उस मामले में चलता है, जो यह बैश पर निर्मित शेल है)

दोनों /bin/commandऔर /bin/envSUS में सूचीबद्ध है, इसलिए सभी आज्ञाकारी कार्यान्वयन यह होना चाहिए।


इशारा करने के लिए धन्यवाद env। मुझे संदेह था कि मुझे कौन सा उत्तर स्वीकार करना चाहिए, लेकिन चूंकि प्रश्न बैश के बारे में है , इसलिए इसका बिल्ट-इन commandसबसे अच्छा समाधान है।
पेट्र पुडलक

1
मेरे लिनक्स पर कोई commandनिष्पादन योग्य नहीं है , लेकिन commandयह भी काम करता है dash, kshऔर zsh। तो मुझे लगता है कि यह न केवल एक शेल में बनाया गया है bashpastebin.com/fi3gyNse
manatwork

यह Solaris 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
@EliahKagan के साथ समस्या `which something`यह है कि यदि कोई somethingनिष्पादन योग्य नहीं है , तो दुर्भाग्यपूर्ण चीजें हो सकती हैं। उदाहरण के लिए यदि echoगायब है तो `which echo` /bin/rm preciousFileइरादा से कुछ बहुत अलग है।
पेट्र पुडलक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.