如何在 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,您也许可以使用历史扩展这是在 shell 语法解析中发生得足够早的一个,它可以用来替换管道:

  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 内置命令,该命令是bash配置 API readline,例如在您的~/.bashrc

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

或者添加到您的~/.inputrc(readline 的配置文件):

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

(还有其他类似rces使用 readline 的 shell,并且在哪里执行该绑定可能有意义,但据我所知,它们rl_readline_name在调用之前不会设置变量readline,因此您将无法$if为它们添加一些语句(它们将other像所有应用程序一样显示)使用 readline 而不告诉它它们的应用程序名称))。

请注意,您需要^在第一个输入后的半秒内(默认情况下)输入第二个,以便进行替换。

答案3

您可以使用 readline 绑定:

添加一行像

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

到你的~/.inputrc

然后按您的术语中的 ^X ^R,绑定将被激活。

键入ls ^^现在将导致ls --help | grep.

答案4

我喜欢@tgwtdt 的解决方案,所以我对其进行了一些增强。

这做了同样的事情,但做了一些处理错误的工作,并且还尝试处理内置函数。

qh 使用 () 而不是 {},因此 qh1() 和 out 是本地的(在子 shell 中)。

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

相关内容