क्या किसी निश्चित स्ट्रिंग से शुरू होने वाले आदेशों की सूची, बैश का उपयोग करना संभव है?
मैं आदेश की शुरुआत लिखने के बाद दो बार < टैब > पर मुद्रित मुद्रित करना चाहता हूं, उदाहरण के लिए, इसे एक चर के अंदर स्टोर करें।bash: किसी दिए गए स्ट्रिंग से शुरू होने वाले कमांड की सूची प्राप्त करें
उत्तर
तुम इतनी तरह, 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.
$ PATH चर से अधिक Iterate और पथ में प्रत्येक निर्देशिका के लिए ls beginningofword*
करें?
इसे बिल्कुल समकक्ष प्राप्त करने के लिए, आपको केवल निष्पादन योग्य फ़ाइलों को फ़िल्टर करना होगा और नाम से सॉर्ट करना होगा (एलएस झंडे और सॉर्ट कमांड के साथ बहुत आसान होना चाहिए)।
जब आप हिट करते हैं तो आपके पैथ में बाइनरी फाइलें होती हैं जो उस स्ट्रिंग से शुरू होती हैं। इसलिए, यदि आपके पैथ चर में शामिल हैं: पाथ =/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 *) स्वाभाविक रूप से आप उन सभी अन्य निर्देशिकाओं को जोड़ सकते हैं जो मैंने नहीं किया है।
$ पाथ को पार्स करने के लिए त्वरित तरीके से नीचे मेरा उत्तर देखें (मेरा विचार नहीं, मैंने इसे चुरा लिया) ... – dmckee
यदि आप चाहते हैं वास्तव में कैसे बैश होगा पूर्ण
COMPLETIONS=$(compgen -c "$WORD")
कंपेन टैबबिंग के दौरान उसी नियम बैश उपयोग का उपयोग पूरा करता है।
जैकब एम का जवाब बहुत अच्छा है। इसे मैन्युअल रूप से कर रही है के लिए, मैं कुछ इस तरह का प्रयोग करेंगे:
echo $PATH | tr : '\n' |
while read p; do
for i in $p/mod*; do
[[ -x "$i" && -f "$i" ]] && echo $i
done
done
परीक्षण से पहले उत्पादन सुनिश्चित करें कि केवल निष्पादन, नियमित रूप से फ़ाइलों को दिखाया जाता है बनाता है। उपरोक्त सभी आदेश mod
से शुरू होते हैं।
दिलचस्प, मुझे 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
क्या यह सूची अंतर्निहित होगी? – legends2k
बस मस्ती के लिए, एक और मैनुअल संस्करण:
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
झंडे का प्रयोग करें इस आदेश की एक अधिक व्यापक संस्करण बनाने के लिए [मैक ओएस एक्स पर परीक्षण] उनके मालिक होने का गुण। मुझे बहुत अधिक कोडिंग के बिना समूह संबद्धता के आधार पर निष्पादित करने के लिए एक सामान्य तरीका नहीं दिख रहा है।
ऐसा करने का एक मजेदार तरीका 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
लाइब्रेरी की एक विशेषता है।
अच्छा। मैं उस के साथ संघर्ष कर रहा था, लेकिन इसे समझने में सक्षम नहीं हूं कि इसका उपयोग कैसे किया जाए। +1 :) –
वास्तव में बेहद उपयोगी है, और बहुत अच्छा जवाब है। धन्यवाद! (+1) –