bash:覆盖echo以在脚本中打印自定义前缀

Ilj*_*Bek 3 bash overloading verbosity

我有一些冗长的脚本互相调用,我希望他们的输出更具描述性.我们的想法是为每个脚本定制echo命令,如下所示.

我的问题是,如何使它非递归,使用echo

这是script1.sh

#!/bin/bash
#Original version:
#function echo(){ echo $(basename $0 .sh): $1; }
#Version after fixes
function echo(){ builtin echo -n "$(basename $0 .sh): ">&2; builtin echo $@ ; } 
echo Info
./script2.sh
Run Code Online (Sandbox Code Playgroud)

这是script2.sh

#!/bin/bash
#Original version:
#function echo(){ echo $(basename $0 .sh): $1; }
#Version after fixes
function echo(){ builtin echo -n "$(basename $0 .sh): ">&2; builtin echo $@ ; } 
echo Info
exit 0
Run Code Online (Sandbox Code Playgroud)

所以输出应该是:

>./script1.sh
script1: Info
script2: Info
Run Code Online (Sandbox Code Playgroud)

---编辑

奖金:

>./script1.sh 2> /dev/null 
Info
Info
Run Code Online (Sandbox Code Playgroud)

les*_*ana 12

使用builtin关键字:

function echo(){ builtin echo $(basename $0 .sh): $1; }
Run Code Online (Sandbox Code Playgroud)

这里的帮助页面:

$ help builtin
builtin: builtin [shell-builtin [arg ...]]
    Execute shell builtins.

    Execute SHELL-BUILTIN with arguments ARGs without performing command
    lookup.  This is useful when you wish to reimplement a shell builtin
    as a shell function, but need to execute the builtin within the function.

    Exit Status:
    Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is
    not a shell builtin..
Run Code Online (Sandbox Code Playgroud)

  • +1; 但不是"$ 1",最好写"$ @".(请注意,此函数会禁用所有`echo`的特殊功能,例如`-E`和`-n`.) (2认同)