我正在寻找一种在其中一个设置文件中创建自定义函数的方法,以便当我打开新会话时,可以评估(或获取)相同的自定义函数,并且我可以轻松使用该函数。
我尝试创建一个函数来检查ERROR
日志文件中是否存在,因此当我检查日志文件时,我只需键入函数名称和日志文件名即可。现在我正在使用 grep:grep ERROR test.txt
但我想让事情变得更容易,因为我有很多这样的检查。所以我在中添加这一行.bashrc
:
ok(){grep ERROR $filename}
当我使用该函数时,我希望输入:ok test.txt
并且它应该给我错误行(如果有)。
但是,在评估该.bashrc
文件后,我收到一条错误消息:
-bash: .bashrc: line 16: syntax error: unexpected end of file
当我输入: 后ok test.txt
,它提供:
-bash: ok: command not found
有人可以帮我实现这个定制功能吗?或者我应该将代码粘贴到另一个设置文件中,例如.bashrc-profile
?
预先非常感谢!
答案1
shell 对{ ... }
结构的语法和空格非常挑剔。设置该功能的两种方法都可以:
ok() { grep ERROR $filename; }
ok() {
grep ERROR $filename
}
关于大括号{ .. }
与圆括号( .. )
,Bash 的手册指出:
后面的分号(或换行符)列表是必须的。
和
大括号是保留字,因此必须将它们与列表由空格或其他 shell 元字符组成。
列表指大括号内的命令,所有这些都适用于{ ... }
使用过的地方,但函数可能是最常见的地方。
另外,如果您希望能够将文件名作为函数的参数,请$1
在其中使用。即ok() { grep ERROR "$1"; }
可以用作ok test.txt
.
答案2
不必如此,你会感到自由并从中受益匪浅
ok() { set -f
if test -z "$2"
then
grep -HPine "$1" -r --include=*.log --include=*.txt
else
grep -HPine "$1" -r --include="$2"
fi
}
$ ok error test.txt
$ ok err test.txt
$ ok error
$ ok 'err|warn'
$ ok error logdata.*
第三次用法将在当前目录中的所有目录中查找具有 log 和 txt 扩展名的所有文件中具有“error”字符串的所有行
第四次用法将在具有 log 和 txt 扩展名的所有文件中查找具有“error”或“warn”字符串的所有行当前目录中的所有目录
第五个将在当前目录中的所有目录中查找所有名为 logdata 且具有任何扩展名的文件中包含“error”字符串的行