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

Yun*_*nus 4 bash

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

例子:

    function echo () {
        echo -n "$@" ;
    }  
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 7

echo() {
  command echo -n "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

因为在这里,echo也恰好是一个内置命令(在$PATHBTW 中没有查找,因为内置命令优先于文件系统命令),你也可以这样做:

echo() {
  builtin echo -n "$@"
}
Run Code Online (Sandbox Code Playgroud)

后一种方法在zsh, where command echowill run 中更可取/bin/echosh仿真除外)。

外壳之间有一些细微的差异,但优先顺序通常是:

  1. 特殊的内置函数
  2. 职能
  3. 内置函数
  4. 命令$PATH(并且顺序取决于由内置程序管理$PATHhash表中和表中的顺序hash

请记住,shell 语法 ( for, if...)中的别名和关键字在未引用时被考虑在它们之前。

的顺序1,并2在像一些贝壳逆转bashzshbash不允许在调用时使用与特殊内置函数相同的名称定义函数sh