Linux 通过调用重新定义echo的脚本来重新定义多个脚本的echo

Linux 通过调用重新定义echo的脚本来重新定义多个脚本的echo,linux,bash,shell,Linux,Bash,Shell,我有独立执行的脚本A、B、C等。我想重新定义echo在我使用的所有脚本中的工作方式 我制作了下面的脚本,premission.sh,我从每个脚本A、B、C调用它: #!/bin/bash # Change the color of our output # TODO: How to redefine echo for the parent caller? PURPLE='\033[1;35m' NC='\033[0m' # No Color function echo() { builtin

我有独立执行的脚本A、B、C等。我想重新定义echo在我使用的所有脚本中的工作方式

我制作了下面的脚本,
premission.sh
,我从每个脚本A、B、C调用它:

#!/bin/bash

# Change the color of our output
# TODO: How to redefine echo for the parent caller?
PURPLE='\033[1;35m'
NC='\033[0m' # No Color
function echo() { builtin echo -e '\033[1;35m'$0'\033[0m'; }

unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux ;;
Darwin*) machine=Mac ;;
CYGWIN*) machine=Cygwin ;;
MINGW*) machine=MinGw ;;
*) machine="UNKNOWN:${unameOut}" ;;
esac
echo "[Running on ${machine}...]"
当我从另一个脚本中执行
bash premission.sh
时,我得到的只是

preamble.sh
紫色(我希望echo在每个脚本A、B、C等中使用的颜色)

我想最终的结果是echo在preamble.sh中被正确地重新定义了,但这不是我所期望的工作方式。当我调用
bash preamble.sh
时,会执行
preamble.sh
,但它不会告诉我它在哪台机器上运行,而是以紫色打印
preamble.sh
,因为这一定是参数
$0

我意识到我可能正在做一些不可能直接做的事情


如何实现我试图实现的目标?

函数的参数有
$1
$2

你想要:

function echo() { builtin echo -e '\033[1;35m'$1'\033[0m'; }
不是:

无论是否在not函数中,
$0
将保留脚本本身的名称

编辑:对于您的另一个问题,您需要在当前shell中运行脚本,以使更改保持不变。您可以使用以下两种方法之一执行此操作:

source preamble.sh


这是必要的,因为默认情况下,脚本将在新的shell中运行,并且您定义的任何变量、函数等都将不可见。

这解决了一个问题。所以现在我看到了在Linux上运行的
,正如预期的紫色。如何为脚本A、B、C等重新定义echo。它仍然以常用颜色打印所有其他内容,因此不会保留
echo
的新定义。请尝试
source preamble.sh
,这很有效!我不知道为什么我不想这样做,因为有时我会用
source~/.bashrc
来代替重新启动终端。另外请注意
echo-e“$foo”
最好用
printf“%b\n'$foo”
替换。请参阅以获得深入讨论。请注意,
函数
关键字仅在bash中用于与旧ksh兼容,不应在新代码中使用。另请参见,使用bash语法和
.bash
扩展名命名库,而不是
.sh
(这适用于符合POSIX sh的shell库;而作为可执行文件而不是库的东西根本不应该有扩展名)。
source preamble.sh
. preamble.sh