zsh函数包装grep输出只返回几行

时间:2016-02-29 04:33:16

标签: shell scripting zsh

我正在尝试创建一个允许我查看历史记录的小型zsh函数 - hgrep test应该返回我输入的每个命令test

在我的机器上它只返回大约6个结果。当我输入history | grep test时,我会得到 lot 更多结果。什么给了?

hgrep (){
     history | grep $1
}

输出 - 这已经完成了!

➜  ~ hgrep test
 7887  mkd test
 7889  rm -r test
 7894  hgrep test
 7896  history | grep test

这是输出不完整。另外,请注意,第一批结果很多之前

➜  ~ history | grep test
  252  cp mgroup /test
  254  cp mgroup /test
  322  vi test.js
  324  node test.js
  325  vi test.js
...
经过一番探讨之后,行为的差异似乎与.zshrc的来源有关。在新终端上我看到了不受欢迎的行为。如果我然后source ~/.zshrc它的工作原理。

但是,我仍然感到困惑,为什么会发生这种情况。

2 个答案:

答案 0 :(得分:2)

history函数的定义之后,您的alias命令似乎fc -l 1被其他内容(例如hgrep)编辑。

因此,您可以在hgrep设置之后添加alias函数定义。 或者,您可以定义不受别名,shell选项等影响的hgrep函数(以及任何函数)。

TL; DR

命令history默认列出最后16个事件。

  

history

     

fc -l相同。
  [...]
  fc -l ... [ first [ last ] ]

     

如果未指定 first ,则将其设置为-1(最近的事件),如果给出-l标志,则设置为-16。

     

- zshbuiltins(1) Shell Builtin Commands fc, history

在读取时检查并扩展别名。

  

检查shell输入中的每个符合条件的单词以查看是否存在   为它定义的别名。如果是这样,它将被别名的文本替换   如果它处于指挥位置
  [...]
  读入代码时会扩展别名;整行阅读一次

     

- zshmisc(1) Aliasing

似乎hgrep函数使用shell-builtin命令history,它只显示一些事件,结果可能与使用historyalias不同以交互方式进行其他事情。

hgrep功能将由source ~/.zshrc重新定义,此时此功能中的history将被展开/替换为alias。 您可以通过发出以下命令来检查结果函数:

% functions hgrep
hgrep () {
…
(hgrep function's definition will be shown)

答案 1 :(得分:0)

这些命令完全不同。

 history | grep test

列出包含字符串test的所有历史事件。

history test

在历史记录中返回以字符串test开头的最新命令,并列出所有后续命令。