सभी उपलब्ध कमांड और उपनामों को सूचीबद्ध करने के लिए लिनक्स कमांड


280

क्या कोई लिनक्स कमांड है जो इस टर्मिनल सत्र के लिए उपलब्ध सभी कमांड और उपनामों को सूचीबद्ध करेगा?

जैसे कि आपने 'a' टाइप किया है और टैब दबाया है, लेकिन वर्णमाला के हर अक्षर के लिए। या 'उपनाम' चला रहा है, लेकिन कमांड भी लौटा रहा है।

क्यों? मैं निम्नलिखित को चलाना और देखना चाहता हूं कि क्या कोई कमांड उपलब्ध है:

ListAllCommands | grep searchstr

TAB बटन को पर्यावरण के साथ उपलब्ध सभी कमांडों को सूचीबद्ध करने के लिए दो बार दबाएँ
ntshetty

जवाबों:


599

आप बैश (1) बिल्ट-इन का उपयोग कर सकते हैं compgen

  • compgen -c आपके द्वारा चलाए जा सकने वाले सभी आदेशों को सूचीबद्ध करेगा।
  • compgen -a आपके द्वारा चलाए जा सकने वाले सभी उपनामों को सूचीबद्ध करेगा।
  • compgen -b आपके द्वारा चलाए जा सकने वाले सभी अंतर्निहित इन्स को सूचीबद्ध करेगा।
  • compgen -k आपके द्वारा चलाए जा सकने वाले सभी खोजशब्दों को सूचीबद्ध करेगा।
  • compgen -A function आपके द्वारा चलाए जा सकने वाले सभी कार्यों को सूचीबद्ध करेगा।
  • compgen -A function -abck उपरोक्त सभी को एक बार में सूचीबद्ध करेगा।

आपके द्वारा जनित अन्य पूर्णताओं के लिए मैन पेज की जाँच करें।

आपके प्रश्न का सीधा उत्तर देने के लिए:

compgen -ac | grep searchstr

तुम क्या चाहते हो करना चाहिए।


1
क्या csh / tsh के लिए इसके बराबर है? उन टर्मिनलों में टैब पर किसी प्रकार के ऑटोकॉमप्लेटिंग फ़ंक्शन का भी उपयोग होता है, इसलिए शायद कुछ मौजूद है?
krb686

2
इसके बजाय compgen | grep, यह स्ट्रिंग को compgenस्वयं के तर्क के रूप में पारित करने के लिए अधिक कुशल हो सकता है (यदि यह एक उपसर्ग के रूप में जाना जाता है, जैसा कि प्रश्न में निहित है)। इस मामले में, यह होगा compgen -ac searchstr
टोबे स्पाइट

दरअसल, उबंटु 'पर कुछ भी नहीं' whatis compgenऔर 'के लिए कोई मैनुअल प्रविष्टि' दिखाता है man compgen
MarAvFe

1
@MarAvFe: ऐसा इसलिए है क्योंकि यह एक bashअंतर्निर्मित है, न कि अपने स्वयं के मैन पेज के साथ एक अलग कमांड। आपको bash(1)मैन पेज पढ़ना होगा , या कमांड लाइन help compgenपर चलना होगा bash
कैम

विस्तार से, ऐसा करने compgen -c | sort | uniq | lessसे डुप्लिकेट लाइनों के बिना उपलब्ध सभी कमांड प्रिंट हो जाएंगे और वर्णानुक्रम में सॉर्ट किए जाएंगे।
फाबियान

39

.Bashrc में जोड़ें

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

यदि आप भी उपनाम चाहते हैं, तो:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

यह बहुत करीब है, लेकिन यह उपनाम सहित नहीं है। मैं कैसे उपनाम जोड़ सकता हूँ | कट -11 परिणामों के लिए लेकिन इससे पहले कि तरह?
एक

1
क्यों छंटनी परेशान अगर एकमात्र उद्देश्य वैसे भी उत्पादन grep के माध्यम से है? यूनिक्स दर्शन सरल उपकरण बनाने के लिए है और यदि आवश्यक हो तो उन्हें एक साथ श्रृंखला, इसलिए ListAllCommands से बाहर तरह छोड़ दें और यदि उपयोगकर्ता चाहता है कि उत्पादन क्रमबद्ध वे ऐसा कर सकते हैं।
डेनियो जूल

4
डुप्लिकेट को निकालने के लिए सॉर्ट है।
चींटियाँ प्लाज्मा

