尝试使用管道和可选的args工作来获得两个bash功能

时间:2016-07-29 08:19:05

标签: bash zsh zsh-alias

我有两件事,一件是功能,另一件是别名,他们不能正常工作。

第一个用于拖尾日志,但只显示您要查找的日志的重要部分,然后显示接下来的两行或您指定的许多行,只显示前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数据库转储恢复状态更加明显(为什么程序不会使用某些东西来表明它的工作我不知道,即使是一个微调器也会很好)但不像做-v那样令人讨厌。

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

1 个答案:

答案 0 :(得分: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为空或未设置,您可以显着重构-A以指定2作为$3选项的默认值。

function tinput() {
    tail -f $1 | grep $2 -A ${3:-2}
}