如何将通配符参数传递给 bashrc 函数
How to pass a wildcard parameter to a bashrc function
我在 .bashrc
文件中设置了一个功能,使我可以轻松 运行 我在日常工作中经常使用的命令。相关函数:
chkerrors () { egrep -i 'page allocation failure|oom-killer|soft lockup|blocked for more' ""; }
我通常会 运行 将其放在单个文件中,例如:
$ chkerrors /var/log/messages
然而,有些情况下消息文件已被轮换,因此会有多个消息文件。
简单地运行使用相同的命令并在末尾添加通配符似乎无法正常工作:
$ chkerrors /var/log/messages*
我的问题是,我该如何调整我的功能,以便 运行 类似于上面的带通配符的命令?
谢谢!
当您调用 chkerrors /var/log/messages*
时,glob 将在调用函数之前扩展 bash
,例如实际的函数调用是 chkerrors /var/log/messages1 /var/log/messages2 /var/log/messages3
.
这意味着该函数接收多个参数,但您只处理第一个参数,</code>。您将改为使用 <code>"$@"
:
来处理其所有参数
chkerrors () { egrep -i 'page allocation failure|oom-killer|soft lockup|blocked for more' "$@"; }
"$@"
的特殊之处在于它不会像引号通常暗示的那样扩展为单个单词,而是扩展为引用单词的列表,因此与 glob 匹配的每个文件都将被视为egrep
命令的附加参数,包含 IFS 字符的文件将被正确地视为单个参数,而不是一分为二。
我在 .bashrc
文件中设置了一个功能,使我可以轻松 运行 我在日常工作中经常使用的命令。相关函数:
chkerrors () { egrep -i 'page allocation failure|oom-killer|soft lockup|blocked for more' ""; }
我通常会 运行 将其放在单个文件中,例如:
$ chkerrors /var/log/messages
然而,有些情况下消息文件已被轮换,因此会有多个消息文件。
简单地运行使用相同的命令并在末尾添加通配符似乎无法正常工作:
$ chkerrors /var/log/messages*
我的问题是,我该如何调整我的功能,以便 运行 类似于上面的带通配符的命令?
谢谢!
当您调用 chkerrors /var/log/messages*
时,glob 将在调用函数之前扩展 bash
,例如实际的函数调用是 chkerrors /var/log/messages1 /var/log/messages2 /var/log/messages3
.
这意味着该函数接收多个参数,但您只处理第一个参数,</code>。您将改为使用 <code>"$@"
:
chkerrors () { egrep -i 'page allocation failure|oom-killer|soft lockup|blocked for more' "$@"; }
"$@"
的特殊之处在于它不会像引号通常暗示的那样扩展为单个单词,而是扩展为引用单词的列表,因此与 glob 匹配的每个文件都将被视为egrep
命令的附加参数,包含 IFS 字符的文件将被正确地视为单个参数,而不是一分为二。