Як скласти спеціальну фразу, що розгортається, в bash?


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використання readline), ви можете використовувати команду bindbash вбудовану, яка є bashAPI для налаштування readline, наприклад у вашому ~/.bashrc:

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

Або додати до ~/.inputrcфайлу (файл конфігурації readline):

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

(Є й інші оболонки , як rcабо esщо використання Readline і де роблять , що зв'язування може мати сенс , але AFAICT, вони не встановлюють rl_readline_nameзмінне перед викликом , readlineтак що ви не зможете додати деякі $ifзаяви для них (вони будуть показувати , як , otherяк всі програми які використовують readline, не вказуючи назву своєї програми)).

Зауважте, що другий потрібно ввести ^через півсекунди (за замовчуванням) після першого, щоб відбулася заміна.


Чи можете ви пояснити рішення readline трохи більше ?! куди я повинен додати це зв’язування? на яких програмах розширюватиметься ця прив'язка?
yukashima huksay

@yukashimahuksay, див. редагування
Stéphane Chazelas

17

Для цього можна використовувати функцію bash:

Помістіть у своєму ~ / .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 size, qh ls "щось | інше" тощо. (Опціональний) type -all "$1"також додайте інформацію про $ 1: він говорить, якщо ви будете запускати псевдонім, функцію, a команда тощо. І вона видає інформацію від людини "$ 1", якщо в команді $ 1 не було опції "--help" (таке трапляється іноді)
Олів'є Дулак,

1
@OlivierDulac Ви можете, будь ласка, пояснити трохи більше про тип -всі "$ 1"? У якому випадку це буде необхідність?
tgwtdt

Моя версія типу (kubuntu 16.04) знає про -a, але нічого не говорить про -lабо -all, але функція працює.
Джо

8

Ви можете використовувати прив'язки для читання рядків:

додати рядок типу

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

до вашого ~ / .inputrc

Потім натисніть ^ X ^ R у своєму терміні, і прив'язка активується.

ls ^^Тепер клавіша призведе до ls --help | grep.


Я відповів, перш ніж побачив, що Стефан додав рішення про перегляд лінії. Я видалив свою відповідь, але потім скасував, коли побачив коментар із запитанням про деталі щодо рішення щодо перегляду читання
Alex Stragies

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 () і out є локальними (в нижній частині).

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.