当我定义 bash 函数以使用程序名称时,我应该知道什么?

当我定义 bash 函数以使用程序名称时,我应该知道什么?

在许多情况下,我需要创建与其他程序同名的函数,并且我不知道这是否是使用 bash 脚本的好方法。

例子:

    function echo () {
        echo -n "$@" ;
    }  

测试后看起来它会在 bin 路径之前检查脚本内的函数名称。我想确定这一点以及我应该知道的任何其他信息。

答案1

echo() {
  command echo -n "$@"
}

在这里使用command意味着请求echo命令(恰好是内置的)而不是函数,否则函数会优先。

由于这里,也恰好是一个内置命令(顺便说一句,由于内置命令优先于文件系统命令,所以echo不会在其中查找),您也可以这样做:$PATH

echo() {
  builtin echo -n "$@"
}

后一种方法在 中更可取zshcommand echo将在其中运行/bin/echo(仿真除外sh)。

shell 之间存在一些细微的差异,但优先顺序通常是:

  1. 特殊的内置函数
  2. 功能
  3. 内置函数
  4. 命令$PATH(并且顺序取决于内置命令管理的表中$PATH和表中的顺序)hashhash

请记住,shell 语法中的别名和关键字 ( for, if...) 如果未加引号,则将被视为在这些别名和关键字之前。

在某些 shell 中,1和的顺序是相反的,例如或。当作为 调用时,不允许使用与特殊内置函数相同的名称来定义函数。2bashzshbashsh

相关内容