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できません。$ifother. アプリケーション名を知らせずにreadlineを使用します。))

^交換を行うには、最初の値(デフォルト)の0.5秒以内に2番目の値を入力する必要があります。

答え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"
) 

関連情報