1
यह उन आदेशों को नहीं खोजता है जो निष्पादन योग्य लोगों के लिए सहानुभूति रखते हैं। -Lअपने गंतव्य के लिए सहानुभूति का पालन करने के लिए विकल्प का उपयोग करें । नोट: -Lएक विकल्प है और मिलान अभिव्यक्ति का हिस्सा नहीं है, क्योंकि इसे कमांड लाइन पर पथ से पहले रखा जाना है। इस मामले मेंfind -L {}
Adaephon

1
कोई भी निर्देशिका निर्देशिका चेतावनियों को दबाने के लिए STDERR को / dev / null पर पुनर्निर्देशित करना चाह सकता है। echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 zsh संगतता के लिए)
TheLonelyGhost

27

वहाँ है

type -a mycommand

कमांड जो सभी उपनामों और $ PATH में आदेशों को सूचीबद्ध करती है जहां mycommand का उपयोग किया जाता है। यह जांचने के लिए उपयोग किया जा सकता है कि क्या कमांड कई प्रकारों में मौजूद है। इसके अलावा ... वहाँ शायद कुछ स्क्रिप्ट है कि $ PATH और सभी उपनामों के आसपास है, लेकिन ऐसी किसी भी स्क्रिप्ट के बारे में नहीं जानते हैं।


1
यहां तक ​​कि अगर यह उस सवाल का जवाब नहीं है, जो मुझे लगता है कि यह समस्या का एक बेहतर समाधान है तो जीआरईपी को कॉल करें। तो आप टाइप-ए फू कर सकते हैं और अगर फू उपलब्ध नहीं है तो यह रिटर्न कमांड नहीं मिला है या ऐसा कुछ नहीं है। तो आप कमांड को कॉल किए बिना ही कमांड की जांच कर सकते हैं।
Janusz

1
वास्तव में यह प्रश्न का उत्तर है, जैसा कि ओपी ने पूछा था "मैं निम्नलिखित को चलाना चाहता हूं और यह देखना चाहता हूं कि क्या कोई कमांड उपलब्ध है", इसलिए उद्देश्य यह देखना है कि क्या कोई कमांड उपलब्ध है और यह उत्तर स्पष्ट रूप से काम करता है।
लोथर

2
@lothar, क्या होगा अगर आप जो कमांड देख रहे हैं वह है, उह, यह क्या था, "स्टार्टरवर" ?, "", "", "सर्वर-समथिंग-ऑर-अदर"? " मुझे पता है, मैं सर्वर के लिए बस "grep -i" करूँगा और देखूंगा कि क्या यह वहां है। उफ़। बज़्ज़, इस समाधान के साथ नहीं। matey :-) मैं इस जवाब को वोट नहीं करने जा रहा हूं (क्योंकि यह एक सीमित तरीके से भी उपयोगी है) लेकिन एक पूर्ण विकसित समाधान इस बात को ध्यान में रखेगा कि grep नियमित अभिव्यक्ति के लिए है , न कि केवल निश्चित तारों के लिए।
पैक्सडिब्लो

6

"जो खोजता है" का उपयोग करें। यदि यह एक उपनाम है तो या तो द्विआधारी या उर्फ ​​सेटअप का मार्ग देता है

संपादित करें: यदि आप उपनामों की सूची खोज रहे हैं, तो आप उपयोग कर सकते हैं:

alias -p | cut -d= -f1 | cut -d' ' -f2

जो भी आप की तरह जवाब खोज पेटीएम में जोड़ें। मान लें कि आप बैश का उपयोग कर रहे हैं ..


6

अन्य कमांड ने मेरे लिए एम्बेडेड सिस्टम पर काम नहीं किया, क्योंकि उन्हें बैश या xargs के अधिक पूर्ण संस्करण की आवश्यकता है (व्यस्त बॉक्स सीमित था)।

निम्नलिखित कमांड किसी भी यूनिक्स जैसी प्रणाली पर काम करना चाहिए।

फ़ोल्डर द्वारा सूची:

ls $(echo $PATH | tr ':' ' ')

सभी कमांड को नाम से सूचीबद्ध करें

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

