\ 可以用于转义函数吗?

\ 可以用于转义函数吗?

我在 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 函数,则按如下所述调用该函数外壳函数

在有关部分中指出引用(如同POSIX):

引用用于删除某些字符或单词对 shell 的特殊含义。引号可用于禁用对特殊字符的特殊处理,以防止保留字被识别为此类,并防止参数扩展。

与 POSIX 一样,bash 提到了引用与别名,但都没有具体提及功能关于引用。

总之,没有记录的用于引用函数名称的功能。如果您想确保使用外部命令,那么使用斜杠是最佳选择。 bash 和POSIX同意这一点:

如果简单命令产生命令名称和可选参数列表,则应执行以下操作:

  1. 如果命令名称不包含任何<slash>字符,则应按以下顺序执行第一个成功步骤:

它有助于阅读文档。

相关内容