2016-09-27 31 views
1

当我的脚本以不同的方式启动时,为什么echo -n“...”的结果会有所不同?

$>echo -n "\033[40m " 

如果我唤起它的命令行,对将其保存到一个文件中,并唤起人们对命令行的文件,结果会有所不同。

我在mac上使用zsh,但期望这也可以与bash一起使用。不应该输出完全一样吗?如果不是,为什么?

+0

输入'tty'并查看结果 – dawg

+0

取决于您未提供的详细信息。你是否在你的文件上放置了一个shebang,所以它以'#!/ bin/sh','#!/ bin/bash','#!/ bin/zsh'开头,否则?你是用'./ yourscript'还是'zsh yourscript'或'来调用它。 yourscript'或其他东西?你需要准确地显示**你正在做什么,**完全**你得到的行为,因为这个问题是可以回答的。 –

+0

顺便说一句 - ** zsh不是bash **。如果你使用zsh运行代码,那么你就不会在bash中运行它,除非你有zsh启动一个单独的bash解释器来运行该代码。 –

回答

4

echo -n行为是壳(和的zsh和bash的确是不同的炮弹),因为它是,从字面上看,不确定的行为之间的不同:加工时The POSIX sh specification不需要外壳在任何特定的行为方式:

以下操作数应予支持:

- 要写到标准输出的字符串。如果第一个操作数是-n,或者任何操作数包含反斜杠(\)字符,则结果是实现定义的。

当使用XSI扩展,echo需要处理反斜杠转义序列等\033未给出进一步的参数;如果没有这些扩展,根本不需要处理这些序列,而是纯粹由实现定义的行为(因此取决于您的特定外壳)。


作为一个明确定义的替代,可以考虑:

#!/bin/sh 
#  ^^ - because this code doesn't use any shell-specific extensions; 
#   use #!/bin/zsh if zsh-only, #!/bin/bash if bash-only, etc. 

printf '%b' "\033[40m " 

上面将表现相同,是否带. yourscript./yourscriptbash yourscriptsh yourscriptzsh yourscript调用,因为它是由完整的定义POSIX规范(并且不依赖zsh选择违反该规范的任何行为)。

如果您使用的是特定于某个外壳的扩展,则需要使用./yourscript(以兑现第一行以根据其内容选择外壳),仅从同一外壳中调用. yourscript,或者<shellname> yourscript,再次与特定的外壳。

由于这个原因,./yourscript的用法是强烈的首选,因为它允许脚本本身控制自己的解释器。


从POSIX echo规范再次引用,此时距离实际应用信息部分:

这是不可能在所有的POSIX系统回声移植应用,除非两个-n(作为第一个参数)并且省略了转义序列。

printf实用程序可便携地用于模拟任何echo实用程序的传统的行为如下(假设IFS具有其标准值或是解除警戒):

历史系统V回波和对要求本卷IEEE标准1003.1-2001的XSI实现是等价于:

printf "%b\n" "$*" 

的BSD回波相当于:

if [ "X$1" = "X-n" ] 
then 
    shift 
    printf "%s" "$*" 
else 
    printf "%s\n" "$*" 
fi 

鼓励新应用程序使用printf而不是echo

相关问题