我想echo
在bash中使用打印出一串字符后跟一个回车符.我查看了手册页,发现echo -e
将echo
解释反斜杠转义字符.使用它,我可以说echo -e 'hello\r'
,它会像这样打印
$>echo -e 'hello\r'
hello
$>
Run Code Online (Sandbox Code Playgroud)
所以看起来它正确地处理了回车.我还发现echo -n
在手册页中将停止echo
插入换行符,当我这样做时它看起来像是有效的
$>echo -n 'hello\r'
hello\r$>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是在这两个相结合-e
和-n
.我试过每个echo -e -n 'hello\r'
,echo -n -e 'hello\r'
,echo -en 'hello\r'
,和echo -ne 'hello\r'
没有东西印像这样:
$>echo -ne 'hello\r'
$>
Run Code Online (Sandbox Code Playgroud)
有没有我在这里缺少的东西,或者这些-e
和-n
选项不能一起使用?
Mar*_*eed 16
我认为它有效,你只是没有看到它.这是你的命令:
$> echo -ne 'hello\r'
Run Code Online (Sandbox Code Playgroud)
由于回车符(\r
),它会将光标留在它写入的终端上同一行的开头hello
- 这意味着将写入输出到终端的下一个东西.因此,如果您的实际提示比$>
您在此处显示的时间长,则会hello
完全覆盖.
这个序列可以让你看到实际发生的事情:
echo -ne 'hello\r'; sleep 5; echo 'good-bye'
Run Code Online (Sandbox Code Playgroud)
但为了更好地移植到其他shell,我会避免使用echo
类似的选项.这些纯粹是bashisms,不受POSIX标准的支持.该printf
内建,然而,由POSIX指定.因此,如果您想显示没有换行符的字符串并解析反斜杠序列,您可以使用它:
printf '%s\r' 'hello'
Run Code Online (Sandbox Code Playgroud)
Kei*_*son 10
该echo
命令有许多不同的实现.大多数shell中都有一个(每个shell都有不同的行为),并且/bin/echo
从一个系统到另一个系统的行为差异很大.
而不是echo
,使用printf
.它内置于bash中,并且可作为外部命令使用,并且其行为在各实现中更加一致.(主要的变化是GNU coreutils printf
识别--help
和--version
选项.)
只需使用:
printf 'hello\r'
Run Code Online (Sandbox Code Playgroud)
我希望你能向你介绍printf.
OP,见面printf
.printf
.这是OP ......
无论何时您尝试使用BASH中的输出执行任何异常操作,都应切换到printf
.事实上,我printf
一直在使用,所以我的脚本将在BASH和Kornshell下运行.
尽管BASH和Kornshell相同,但echo
命令却不同.在Kornshell中,它被弃用了,你应该使用内置的print
.但是,print
BASH中没有.使用printf
解决了这个问题,因为它在两个shell中都是相同的(有点).
由于printf
不会自动以a结束每一行\n
,因此您不必担心如何防止\n
附加.哎呀,如果你想要\n
,你必须自己动手.在你的情况下:
printf `hello\r`
Run Code Online (Sandbox Code Playgroud)
但是,出于安全原因,您应该这样做:
printf '%s\r' 'hello'
Run Code Online (Sandbox Code Playgroud)
这是我习惯使用的习惯printf
.想象一下,如果我想要打印出来$FOO
,我这样做:
printf "$FOO\n"
Run Code Online (Sandbox Code Playgroud)
这通常会起作用,但如果$FOO
在开头有一个破折号,或者有一个%
标志.以上不会做我想做的事.但是,如果我这样做:
printf '%s\n' "$FOO"
Run Code Online (Sandbox Code Playgroud)
这将打印出来,$FOO
无论$FOO
它有什么.