我在 my 中定义了一个.bashrc
我想绕过的函数:
function func() {
// func
}
export -f func
当我运行时,env -i func
我可以访问func
命令而不会妨碍function
,但如果我尝试"func"
或\func
那么我就没有任何运气。
我读到另一篇文章\
应该可以绕过 bash 函数,这是真的吗?如果是这样,有什么原因导致我在这种情况下无法使用它吗?
答案1
防止 shell 使用函数定义的官方方法是调用:
command func
看:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html
答案2
您可以使用外部命令“func”的路径名,例如/usr/bin/func
。
答案3
在函数名称上使用反斜杠或其他形式的引用没有任何效果。在 shell 的语法分析中,在解析引号之后很长时间才查找函数。
您或撰写您所读内容的人混淆了函数和别名。别名的解析要早得多,并且引用命令名称的任何部分都会使其不符合别名查找的条件。因此\func
强制func
成为函数、内置或外部命令,但不是别名。
要强制将命令名称解释为内置或外部命令,请使用command func
。要强制将命令名称解释为外部命令,请使用env func
。
答案4
根据bash 的文档,
姓名
仅由字母、数字和下划线组成且以字母或下划线开头的单词。名称用作 shell 变量和函数名称。也称为标识符。
单词
被 shell 视为一个单元的字符序列。单词不得包含未加引号的元字符。
它找到函数名称使用字:
如果命令名称不包含斜杠,shell 会尝试查找它。如果存在具有该名称的 shell 函数,则按如下所述调用该函数外壳函数。
引用用于删除某些字符或单词对 shell 的特殊含义。引号可用于禁用对特殊字符的特殊处理,以防止保留字被识别为此类,并防止参数扩展。
与 POSIX 一样,bash 提到了引用与别名,但都没有具体提及功能关于引用。
总之,没有记录的用于引用函数名称的功能。如果您想确保使用外部命令,那么使用斜杠是最佳选择。 bash 和POSIX同意这一点:
如果简单命令产生命令名称和可选参数列表,则应执行以下操作:
- 如果命令名称不包含任何
<slash>
字符,则应按以下顺序执行第一个成功步骤:
它有助于阅读文档。