我想在bash中使用echo
打印出一串字符,后面只有一个回车符。我查看了手册页,发现echo -e
将使echo
解释反斜杠转义字符。使用它我可以说echo -e 'hello\r'
,它会像这样打印
$>echo -e 'hello\r'
hello
$>
所以看起来它正确地处理了回车。我还发现手册页中的echo -n
将阻止echo
插入换行符,看起来它在我这样做时有效
$>echo -n 'hello\r'
hello\r$>
我遇到的问题是将-e
和-n
结合起来。我已经尝试了echo -e -n 'hello\r'
,echo -n -e 'hello\r'
,echo -en 'hello\r'
和echo -ne 'hello\r'
中的每一个,并且没有像这样打印:
$>echo -ne 'hello\r'
$>
我在这里缺少什么,或-e
和-n
选项不能一起使用?
答案 0 :(得分:15)
我认为它有效,你只是没有看到它。这是你的命令:
$> echo -ne 'hello\r'
由于回车符(\r
),这会将光标留在写入hello
的终端上同一行的开头 - 这意味着下一个输出到的位置终端将被写入。因此,如果您的实际提示超过此处显示的$>
,则会完全覆盖hello
。
这个序列可以让你看到实际发生的事情:
echo -ne 'hello\r'; sleep 5; echo 'good-bye'
但为了更好地移植到其他shell,我会避免在echo
上使用这样的选项。这些纯粹是bashisms,不受POSIX标准的支持。但是,printf
内置函数由POSIX指定。因此,如果您想显示没有换行符和解析反斜杠序列的字符串,您可以使用它:
printf '%s\r' 'hello'
答案 1 :(得分:10)
echo
命令有许多不同的实现。大多数shell中都有一个(每个shell都有不同的行为),/bin/echo
的行为因系统而异。
而不是echo
,请使用printf
。它内置于bash中,并且可作为外部命令使用,并且其行为在各实现中更加一致。 (主要变化是GNU coreutils printf
识别--help
和--version
选项。)
只需使用:
printf 'hello\r'
答案 2 :(得分:6)
我希望您向我介绍printf。
OP,见printf
。 printf
。这是OP ......
每当您尝试使用BASH中的输出执行任何异常时,您应切换到printf
。实际上,我一直使用printf
,因此我的脚本将在BASH和Kornshell下运行。
尽管BASH和Kornshell的相同度为99%,但echo
命令却不同。在Kornshell中,它已被弃用,您应该使用内置print
。但是,BASH中没有print
。使用printf
解决了这个问题,因为它在两个shell中都是相同的(有点)。
由于printf
不会自动以\n
结束每一行,因此您无需担心如何阻止附加\n
。哎呀,如果你想要\n
,你必须自己动手。在你的情况下:
printf `hello\r`
但是,出于安全原因,您应该这样做:
printf '%s\r' 'hello'
当我使用printf
时,这是我习惯的习惯。想象一下,如果我想要打印$FOO
,我这样做:
printf "$FOO\n"
这通常会有效,但如果$FOO
在开头有短划线,或者其中有%
符号,该怎么办?以上不会做我想做的事。但是,如果我这样做:
printf '%s\n' "$FOO"
无论$FOO
中包含$FOO
,都会打印{{1}}。
答案 3 :(得分:2)
POSIX 7 says it is not possible:
如果第一个操作数是-n,或者如果任何操作数包含反斜杠字符,则结果是实现定义的。
例如在Ubuntu 12.04上:
echo -e '\n'
解释换行符,echo '\n'
没有。/bin/sh
的内置echo
没有-e
选项,即使没有它也会解释换行符。写Makefile
时,这可以是字节,默认情况下使用/bin/sh
。 POSIX 7解决方案:printf
正如其他人所提到的那样。
答案 4 :(得分:1)
引用。这是未来的潮流。总是引用。
echo -ne 'hello\r'
如果在要扩展的内部放置一个变量,请使用双引号。