18

我想echo在 bash 中使用打印出一串字符,后跟一个回车符。我查看了手册页,发现它echo -eecho解释反斜杠转义字符。使用它我可以说它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'
$>

我在这里遗漏了什么或者不能一起使用-eand选项吗?-n

4

5 回答 5

19

我认为它正在工作,你只是没有看到它。这是你的命令:

$> echo -ne 'hello\r' 

由于回车符 ( \r),这会将光标留在终端上它写入的同一行的开头hello- 这意味着将写入下一个输出到终端的内容。因此,如果您的实际提示比$>您在此处显示的要长,它将hello完全覆盖。

此序列将让您了解实际发生的情况:

echo -ne 'hello\r'; sleep 5; echo 'good-bye'

但是为了更好地移植到其他 shell,我会避免使用echo类似的选项。这些纯粹是 bashism,POSIX 标准不支持。但是,printf内置函数由 POSIX 指定。因此,如果您想显示没有换行符和反斜杠序列解析的字符串,您可以使用它:

printf '%s\r' 'hello'
于 2012-05-14T02:05:17.073 回答
10

该命令有许多不同的实现echo。大多数 shell 都内置了一个(每个 shell 具有不同的行为),并且/bin/echo从一个系统到另一个系统的行为差异很大。

而不是echo,使用printf. 它内置在 bash 中,也可以作为外部命令使用,并且它的行为在不同的实现中更加一致。(主要的变化是 GNU coreutilsprintf识别--help--version选择。)

只需使用:

printf 'hello\r'
于 2012-05-14T02:09:38.417 回答
7

我希望您向您介绍printf

OP,见面printfprintf. 这是OP...

每当你试图对 BASH 中的输出做任何不寻常的事情时,你应该切换到printf. 事实上,我printf一直在使用,所以我的脚本将在 BASH 和 Kornshell 下运行。

尽管 BASH 和 Kornshell 99% 相同,但echo命令不同。在 Kornshell 中,它已被弃用,您应该使用内置的print. 但是,printBASH 中没有。Usingprintf解决了这个问题,因为它在两个 shell 中的工作方式(有点)相同。

由于printf不会自动以 a 结束每一行\n,因此您不必担心如何防止\n附加 。哎呀,如果你想要一个\n,你必须自己把它。在你的情况下:

printf `hello\r`

但是,出于安全原因,您应该这样做:

printf '%s\r' 'hello'

这是我在使用时养成的习惯printf。想象一下,如果我想打印出来$FOO,我会这样做:

printf "$FOO\n"

这通常会起作用,但如果$FOO开头有破折号,或者有一个%标志怎么办。以上不会做我想做的事。但是,如果我这样做:

printf '%s\n' "$FOO"

$FOO无论里面有什么,这都会打印出来$FOO

于 2012-05-14T02:41:12.760 回答
2

POSIX 7说这是不可能的

如果第一个操作数是 -n,或者任何操作数包含反斜杠字符,则结果是实现定义的。

例如在 Ubuntu 12.04 上:

  • Bash 的内置 echo会echo -e '\n'解释换行符,echo '\n'但不会。
  • /bin/sh的内置echo没有-e选项,即使没有它也会解释换行符。Makefile这可以在写入s时进行字节处理,/bin/sh默认情况下使用。

POSIX 7 解决方案:printf正如其他人提到的。

于 2013-07-28T15:33:46.800 回答
1

报价。这是未来的浪潮。总是引用。

echo -ne 'hello\r'

如果您将要扩展的变量放入其中,请使用双引号。

于 2012-05-14T01:28:22.240 回答