सभी आदेशों को सूचीबद्ध करें जो एक शेल जानता है


32

मैं अपने शेल (जो ऐसा होता है bash) पर टाइप कर सकता हूं जो कि पहचाने जाने वाले सभी कमांड को सूचीबद्ध करेगा।

इसके अलावा, क्या यह शेल द्वारा भिन्न होता है? या क्या सभी गोले सिर्फ एक "निर्देशिका" कमांड के हैं जिन्हें वे पहचानते हैं?

दूसरे, अलग सवाल, लेकिन मैं उनमें से किसी को कैसे ओवरराइड कर सकता हूं? दूसरे शब्दों में, मैं viewअपने Ubuntu सिस्टम पर मौजूद एक को बदलने के लिए अपनी खुद की कमांड कैसे लिख सकता हूं , जो सिर्फ लोड करने के लिए प्रकट होता है vim


5
कृपया प्रश्नों का संयोजन न करें। हर एक को एक अलग प्रश्न के रूप में पोस्ट करें।
terdon

Unix.stackexchange.com/q/63073/135943 (मैंने दोनों दिशाओं में लिंक किया है) के पास-डुप्लिकेट
वाइल्डकार्ड

जवाबों:


61

आप उपयोग कर सकते हैंcompgen

compgen -c # will list all the commands you could run.

जानकारी के लिए:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
ध्यान दें कि compgen -cजैसी चीजें शामिल होंगी {या whileजो कड़ाई से आदेश नहीं बोल रही हैं।
स्टीफन चेजलस

13

एक शेल कमांड के चार प्रकार जानता है।

  • एलियासेस: ये कुछ विकल्पों के साथ कमांड के लिए उपनाम हैं। उन्हें शेल की इनिशियलाइज़ेशन फ़ाइल ( ~/.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 का अनुपालन नहीं करते हैं।


एक और धार मामला, $PATHजैसे /bin:/usr/bin:(अनुगामी :) के मूल्यों के लिए है , जहां यह मौजूदा निर्देशिका में निष्पादन योग्य फ़ाइलों को सूचीबद्ध करने में विफल होगा।
स्टीफन चेजलस

3

आदेशों की सूची में दो सेट होते हैं:

  1. कमांड शेल में अंतर्निहित
  2. अपने में आज्ञा PATH

आप बिल्ट-इन को नहीं बदल सकते हैं, लेकिन आप शेल को बिल्ट-इन का उपयोग करके पूर्ण पाथनाम की तरह निर्दिष्ट करके रख सकते हैं /bin/echo

आपके आदेशों के लिए PATH, आप इसे बदल सकते हैं। PATHमें देखने के लिए निर्देशिकाओं की एक औपनिवेशिक-पृथक-पृथक सूची है। पहली मिलान फ़ाइल "जीत" मिली।

export PATH=~/bin:${PATH}

(यह वाक्यविन्यास काम नहीं करता है csh गोले के , लेकिन अन्य सभी जिनके बारे में मुझे पता है)।

यही कारण है कि निर्यात PATHके साथ ~/binके रूप में पहली प्रविष्टि मौजूदा के बाकी के बाद PATHप्रविष्टियों। तो अब आपका खोल directory calledबिन in your home directory for a command *first* before checking the standardपाथ` सिस्टम की स्थापना की जाँच करेगा । आप इसे आसानी से उपयोग करके इसके बजाय नई निर्देशिका की जाँच कर सकते हैं:

export PATH=${PATH}:~/bin

बनाने के PATHभविष्य के लॉगिन के लिए जारी रहती है, एक के लिए इसे जोड़ने .profileया अन्य खोल rc फ़ाइल।



1

यदि आप टैब कुंजी को दो बार दबाते हैं और फिर y करते हैं, तो आपको अपने वर्तमान शेल में सभी उपलब्ध कमांड की सूची मिल जाएगी। दूसरे प्रश्न के लिए मुझे लगता है कि आपको उपनाम: शेल उर्फ ​​का उपयोग करना चाहिए ।


उर्फ के बारे में, यह है कि ओवरराइडिंग और अन-ओवरराइडिंग ("निराला" द्वारा) का एक मूर्ख-प्रूफ तरीका जब एक कमांड को सिस्टम पर कहीं भी कहा जाता है (उदाहरण के लिए शेल स्क्रिप्ट से)?
प्रहर

1
आप किस खोल का उपयोग करते हैं? मुझे अपने बैश पर सभी कमांड को सूचीबद्ध करने के लिए डबल टैब नहीं मिल सकता है।
terdon

मैं Ubuntu 13.04 पर बैश का उपयोग करता हूं। एक कमांड भी है जिसे कॉम्पजेन कहा जाता है जिसका उपयोग बैश पर सभी उपलब्ध कमांड की सूची प्राप्त करने के लिए किया जा सकता है।
coffeMug

@terdon क्या आपके पास बैश पूर्णता स्थापित है?
coffeMug

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