Bash에서 특별한 확장 가능한 문구를 만드는 방법은 무엇입니까?

Bash에서 특별한 확장 가능한 문구를 만드는 방법은 무엇입니까?

나는 <command> --help | grep <feature>매일 아주 많은 일을 하고 있는 나 자신을 발견합니다. 나는 이와 같은 것을 ^^확장 할 수 있는지 궁금합니다 "--help | grep".

ls ^^ size

그러면 다음이 수행됩니다.

ls --help | grep size

답변1

이를 달성하기 위해 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

답변2

의 경우 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확장 할 수 있습니다. readline 사용 과 같은 다른 애플리케이션이 아닌 --help|grep작업만 수행하려면 구성 API 인 bash 내장 명령을 사용할 수 있습니다 . 예를 들어 다음과 같습니다 .bashgdbbindbashreadline~/.bashrc

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

또는 ~/.inputrc(readline의 구성 파일)에 다음을 추가하세요:

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

rc(비슷 하거나 readline을 사용하는 다른 쉘이 있으며 es바인딩을 수행할 위치가 합리적일 수 있지만 내가 아는 한 그들은 rl_readline_name호출하기 전에 변수를 설정하지 않으므로 일부 명령문을 추가 readline할 수 없습니다. $if( other모든 응용 프로그램이 동일하게 표시됩니다. 응용 프로그램 이름을 알려주지 않고 readline을 사용합니다)).

^교체가 이루어지려면 첫 번째 값(기본값)의 0.5초 이내에 두 번째 값을 입력 해야 합니다 .

답변3

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

다음과 같은 줄을 추가하십시오.

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

~/.inputrc에

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

이제 입력 ls ^^하면 ls --help | grep.

답변4

@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"
) 

관련 정보