我注意到echo
直接调用时的行为略有不同
root$echo "line1\nline2"
当通过脚本调用时:
#! /bin/sh
echo "line1\nline2"
[...]
第一个案例将打印:
line1\nline2
,而后者将打印
line1
line2
所以在脚本中使用时echo
总是假定有标志?-e
您的脚本有一个 shebang 行#! /bin/sh
,而您的交互式 shell 可能是 Bash。如果您想要 Bash 行为,请将脚本更改为#! /bin/bash
。
这两个程序是不同sh
的shell。即使在相同程序的系统上,它的行为也会因您使用哪个命令来调用它而有所不同。(虽然它不像在 Bash 模式下默认打开,所以你可能在一个真正的系统上。)bash
/bin/sh
/bin/bash
echo
-e
sh
sh
dash
如果您sh
在提示符下键入,您会发现其echo
行为方式与您的脚本中的方式相同。但是sh
对于交互使用来说并不是一个非常友好的shell。
如果您正在尝试编写最大程度地可移植的 shell 脚本,您应该坚持使用 vanillash
语法,但如果您不是为广泛的分发而编写,您可以使用 Bash 脚本 - 只需确保告诉系统它们是,在事实上,Bash 脚本,通过放入bash
shebang 行。
顺便说一句,该echo
命令可能是 shell 中最臭名昭著的不一致命令。因此,如果您追求可移植性,最好完全避免使用它,而不是直接输出、无选项、无转义、始终为换行符输出。一个非常便携的选项是printf。