如何在bash中制作一个特殊的可扩展短语?


12

我发现自己<command> --help | grep <feature>每天都很经常做。我想知道是否有可能使类似的东西^^扩展到"--help | grep"然后再执行以下操作:

ls ^^ size

这将执行以下操作:

ls --help | grep size

Answers:


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,您也许可以使用历史记录扩展,它是在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的外壳程序,并且可以在其中进行绑定但AFAICT的外壳程序,它们rl_readline_name在调用前不会设置变量,readline因此您将无法为其添加一些$if语句(它们会other像所有应用程序一样显示使用readline而不告知其应用程序名称))。

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


您能再多解释一下readline解决方案吗?我应该在哪里添加该绑定?绑定将在哪些应用程序上扩展?
yukashima huksay

@yukashimahuksay,看到编辑
斯特凡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“ something | another”等。(可选)type -all "$1"还添加有关$ 1的信息:它表示是否要启动别名,函数,命令,等等。如果命令$ 1没有选项“ --help”(有时会发生),它会从man“ $ 1”发出信息
Olivier Dulac

1
@OlivierDulac您能解释一下有关类型-all“ $ 1”的更多内容吗?在什么情况下有必要?
tgwtdt

我的type类型(kubuntu 16.04)知道关于-a,但没有说关于-l-all,但是该函数确实起作用。

8

您可以使用readline绑定:

添加一行

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

到你的〜/ .inputrc

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

键控ls ^^现在将产生ls --help | grep


在回答之前,我回答说斯蒂芬已经添加了readline解决方案。当我看到评论询问有关readline解决方案的详细信息时,我删除了我的答案,但后来删除了
Alex Stragies

2
我现在在答案中添加了更多内容。
斯特凡Chazelas

1
有针对性的答案(如您的答案)和全面的答案(如Stéphane's)都有自己的位置。有一个赞!
主教

5

使用less可查看帮助信息

您可能会发现查看与搜索查询匹配的行的周围上下文很有用。

hh () { "${1}" --help | less -p "${2}" ; }

调用此bash函数的语法类似于qh@tgwtdt答案中的函数,第一个参数是要检查的命令,第二个参数是搜索项。例如:

hh ls size
hh ls "symbolic link"

这将在中打开完整的帮助消息less,突出显示搜索词的每个实例,并滚动到搜索词的第一个实例。然后,您可以按n向前滚动到包含搜索词的下一行,n再次滚动到下一行,依此类推。要滚动回到上一个实例,请按N。使用HomeEndPage UpPage DownUp Arrow,和Down Arrow一般的导航键。按qQ退出less并返回命令行。


3

我喜欢@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"
) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.