एक शेल कमांड के चार प्रकार जानता है।
- एलियासेस: ये कुछ विकल्पों के साथ कमांड के लिए उपनाम हैं। उन्हें शेल की इनिशियलाइज़ेशन फ़ाइल (
~/.bashrcबैश के लिए) में परिभाषित किया गया है ।
- कार्य: वे एक नाम दिए गए शेल कोड के स्निपेट हैं। उपनाम की तरह, वे शेल के आरंभीकरण फ़ाइल में परिभाषित किए गए हैं।
- बिल्टइन: शेल कम संख्या में निर्मित कमांड के साथ आता है। अधिकांश बिल्डिंस शेल स्टेट में फेरबदल करते हैं (
cdवर्तमान निर्देशिका को setबदलते हैं , विकल्प और स्थिति के मापदंडों को exportबदलते हैं, पर्यावरण को बदलते हैं, ...)। अधिकांश शेल बड़े पैमाने पर एक ही बिलिंस प्रदान करते हैं लेकिन प्रत्येक शेल में मूल सेट के लिए कुछ एक्सटेंशन होते हैं।
- बाहरी आदेश: वे शेल से स्वतंत्र हैं। अन्य कार्यक्रमों की तरह, शेल बाहरी कार्यक्रमों को निष्पादन योग्य खोज पथ में देख कर निष्पादित करता है ।
PATHवातावरण चर कार्यक्रमों के लिए खोज करने के लिए निर्देशिका के पेट के अलग की गई सूची में शामिल है।
यदि एक ही नाम से कई प्रकार के कमांड हैं, तो ऊपर दिए गए क्रम में पहला मैच निष्पादित किया जाता है।
आप देख सकते हैं कि किस प्रकार की कमांड एक नाम से चलती है type some_name।
आप aliasबिना किसी तर्क के साथ अंतर्निहित को चलाकर उपनामों को सूचीबद्ध कर सकते हैं । सभी शेल में काम करने वाले फ़ंक्शंस या बिल्डिंस को सूचीबद्ध करने का कोई तरीका नहीं है। आप शेल के प्रलेखन में बिलिन की एक सूची पा सकते हैं।
बैश में, setबिलिन अपनी परिभाषाओं के साथ-साथ चर भी सूचीबद्ध करता है। बाश, ksh या zsh में, typeset -fअपनी परिभाषाओं के साथ कार्यों को सूचीबद्ध करता है। बैश में, आप किसी भी प्रकार के सभी कमांड नामों को सूचीबद्ध कर सकते हैं compgen -c। आप उपयोग कर सकते हैं compgen -A alias, compgen -A builtin compgen -A functionएक विशेष प्रकार की सूची आदेशों का। आप compgenकेवल उपसर्ग के साथ शुरू होने वाले कमांड को सूचीबद्ध करने के लिए एक अतिरिक्त स्ट्रिंग पास कर सकते हैं ।
Zsh में, आप के साथ दिए गए प्रकार का वर्तमान में उपलब्ध आदेशों सूचीबद्ध कर सकते हैं echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}और echo ${(k)commands}(केवल कि पिछले एक सूचियों बाहरी आदेशों)।
निम्नलिखित शेल-अज्ञेयवादी स्निपेट सभी उपलब्ध बाहरी कार्यक्रमों को सूचीबद्ध करता है:
case "$PATH" in
(*[!:]:) PATH="$PATH:" ;;
esac
set -f; IFS=:
for dir in $PATH; do
set +f
[ -z "$dir" ] && dir="."
for file in "$dir"/*; do
if [ -x "$file" ] && ! [ -d "$file" ]; then
printf '%s = %s\n' "${file##*/}" "$file"
fi
done
done
बैश में एक किनारा मामला है: हैशेड कमांड।
बैश संदर्भ मैनुअल कहता है:
$ PATH में निर्देशिकाओं की पूरी खोज केवल तभी की जाती है जब कमांड हैश तालिका में नहीं मिली हो
प्रयत्न:
set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat
PATHवातावरण चर सम्मिलित नहीं होती ~/dir-for-wat-command, compgen -cप्रदर्शित नहीं करता है wat, लेकिन आप चला सकते हैं wat।
यदि आप किसी मौजूदा कमांड को छाया देना चाहते हैं, तो एक उपनाम या फ़ंक्शन को परिभाषित करें ।
Built अपवाद: कुछ बिलिंस (जिन्हें विशेष बिल्टिन कहा जाता है ) को किसी फ़ंक्शन द्वारा छाया नहीं दिया जा सकता है - बैश और zsh हालांकि उनके डिफ़ॉल्ट मोड में उस बिंदु पर POSIX का अनुपालन नहीं करते हैं।