बैश में एक विशेष विस्तार योग्य वाक्यांश कैसे बनाया जाए?


12

मैं खुद <command> --help | grep <feature>को रोज बहुत बार ऐसा कर पाता हूं । मैं सोच रहा था कि क्या यह संभव है कि ऐसा कुछ किया ^^जाए "--help | grep"और फिर मैं ऐसा करूं:

ls ^^ size

यह निम्नलिखित कार्य करेगा:

ls --help | grep size

जवाबों:


15

के साथ zsh, आप एक वैश्विक उपनाम का उपयोग करेंगे :

$ alias -g '^^=--help|grep --color -i'
$ ls ^^ size
     --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
                              1,048,576 bytes; see SIZE format below
 -h, --human-readable       with -l and/or -s, print human readable sizes
 -s, --size                 print the allocated size of each file, in blocks
 -S                         sort by file size, largest first
     --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
 -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
The SIZE argument is an integer and optional unit (example: 10K is 10*1024)

इसके साथ bash, आप इतिहास विस्तार का उपयोग करने में सक्षम हो सकते हैं, जो कि शेल सिंटैक्स में पर्याप्त रूप से होता है जो कि पाइप को प्रतिस्थापित करने पर काम कर सकता है:

  1. उस पाठ के साथ इतिहास को प्रधान करें जिसे आप स्थानापन्न करना चाहते हैं और एक विशेष वर्ण जिसे आप अन्यथा उपयोग करने की संभावना नहीं रखते हैं (जैसे £कि यह आपके कीबोर्ड पर होता है):

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
    
  2. फिर इतिहास विस्तार का उपयोग करके इसे पुनः प्राप्त करें:

    $ ls !?£? size
    ls --help $(: £)|grep size
         --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
     -h, --human-readable   with -l and/or -s, print human readable sizes
     -s, --size             print the allocated size of each file, in blocks
     -S                     sort by file size, largest first
         --sort=WORD        sort by WORD instead of name: none (-U), size (-S),
     -T, --tabsize=COLS     assume tab stops at each COLS instead of 8
    

या आप कुछ प्रमुख या प्रमुख अनुक्रम प्रेस पर readlineविस्तार कर सकते थे --help|grep। इसके लिए bashकेवल (और अन्य अनुप्रयोगों जैसे gdbकि रीडलाइन का उपयोग करने के लिए) आवेदन करने के लिए , आप bindबैश बिलिन कमांड का उपयोग कर सकते हैं जो आपके bashविन्यास readlineके लिए एपीआई है , उदाहरण के लिए ~/.bashrc:

bind '"^^": "--help|grep "'

या अपने ~/.inputrc(रीडलाइन की कॉन्फ़िगरेशन फ़ाइल) में जोड़ें:

$if Bash
"^^": "--help|grep "
$endif

(इस तरह के अन्य गोले हैं rcया esजो रीडलाइन का उपयोग करते हैं और जहां ऐसा करने से बाध्यकारी अर्थ हो सकता है लेकिन AFAICT, वे इनवॉइस करने से rl_readline_nameपहले वैरिएबल सेट नहीं करते हैं, readlineइसलिए आप $ifउनके लिए कुछ स्टेटमेंट नहीं जोड़ पाएंगे (वे otherसभी एप्लिकेशन की तरह दिखाई देंगे कि इसका उपयोग अपने आवेदन नाम के बिना) पढ़ें)।

ध्यान दें कि ^घटस्थापना के लिए पहले एक के बाद आपको आधे सेकंड (डिफ़ॉल्ट रूप से) के भीतर दूसरा दर्ज करने की आवश्यकता है।


क्या आप रीडलाइन समाधान को थोड़ा और समझा सकते हैं? मुझे उस बंधन को कहां जोड़ना चाहिए? उस बंधन का विस्तार किन अनुप्रयोगों पर होगा?
युकशिमा हूकसे

@yukashimahuksay, संपादित देखें
स्टीफन चेज़लस

17

आप इसके लिए एक बश फ़ंक्शन का उपयोग कर सकते हैं:

निम्नलिखित को अपने ~ / .bashrc में रखें:

qh() {
    type -all "$1" ; { man "$1" || "$1" --help ;} | egrep -i -- "$2"
}

