我当我的脚本以不同的方式启动时,为什么echo -n“...”的结果会有所不同?
$>echo -n "\033[40m "
如果我唤起它的命令行,对将其保存到一个文件中,并唤起人们对命令行的文件,结果会有所不同。
我在mac上使用zsh,但期望这也可以与bash一起使用。不应该输出完全一样吗?如果不是,为什么?
我当我的脚本以不同的方式启动时,为什么echo -n“...”的结果会有所不同?
$>echo -n "\033[40m "
如果我唤起它的命令行,对将其保存到一个文件中,并唤起人们对命令行的文件,结果会有所不同。
我在mac上使用zsh,但期望这也可以与bash一起使用。不应该输出完全一样吗?如果不是,为什么?
的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
,./yourscript
,bash yourscript
,sh yourscript
或zsh 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
。
输入'tty'并查看结果 – dawg
取决于您未提供的详细信息。你是否在你的文件上放置了一个shebang,所以它以'#!/ bin/sh','#!/ bin/bash','#!/ bin/zsh'开头,否则?你是用'./ yourscript'还是'zsh yourscript'或'来调用它。 yourscript'或其他东西?你需要准确地显示**你正在做什么,**完全**你得到的行为,因为这个问题是可以回答的。 –
顺便说一句 - ** zsh不是bash **。如果你使用zsh运行代码,那么你就不会在bash中运行它,除非你有zsh启动一个单独的bash解释器来运行该代码。 –