2

我注意到echo直接调用时的行为略有不同

root$echo "line1\nline2"

当通过脚本调用时:

#! /bin/sh

echo "line1\nline2"

[...]

第一个案例将打印:

line1\nline2

,而后者将打印

line1
line2

所以在脚本中使用时echo总是假定有标志?-e

4

1 回答 1

5

您的脚本有一个 shebang 行#! /bin/sh,而您的交互式 shell 可能是 Bash。如果您想要 Bash 行为,请将脚本更改为#! /bin/bash

这两个程序是不同sh的shell。即使在相同程序的系统上,它的行为也会因您使用哪个命令来调用它而有所不同。(虽然它不像在 Bash 模式下默认打开,所以你可能在一个真正的系统上。)bash/bin/sh/bin/bashecho-eshshdash

如果您sh在提示符下键入,您会发现其echo行为方式与您的脚本中的方式相同。但是sh对于交互使用来说并不是一个非常友好的shell。

如果您正在尝试编写最大程度地可移植的 shell 脚本,您应该坚持使用 vanillash语法,但如果您不是为广泛的分发而编写,您可以使用 Bash 脚本 - 只需确保告诉系统它们是,在事实上,Bash 脚本,通过放入bashshebang 行。

顺便说一句,该echo命令可能是 shell 中最臭名昭著的不一致命令。因此,如果您追求可移植性,最好完全避免使用它,而不是直接输出、无选项、无转义、始终为换行符输出。一个非常便携的选项是printf

于 2012-05-14T21:41:55.027 回答