जब आप अपना bashrc काम बचाते हैं source ~/.bashrcतो आप कर सकते हैं:

$ qh ls size
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
  -h, --human-readable       with -l and/or -s, print human readable sizes
  -s, --size                 print the allocated size of each file, in blocks
  -S                         sort by file size, largest first
      --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8

1
आपको $ 1 और $ 2 का उद्धरण देना चाहिए। मैं इसे qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} इसमें बदलूंगा : # इसलिए आप कर सकते हैं: qh ls आकार, qh ls "कुछ और।" आदि। (विकल्प) type -all "$1"$ 1 के बारे में जानकारी भी जोड़ें: यह कहता है कि क्या आप एक उपनाम, एक फ़ंक्शन लॉन्च करेंगे, एक ( कमांड आदि। और यह "$ 1" आदमी से जानकारी देता है यदि कमांड $ 1 के पास विकल्प नहीं था - "help "(यह कभी-कभी होता है)
ओलिवियर डुलैक

1
@OlivierDulac क्या आप कृपया प्रकार "$ 1" के बारे में कुछ और बता सकते हैं? किस मामले में यह आवश्यक होगा?
tgwtdt

प्रकार के मेरे संस्करण (Kubuntu 16.04) के बारे में जानता -aहै, लेकिन के बारे में कुछ नहीं कहा -lया -all, लेकिन समारोह काम करता है।
जो

8

आप रीडलाइन बाइंडिंग का उपयोग कर सकते हैं:

जैसी लाइन जोड़ते हैं

"^^": "--help | grep "

आपके ~ / .inputrc के लिए

फिर अपने कार्यकाल में ^ X ^ R दबाएं, और बाइंडिंग सक्रिय हो जाएगी।

ls ^^अब कुंजीयन में परिणाम होगा ls --help | grep


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

2
मैंने अब अपने उत्तर में उस पर कुछ और जोड़ दिया है।
स्टीफन चेजलस

1
आपके जैसे लक्षित उत्तर, और स्टीफन की तरह व्यापक, दोनों का अपना स्थान है। एक उत्थान है!
बिशप

5

lessसहायता संदेश देखने के लिए उपयोग करना

आपको अपनी खोज क्वेरी से मेल खाने वाली पंक्तियों के आसपास के संदर्भ को देखना उपयोगी हो सकता है।

hh () { "${1}" --help | less -p "${2}" ; }

इस bashफ़ंक्शन को कॉल करने का सिंटैक्स qh@ tgwtdt के उत्तर में फ़ंक्शन के समान है , पहला तर्क कमांड की जांच करने के लिए है, और दूसरा तर्क खोज शब्द है। उदाहरण के लिए:

hh ls size
hh ls "symbolic link"

यह पूर्ण सहायता संदेश को खोलता है less, खोज शब्द के हर उदाहरण पर प्रकाश डालता है, और खोज शब्द के पहले उदाहरण पर स्क्रॉल करता है। फिर आप nअगली पंक्ति को स्क्रॉल करने के लिए आगे खोज शब्द युक्त, nफिर से अगले के लिए, और इसी तरह दबा सकते हैं । पिछले उदाहरण पर वापस स्क्रॉल करने के लिए, दबाएँ N। का प्रयोग करें Home, End, Page Up, Page Down, Up Arrow, और Down Arrowसामान्य नेविगेशन के लिए कुंजी। प्रेस qया Qबाहर निकलने lessऔर कमांड लाइन पर लौटने के लिए।


3

मुझे @tgwtdt द्वारा समाधान पसंद आया, इसलिए मैंने इसे थोड़ा बढ़ाया।

यह वही काम करता है, लेकिन त्रुटियों को संभालने के लिए थोड़ा सा करता है और अंतर्निहित इन्स को संसाधित करने का प्रयास भी करता है।

{} के बजाय qh का उपयोग करता है () इसलिए qh1 () और बाहर स्थानीय हैं (एक उपधारा में)।

function qh () (
    function qh1 () {
      out="$(help "$1" 2>&1 )"
      [ $? -ne 0 ] && return 1
      echo "$out"
    }

    type -all "$1" ; { qh1 "$1" || "$1" --help 2>/dev/null || man "$1" 2>/dev/null ;} | egrep -i -- "$2"
) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.