क्या विंडोज पर्यावरण चर पथ के बराबर यूनिक्स है


11

मुझे आश्चर्य हो रहा है कि क्या विंडोज पर्यावरण चर के लिए एक यूनिक्स समकक्ष है PATHEXT

बिना विंडोज बैकग्राउंड वाले लोगों के लिए: एक फाइल प्रत्यय जोड़ना PATHEXTमुझे cmd.exe में उस प्रत्यय को टाइप किए बिना स्क्रिप्ट निष्पादित करने की अनुमति देता है। उदाहरण के लिए, मेरे विंडोज कंप्यूटर पर, PATHEXT में प्रत्यय है .plऔर जब मैं cmd.exe में एक पर्ल स्क्रिप्ट निष्पादित करना चाहता हूं, तो मैं बस टाइप कर सकता हूं my-scriptऔर इसे निष्पादित किया जाता है। फिर भी, उसी स्क्रिप्ट को बैश में निष्पादित करने के लिए, मुझे पूरा नाम लिखने की आवश्यकता है my-script.pl:।

चूंकि मैं वर्तमान में विंडोज और यूनिक्स दोनों पर काम कर रहा हूं, मैं लगभग हमेशा यूनिक्स बॉक्स में जाने पर प्रत्यय टाइप करने के लिए भूलने के जाल में पड़ जाता हूं।


यह जानना दिलचस्प होगा कि विंडोज ने क्या किया अगर PATHEXT निहित है, उदाहरण के लिए, .sh और .pl और आपने foo.sh और foo.pl के साथ एक निर्देशिका में 'फू' चलाने की कोशिश की।
जेफ स्कालर

यदि .shपूर्ववर्ती है .pl, foo.shतो चलाया जाएगा। stackoverflow.com/a/7839178/180275
रेने न्यफेनेगर

जवाबों:


7

संक्षेप: नहीं

लंबे समय तक: शेल स्क्रिप्ट को एक पूर्ण फ़ाइल नाम की आवश्यकता होती है, लेकिन आप विभिन्न नामों से उन्हें संदर्भित करने के लिए अपने आदेशों के लिए उपनामों को परिभाषित कर सकते हैं। उदाहरण के लिए

alias my-script=my-script.pl

12

सबसे सरल उपाय है कि आप अपनी स्क्रिप्ट के एक्सटेंशन का उपयोग न करें। वे आवश्यक नहीं हैं और केवल आपके लिए स्क्रिप्ट के प्रकार की पहचान करने के लिए सेवा करते हैं, लेकिन कंप्यूटर पर नहीं। जबकि विंडोज फ़ाइल प्रकार की पहचान करने के लिए एक्सटेंशन का उपयोग करता है, * निक्स सिस्टम (जैसे बहुत कम अपवादों के साथ gzip) नहीं।

ध्यान दें कि बायनेरिज़ .exeका * निक्स में कोई विस्तार नहीं है , उन्हें बस बुलाया जाता है foo, नहीं foo.exe। इसलिए, यदि आप foo.plनिष्पादन योग्य होना चाहते हैं, तो fooफ़ाइल को fooपहले स्थान पर सहेजें ।

वैकल्पिक रूप से, अगर आपको वास्तव में किसी कारण से एक्सटेंशन की आवश्यकता है, तो अपनी स्क्रिप्ट को सहेजने और इसे चलाने के लिए जो भी निर्देशिका में जाएं:

for f in *.*; do ln -s "$f" "${f%%.*}"; done

एक्सटेंशन के साथ सभी फ़ाइलों पर यह पुनरावृत्ति करेगा और foo.extउनमें से प्रत्येक फ़ाइल के लिए, एक लिंक बनाएगा, fooजो इंगित करता है foo.ext। ध्यान दें कि यह विफल हो जाएगा यदि आपके पास एक ही नाम के साथ कई स्क्रिप्ट हैं लेकिन विभिन्न एक्सटेंशन हैं।


7

यदि आप वास्तव में करना चाहते हैं, तो एक तरीका है। .bashrcअपने होम डाइरेक्टरी के अंत में निम्नलिखित जोड़ें , और PATHEXTद्वारा अलग किए गए डॉट्स के साथ नाम विस्तार के लिए सेट करें :। (Windows व्यवहार से मिलान करने के लिए बिंदुओं को शामिल करने के लिए परिवर्तित।) इसे अपने जोखिम पर उपयोग करें।

if declare -f command_not_found_handle >/dev/null; then 
    eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
    local PATHEXT_EXPANDED i
    IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
    for i in "${PATHEXT_EXPANDED[@]}"; do
        if type "$1$i" &>/dev/null; then
            "$1$i" "${@:2}"
            return $?
        fi
    done
    if declare -f original_command_not_found_handle >/dev/null; then
        original_command_not_found_handle "$@"
    else
        return 127
    fi
}

यह भी याद रखें कि आप कमांड नाम को पूरा करने के लिए टैब का उपयोग कर सकते हैं यदि कोई अन्य कमांड भी नहीं है जो इसके साथ शुरू हो रहा है my-script

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.