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될 수 있습니다 . 이를 readline 사용 bash과 같은 다른 응용 프로그램에만 적용 하지 않으 려면 다음 과 같이 구성하는 API 인 bash builtin 명령을 gdb사용할 수 있습니다 .bindbashreadline~/.bashrc

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

또는 ~/.inputrc(readline의 구성 파일)에 추가하십시오 .

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

(이 같은 다른 조개 있습니다 rc또는 es의미하지만 AFAICT을 만들 수있는 바인딩, 그들이 설정하지 않도록하고 어디에 사용의 readline 그와 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" ;} 등 (optionnal) | QH LS 크기, QH ls "의 또 다른 무엇인가"따라서 그럴 수는 # type -all "$1"도 $ 1에 대 한 정보 '를 추가 : 별칭, 함수, 출시 될 경우가 말한다 명령 $ 1 명령에 "--help"옵션이없는 경우 "$ 1"사람으로부터 정보를 제공합니다 (이는 때때로 발생 함)
Olivier Dulac

1
@OlivierDulac 타입 -all "$ 1"에 대해 좀 더 설명해 주시겠습니까? 어떤 경우에 필요합니까?
tgwtdt

내 버전의 유형 (kubuntu 16.04)은에 대해 알고 -a있지만 -l또는 -all에 대해서는 아무 것도 말하지 않지만 함수는 작동합니다.
Joe

8

readline 바인딩을 사용할 수 있습니다.

같은 줄을 추가

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

~ / .inputrc에

그런 다음 용어에서 ^ X ^ R을 누르면 바인딩이 활성화됩니다.

키잉 ls ^^은 이제 결과가됩니다 ls --help | grep.


나는 Stephane이 readline 솔루션을 추가했다는 것을보기 전에 대답했습니다. 나는 내 대답을 삭제,하지만 난 코멘트가 작성한 Readline 솔루션에 대한 세부 사항에 대해 물어보고 다음, 삭제 취소
알렉스 Stragies

2
나는 이제 내 대답에 그것에 대해 좀 더 덧붙였다.
Stéphane Chazelas

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"
) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.