我注意到echo
直接调用时的行为略有不同
root$echo "line1\nline2"
当通过脚本调用时:
#! /bin/sh
echo "line1\nline2"
[...]
第一个案例将打印出来:
line1\nline2
,而后者会打印
line1
line2
因此,在脚本中使用时,echo
总是被假定为标记-e
?
答案 0 :(得分:5)
您的脚本有#! /bin/sh
的shebang行,而您的交互式shell可能是Bash。如果您需要Bash行为,请将脚本更改为#! /bin/bash
。
两个程序sh
和bash
是不同的 shell。即使在/bin/sh
和/bin/bash
是同一程序的系统上,它的行为也会有所不同,具体取决于您用来调用它的命令。 (虽然echo
的行为与Bash的-e
模式默认启用sh
的行为不同,所以您可能正在sh
真正dash
sh
的系统上1}}。)
如果您在提示符下键入echo
,则会发现sh
的行为方式与脚本相同。但是sh
对于交互式使用来说并不是一个非常友好的shell。
如果您正在尝试编写最大程度的可移植shell脚本,那么您应该坚持使用vanilla bash
语法,但如果您不是为了远程编写分发,可以使用Bash脚本 - 只需确保通过将echo
放在shebang行中,告诉系统它们实际上是Bash脚本。
顺便说一下,{{1}}命令可能是跨shell最臭名昭着的命令。因此,如果你想要便携性,那么你最好完全避免它,除了直接,无选项,无逃避,总是换行输出。一个非常便携的选项是printf。