试图获得两个bash函数与管道和可选的参数工作

问题描述:

我有两件事,一个是一个函数,另一个是别名,他们不太正常工作。试图获得两个bash函数与管道和可选的参数工作

第一个是拖尾日志,但只显示前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,出于某种原因,我忘记了在终端的参数是由空格分隔的,而不是撇号,所以它工作;坦率地说,我只使用grep因为我无法得到我真正想要的,从tail -f每个单独的输出的前n行,没有其他我试过。

+0

不知道zsh的,但在bash,你不能使用别名..使用函数变量,而不是..见:https://unix.stackexchange.com/questions/30925/in-bash-何时写脚本以及何时写脚本功能/ 30964#30964 – Sundeep

+0

好,够公平的。 – Thermatix

+1

您正在执行管道命令行的输出'tail -f $ 1 | grep $ 2 -A 2'。为什么使用'$(...)'? – Jdamian

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

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} 
}