我有两件事,一件是功能,另一件是别名,他们不能正常工作。
第一个用于拖尾日志,但只显示您要查找的日志的重要部分,然后显示接下来的两行或您指定的许多行,只显示前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行,而我尝试的其他任何东西都没有。
答案 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}
}