यह अब भी निर्भर करता है tr। बस क्यों नहीं ls $(echo ${PATH//:/ })?
mschilli

5

इस स्क्रिप्ट का प्रयास करें:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

यह अब तक का एकमात्र कोड समाधान है जो सभी कमांड के लिए करता है, न कि केवल यह देखने के लिए कि क्या कोई ज्ञात कमांड मौजूद है। +1।
पैक्सिडाब्लो

3

मैक उपयोगकर्ताओं के लिए ( ढूँढें -executable और xargs के पास -d नहीं है):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

इसके लिए धन्यवाद। मैं वास्तव में एक गैर-मैक यूनिक्स का उपयोग कर रहा हूं जहां @AntsAasma उत्तर काम नहीं करता था। यह मेरे लिए मैक और मेरे यूनिक्स पर भी काम करता है। मैं जिस यूनिसेक्स संस्करण पर हूं, उसे निर्धारित करने के लिए मैं क्या कमांड टाइप कर सकता हूं, इसलिए मैं अपने मुद्दे के साथ दूसरे की मदद करने के लिए यहां जवाब दे सकता हूं?
प्रिज़मैटिकॉर्ब

लिनक्स <कॉर्पोरेट_पुनर्प्रायनिक_बिल्डिंग_इनफोर्स> मोन 12 दिसंबर 13:34:16 ईएसटी 2011 x86_64 x86_64 x86_64 GNU / लिनक्स
प्रिज्मीयटोरब

3

कमांड से जुड़े कीवर्ड के आधार पर कमांड को सूचीबद्ध करना उपयोगी है।

उपयोग: man -k "your keyword"

के साथ गठबंधन करने के लिए स्वतंत्र महसूस:| grep "another word"

उदाहरण के लिए, एक पाठ संपादक खोजने के लिए: man -k editor | grep text


2

ALT- दबाने की कोशिश करें? (एक ही समय में ऑल्ट और प्रश्न चिह्न)। सूची बनाने के लिए इसे दूसरा या दो समय दें। इसे कोसने में काम करना चाहिए।


3
या चार बार ब्लैंक लाइन की शुरुआत में Esc मारना।
अपरिपक्व

यह आश्चर्यजनक रूप से उपयोगी है, और मैं पहले से ही यह धन्यवाद नहीं जानता था :-)
क्रिस हुआंग-लीवर

2

यहां एक समाधान है जो आपको सभी निष्पादन योग्य और उपनामों की एक सूची देता है । यह सिस्टम के बिना पोर्टेबल भी है xargs -d(उदाहरण के लिए मैक ओएस एक्स), और उनमें रिक्त स्थान के साथ ठीक से पथ संभालता है।

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

उपयोग: myscript.sh [grep-options] patternउदाहरण के लिए ls, केस-असंवेदनशील, के साथ शुरू होने वाली सभी कमांडों को खोजने के लिए:

myscript -i ^ls

2

सभी कमांड को सूचीबद्ध करने के लिए शॉर्टकट विधि। टर्मिनल खोलें और दो बार "टैब" बटन दबाएं। Thats टर्मिनल में सभी कमांड दिखाते हैं


1
और तुम पाइप grepकैसे?
टोबे स्पाइट

2

वैकल्पिक रूप से, आप त्वरित विवरण के साथ युग्मित आदेशों की एक सुविधाजनक सूची प्राप्त कर सकते हैं (जब तक कि कमांड में एक मैन पेज है, जो करते हैं):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

फिर आप बस उसे वैसे ही पकड़ लेते हैं, जैसा आप चाहते हैं।

apropos -s 1 '' | grep xdg

पैदावार:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

परिणाम छाँटे नहीं जाते हैं, इसलिए यदि आप लंबी सूची की तलाश कर रहे हैं, तो आप फेंक सकते हैं | सॉर्ट | बीच में, और फिर पाइप को कम / अधिक / सबसे अधिक पसंद है। आला:

apropos -s 1 '' | sort | grep zip | less

जो अपने नाम या उनके संक्षिप्त विवरण में "जिप" रखने वाले सभी आदेशों की क्रमबद्ध सूची देता है, और "कम" पेजर को पंप करता है। (आप $ PAGER के साथ "कम" को भी बदल सकते हैं और डिफ़ॉल्ट पेजर का उपयोग कर सकते हैं।)


1

आप हमेशा निम्नलिखित कर सकते हैं:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

शेल तभी कमांड निष्पादित करेगा जब वे वैसे भी रास्ते में सूचीबद्ध होंगे।


1

यह निर्भर करता है, इसका मतलब है कि यह इस बात पर निर्भर करता है कि आप किस शेल का उपयोग कर रहे हैं। यहाँ मैं देख रहा हूँ अड़चनें हैं:

  1. एलियट और फ़ंक्शंस और वैरिएबल को पकड़ने के लिए आपके शेल के समान प्रक्रिया में चलना चाहिए, जो आपके द्वारा पाएं जाने वाले आदेशों को प्रभावित कर सकते हैं, पाथ या एडिटोर को सोच सकते हैं, हालांकि EDITOR गुंजाइश से बाहर हो सकता है। आपके पास अनएक्सपोर्टेड वैरिएबल हो सकते हैं जो चीजों को प्रभावित कर सकते हैं।
  2. यह शेल विशिष्ट है या आपके कर्नेल में जा रहा है, / proc / pid / enviorn और दोस्तों के पास पर्याप्त जानकारी नहीं है

मैं ZSH का उपयोग करता हूं इसलिए यहां एक zsh उत्तर है, यह निम्नलिखित 3 चीजें करता है:

  1. डंप रास्ता
  2. डंप उर्फ ​​नाम
  3. डंप कार्य जो एनवी में हैं
  4. उनकी तरह

यह रहा:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

यदि आप zsh का उपयोग करते हैं तो यह करना चाहिए।


0

समस्या यह है कि टैब-पूर्णता आपका रास्ता खोज रही है, लेकिन सभी कमांड आपके रास्ते में नहीं हैं।

बैश का उपयोग करके अपने रास्ते में आदेशों को खोजने के लिए आप कुछ ऐसा कर सकते हैं:

एक्स में के लिए echo $PATH | cut -d":" -f1; ls $ x; किया हुआ


0

यहाँ एक फ़ंक्शन है जिसे आप अपनी bashrc फ़ाइल में रख सकते हैं:

फ़ंक्शन कमांड-खोज
{
   oldIFS = $ {} आईएफएस
   आईएफएस = ":"

   $ {PATH} में p के लिए
   करना
      ls $ पी | grep $ 1
   किया हुआ

   निर्यात IFS = $ {पुराना}
}

उदाहरण का उपयोग:

$ आदेश-खोज सूक्ति
सूक्ति-ऑडियो-प्रोफाइल-गुण *
सूक्ति-इजेक्ट @
gnome-keyring *
gnome-keyring-डेमॉन *
GNOME माउंट *
GNOME खुले *
सूक्ति-ध्वनि रिकॉर्डर *
सूक्ति-पाठ-संपादक @
सूक्ति-umount @
gnome- वॉल्यूम-नियंत्रण *
polkit-सूक्ति-प्राधिकरण *
vim.gnome *
$

FYI करें: IFS एक चर है जो स्ट्रिंग्स को विभाजित करने के लिए उपयोग करता है।

निश्चित रूप से ऐसा करने के कुछ बेहतर तरीके हो सकते हैं।


-1

शायद मुझे गलतफहमी है लेकिन जब तक आप डिस्प्ले ऑल एक्स संभावनाएं नहीं पा लेते हैं तो क्या होगा?


-2
compgen -c > list.txt && wc list.txt

1
यह क्या करता है या यह कैसे काम करने वाला है, इसका एक संक्षिप्त विवरण जोड़ने पर विचार करें। बहुत कम से कम, प्रस्तावित समाधान को समझने और समझने के लिए एक संदर्भ लिंक (आमतौर पर प्रासंगिक मैन पेज) निर्दिष्ट करें।
theCodeArtist

फ़ाइल का उपयोग करना हमेशा एक अच्छा विकल्प नहीं होता है। अगर आपको जरूरत है, तो कम से कम इसे एक tmp फ़ाइल (यदि सुरक्षा कोई समस्या नहीं है) compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

आप सिर्फ टाइप क्यों नहीं करते:

seachstr

टर्मिनल में।

खोल कुछ कहेगा जैसे

seacrhstr: command not found 

संपादित करें:

ठीक है, मैं नीचे ले जाता हूं, क्योंकि जवाब बेवकूफ है, मैं सिर्फ जानना चाहता हूं: इस जवाब में क्या गलत है !!! पूछने वाले ने कहा:

और देखें कि क्या कोई कमांड उपलब्ध है।

यदि यह उपलब्ध है तो कमांड टाइप करना आपको बता देगा!।

संभवत: उनका मतलब था, "कमांड को निष्पादित करने के साथ" या "इसे एक स्क्रिप्ट में शामिल करने के लिए", लेकिन मैं उनके दिमाग को नहीं पढ़ सकता हूं (ऐसा नहीं है कि मैं नियमित रूप से ऐसा नहीं कर सकता हूं कि वह एक माइंड रीडिंग डिफ्लेक्टर पहने हुए हैं )


4
मैं जानना चाहता हूं कि क्या formathddकमांड मौजूद है। ओह रुको, मैं इसे चलाने और देखने के लिए बस। जी। धन्यवाद :)
जेफरी जोस

5
संभवतः ऐसा करने के लिए 'जो' का उपयोग करना सुरक्षित है।
डेनियो जूल 20'10

यह देखते हुए कि यह स्टैक ओवरफ्लो है , सुपर यूजर नहीं , एक प्रोग्रामेटिक उत्तर अधिक उपयुक्त होगा।
टोबे स्पाइट

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