2009-02-04 15 views
12

क्या किसी निश्चित स्ट्रिंग से शुरू होने वाले आदेशों की सूची, बैश का उपयोग करना संभव है?
मैं आदेश की शुरुआत लिखने के बाद दो बार < टैब > पर मुद्रित मुद्रित करना चाहता हूं, उदाहरण के लिए, इसे एक चर के अंदर स्टोर करें।bash: किसी दिए गए स्ट्रिंग से शुरू होने वाले कमांड की सूची प्राप्त करें

उत्तर

30

तुम इतनी तरह, compgen आदेश का उपयोग करने के लिए सक्षम होना चाहिए:

compgen -A builtin [YOUR STRING HERE] 

उदाहरण के लिए, "compgen -एक एल builtin" रिटर्न

let 
local 
logout 

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

यहाँ (पूरा जो compgen का उपयोग करता है के लिए मार आदमी पृष्ठ से) कार्यों की एक सूची है:

alias  Alias names. May also be specified as -a. 
    arrayvar Array variable names. 
    binding Readline key binding names. 
    builtin Names of shell builtin commands. May also be specified as -b. 
    command Command names. May also be specified as -c. 
    directory Directory names. May also be specified as -d. 
    disabled Names of disabled shell builtins. 
    enabled Names of enabled shell builtins. 
    export  Names of exported shell variables. May also be specified as -e. 
    file  File names. May also be specified as -f. 
    function Names of shell functions. 
    group  Group names. May also be specified as -g. 
    helptopic Help topics as accepted by the help builtin. 
    hostname Hostnames, as taken from the file specified by the HOSTFILE shell 
       variable. 
    job  Job names, if job control is active. May also be specified as 
       -j. 
    keyword Shell reserved words. May also be specified as -k. 
    running Names of running jobs, if job control is active. 
    service Service names. May also be specified as -s. 
    setopt  Valid arguments for the -o option to the set builtin. 
    shopt  Shell option names as accepted by the shopt builtin. 
    signal  Signal names. 
    stopped Names of stopped jobs, if job control is active. 
    user  User names. May also be specified as -u. 
    variable Names of all shell variables. May also be specified as -v. 
+0

अच्छा। मैं उस के साथ संघर्ष कर रहा था, लेकिन इसे समझने में सक्षम नहीं हूं कि इसका उपयोग कैसे किया जाए। +1 :) –

+0

वास्तव में बेहद उपयोगी है, और बहुत अच्छा जवाब है। धन्यवाद! (+1) –

0

$ PATH चर से अधिक Iterate और पथ में प्रत्येक निर्देशिका के लिए ls beginningofword* करें?

इसे बिल्कुल समकक्ष प्राप्त करने के लिए, आपको केवल निष्पादन योग्य फ़ाइलों को फ़िल्टर करना होगा और नाम से सॉर्ट करना होगा (एलएस झंडे और सॉर्ट कमांड के साथ बहुत आसान होना चाहिए)।

0

जब आप हिट करते हैं तो आपके पैथ में बाइनरी फाइलें होती हैं जो उस स्ट्रिंग से शुरू होती हैं। इसलिए, यदि आपके पैथ चर में शामिल हैं: पाथ =/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/java/bin:/usr/lib/java/jre/bin :/usr/lib/क्यूटी/बिन:/usr/share/texmf/bin :.

बैश उन प्रत्येक निर्देशिका में दिखाई देगा जो आपको हिट करने के बाद सुझाव दिखाएंगे। इस प्रकार, "एलएस" से शुरू होने वाले कमांडों की सूची प्राप्त करने के लिए आप कर सकते हैं: MYVAR = $ (ls/usr/local/bin/ls */usr/bin/ls */bin/ls *) स्वाभाविक रूप से आप उन सभी अन्य निर्देशिकाओं को जोड़ सकते हैं जो मैंने नहीं किया है।

+0

$ पाथ को पार्स करने के लिए त्वरित तरीके से नीचे मेरा उत्तर देखें (मेरा विचार नहीं, मैंने इसे चुरा लिया) ... – dmckee

1

यदि आप चाहते हैं वास्तव में कैसे बैश होगा पूर्ण

COMPLETIONS=$(compgen -c "$WORD") 

कंपेन टैबबिंग के दौरान उसी नियम बैश उपयोग का उपयोग पूरा करता है।

1

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

echo $PATH | tr : '\n' | 
while read p; do 
    for i in $p/mod*; do 
    [[ -x "$i" && -f "$i" ]] && echo $i  
    done 
done 

परीक्षण से पहले उत्पादन सुनिश्चित करें कि केवल निष्पादन, नियमित रूप से फ़ाइलों को दिखाया जाता है बनाता है। उपरोक्त सभी आदेश mod से शुरू होते हैं।

1

दिलचस्प, मुझे compgen के बारे में पता नहीं था।यहाँ एक स्क्रिप्ट मैं यह करने के का उपयोग किया है, जो गैर निष्पादनयोग्य की जांच नहीं करता: कहीं अपनी $PATH (मैं इसे findcmd नामित)

#!/bin/bash 
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "[email protected]" | sort 

कि स्क्रिप्ट सहेजें, यह chmod u+w, और फिर यह सिर्फ का उपयोग जैसे grep, अपने पसंदीदा विकल्प और पैटर्न गुजर:

findcmd ^foo # finds all commands beginning with foo 
findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively 
+0

क्या यह सूची अंतर्निहित होगी? – legends2k

0

बस मस्ती के लिए, एक और मैनुअल संस्करण:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print 

जहां pattern उस फ़ाइल नाम पैटर्न को निर्दिष्ट करता है जिसका आप उपयोग करना चाहते हैं। यह उन आदेशों को याद करेगा जो वैश्विक स्तर पर निष्पादन योग्य नहीं हैं, लेकिन जिनके लिए आपको अनुमति है।

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f 
            \(\ 
             -perm -001 -or \ 
             \(-perm -100 -and -user $(whoami)\) \ 
            \) -print 

लेने जाएगा फ़ाइलें आपके द्वारा लिए अनुमति होगी:


-or और -and झंडे का प्रयोग करें इस आदेश की एक अधिक व्यापक संस्करण बनाने के लिए [मैक ओएस एक्स पर परीक्षण] उनके मालिक होने का गुण। मुझे बहुत अधिक कोडिंग के बिना समूह संबद्धता के आधार पर निष्पादित करने के लिए एक सामान्य तरीका नहीं दिख रहा है।

2

ऐसा करने का एक मजेदार तरीका M-* (मेटा आमतौर पर Alt छोड़ दिया जाता है) को हिट करना है।

उदाहरण के लिए, इस टाइप करें:

$ lo 

फिर M-* मारा:

$ loadkeys loadunimap local locale localedef locale-gen locate 
    lockfile-create lockfile-remove lockfile-touch logd logger login 
    logname logout logprof logrotate logsave look lorder losetup 

आप man 3 readline में इस बारे में और अधिक पढ़ सकते हैं; यह readline लाइब्रेरी की एक विशेषता है।