0

我有一个包含这样内容的 shell 程序

!#/bin/bash

echo \\n program

一旦我在 Linux 以外的平台上运行该程序,它就会识别特殊字符并将输出显示为

(newline)
program

当同一个程序在 Linux 上运行时,echo 命令需要“-e”选项。现在我不想在我的文件中显式地用“echo -e”更改每次出现的回声,因为这样会开始在其他平台上产生问题。所以我想做一个条件编译,比如

set SYSTEM="uname -s"

#if ($SYSTEM == Linux)
set echo="echo -e"
#endif

但这不起作用,因为使用 set 或 export 命令,我需要用 $echo 替换所有出现的 echo,我不想这样做。再次设置别名并不能解决此问题,因为即使在 subshel​​l 中我也需要将 echo 替换为“echo -e”。

有没有其他方法可以用“echo -e”代替echo,仅适用于Linux平台?

4

4 回答 4

1

使用 和 的组合,BASH_ENV我们可以做到:

bash-3.2$ export BASH_ENV=$HOME/always-source
bash-3.2$ cat $HOME/always-source 
echo() {
    command echo -e "$@"
}

bash-3.2$ cat runme.bash
#!/bin/bash

echo "\nHello World $1\n"

if [[ -z $1 ]]; then
    $0 child
fi

和一个调用:

bash-3.2$ ./runme.bash 

Hello World 


Hello World child

将其包装在 bash 测试中(linux 和 mac os x):

if [[ $(uname -s) = Linux ]] || [[ $(uname -s) = Darwin ]]; then
    export BASH_ENV=$HOME/always-source
fi
于 2013-04-05T20:11:27.707 回答
0

我相信您正在寻找别名。

bash 中的语法是 alias echo='echo -e';

于 2013-04-05T20:12:12.727 回答
0

我知道您不想更改回声呼叫,但是您如何考虑使用echo $'\nhello\n'而不是echo -e

于 2013-04-05T20:18:07.167 回答
0

在你的 shell 中定义一个别名:

alias echo="echo -e";

然后获取您的脚本:

source ./<script1>

通过这样做,您的脚本将不会创建子 shell 并使用父 shell 的变量。此外,即使在脚本终止后,您在脚本中定义的变量也会存在。

要在 script1.sh 中调用其他脚本,请使用 source:

source ./<script2>
于 2013-04-05T20:50:35.577 回答