0

我有两件事,一个是函数,另一个是别名,它们不能正常工作。

第一个用于跟踪日志,但仅显示前 3 行,方法是找到您要查找的日志的重要部分,然后显示接下来的两行或您指定的多行。

# tail -f $1 | grep $2 -A 2
function tinput() {
    if [ "$3" != "" ]
    then
        $(tail -f $1 | grep $2 -A $3)
    else
        $(tail -f $1 | grep $2 -A 2)
    fi
}

可以说我这样使用它:

tinput /var/log/webapps/app.name.com.error.log,#<.*Error:

它的错误如下:

zsh: no such file or directory: .*Error:

我不确定,但也许它没有正确看到 args 或者因为我正在做管道?

第二个是:

function loadmysqldump() {
  $(pv $1 | mysql -u root $1)
}

这是为了使 mysql db dump 恢复状态更加明显(为什么程序不使用 somthing 来表明它正在工作我不知道,即使是微调器也会很好)但不像 do 那样令人讨厌-v

好的,所以我承认犯了一个错误,由于某种原因,我忘记了终端中的 args 由空格而不是撇号分隔,所以它确实有效;坦率地说,我只使用 grep 因为我无法得到我真正想要的东西,每个单独输出的前 n 行,tail -f而我没有尝试过其他任何工作。

4

1 回答 1

2

你不能(或不应该)这样称呼它:

tinput /var/log/webapps/app.name.com.error.log,#<.*Error:

原因与如何zsh处理不匹配的模式有关。不带引号的存在*使整个第一个参数成为zsh尝试与现有文件匹配的模式。当它不匹配任何东西时,它会引发错误。您可以通过取消设置该选项来更改此行为NOMATCH,这将使zsh行为像其他 shell 一样并按字面意思对待该模式。更好的解决方案是明确并引用论点:

tinput "/var/log/webapps/app.name.com.error.log,#<.*Error:"

在上述任何情况下,您都不需要命令替换。

function loadmysqldump() {
  pv $1 | mysql -u root $1
}

function tinput() {
    if [ "$3" != "" ]
    then
        tail -f $1 | grep $2 -A $3
    else
        tail -f $1 | grep $2 -A 2
    fi
}

如果为空或未设置,您可以tinput显着重构以将 2 指定为选项的默认值。-A$3

function tinput() {
    tail -f $1 | grep $2 -A ${3:-2}
}
于 2016-07-29T12:35:10.563 回答