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



我有独立执行的脚本A、B、C等。我想重新定义echo如何适用于我正在使用的所有脚本。

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

#!/bin/bash
# Change the color of our output
# TODO: How to redefine echo for the parent caller?
PURPLE='33[1;35m'
NC='33[0m' # No Color
function echo() { builtin echo -e '33[1;35m'$0'33[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 preamble.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 '33[1;35m'$1'33[0m'; }

不是:

function echo() { builtin echo -e '33[1;35m'$0'33[0m'; }

无论是否在函数内部,$0都将保留脚本本身的名称。

编辑:对于您的另一个问题,您需要在当前shell中运行脚本,以使更改保持不变。你可以使用

source preamble.sh

. preamble.sh

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

最新更新