试图获得两个 bash 具有管道和可选参数的函数

trying to get a two bash functions with piping and optional args working

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

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

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

假设我是这样使用它的:

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

它的错误是这样的:

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

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

第二个是:

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

它是为了让 mysql db dump 恢复状态更明显(为什么程序不使用一些东西来表明它正在工作我不知道,即使是微调器也会很好)但不是讨厌 -v.

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

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

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

在上述 none 个案例中,您需要命令替换吗?

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

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

如果 </code> 为空或未设置,您可以显着重构 <code>tinput 以指定 2 作为 -A 选项的默认值。

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