क्या यूनिक्स का एक संस्करण है जहां "अगर" / बिन में एक कमांड है?


3

या कभी यूनिक्स का एक संस्करण था जहां शेल बिल्टिन "इफ" अगर एक कमांड (जैसे /bin/[और /bin/test) था?

जवाबों:


3

लगभग नामुमकिन। ifएक आदेश नहीं है ; यह का हिस्सा है खोल वाक्य रचना, साथ अलग पार्स नियम आदेश आदेश सूची, नेस्टेड अनुमति देने के लिए ifकी, और इतने पर।

उदाहरण के लिए, यदि ifकमांड एक आदेश है, तो निम्नलिखित स्पष्ट रूप से असंभव होगा , क्योंकि पार्सर if test -e file;बाकी को ध्यान में रखे बिना रुक जाएगा ।

if test -e file; then
    echo "File exists"
else
    if touch file; then
        echo "File created"
    else
        echo "File couldn't be created"
    fi
fi

या यह:

if case $path in
   ~/trash/*)  false;;
   ~/*)        true;;
   /proc/*)    false;;
   *)          true;;
esac; then
   backup "$path"
else
   echo "skipping $path"
fi

जब तक आप ऐसी चीजों का सहारा नहीं लेना चाहते थे ... बहुत सारे उद्धरण। और इसे या तो समान शेल पार्सर को फिर से लागू करना होगा if। यदि आपके पास बस एक नया स्पॉन था imaginarysh -c <argument>, तो कमांड सूचियों के अंदर चर को संशोधित करना असंभव होगा।

/bin/if "test -e file" "echo \"File exists\"" "if \"touch file\" \"echo File created\" \"echo \\\"File couldn\\\'t be created\\\"\""

(असाइड: ifवास्तव में Tcl प्रोग्रामिंग लैंग्वेज में एक कमांड है , और यह { }कोड के ब्लॉक को उद्धृत करने के लिए संतुलित के अलावा ऊपर दिए गए उदाहरण की तरह काम करता है ।)


लेकिन दूसरे सोचा पर, अगर ifकोई आदेश थे, यह असंभव चर को संशोधित करने बन जाएगा आदेश सूचियों के अंदर वैसे भीifतर्कों के अंदर कुछ भी संशोधित करना मुख्य प्रक्रिया तक पहुंचना असंभव होगा।

अंत में, बाहरी रूप से लागू करने का कोई फायदा नहीं हैif । गोले में, स्थिति का परीक्षण करने में 1) कमांड चलता है, और 2) इसके निकास कोड की जांच करता है। यदि ifबाहरी थे, तो आपके शेल को वैसे ही करना होगा, अन्यथा यह पता नहीं होगा कि ifसफल या असफल। (उसी कार्यक्षमता का उपयोग ||और &&सशर्त में भी किया जाता है।)

(असाइड: शुरुआती यूनिक्स प्रोटोटाइप में, chdirएक बाहरी कमांड था ।)

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