我知道这echo -e不是一个普通的命令。我已经尝试过了echo '-e',echo \-e但是他们仍然无法正常工作。
echo -- -e它也不起作用。按照惯例(至少使用GNU实用程序),双破折号表示选项的结尾,其余部分保留为文字参数。
echo再次疯狂。如果人们只会使用printf而永不回头。
我知道这echo -e不是一个普通的命令。我已经尝试过了echo '-e',echo \-e但是他们仍然无法正常工作。
echo -- -e它也不起作用。按照惯例(至少使用GNU实用程序),双破折号表示选项的结尾,其余部分保留为文字参数。
echo再次疯狂。如果人们只会使用printf而永不回头。
Answers:
与换行符
echo -en '-e\n'没有换行符
echo -e '-e\c'周围有空格:
echo '-e '
echo ' -e'使用退格键(感谢Joseph R.):
echo -e ' \b-e'
(它确实输出SPC BS-e LF,但是当发送到-eBS 渲染的终端时,将光标向左移动一列,从而导致-覆盖SPC)
bash的echo内置行为可能取决于bash版本。这也取决于环境(POSIXLY_CORRECT,SHELLOPTS和BASHOPTS变量),选项(posix,xpg_echo),构建选项和argv[0](shVS bash)。在这里测试了GNU bash 4.2.53(1),默认构建,默认选项,空环境,调用为bash。也可以使用zsh 5.0.5。
echo -e 'x\b-e'
echo命令进行操作。不需要态度。
echo -e ' \b-e'输出space-backspace-dash-e。仅显示在终端中,它会给您错觉,即破折号e。
echo -e "\0-e"不输出NUL-dash-e。这只是终端忽略NUL字符(甚至用完全无效被发送到某些终端(即不支持流量控制),以给他们时间做其他长之类的东西回车。参见下部分延误和填充在terminfo(5)。)
最好的解决方案不是使用echo,而是使用printf。
printf '%s\n' -e
这适用于任意变量:
var=-e
printf '%s\n' "$var"
……意味着您无需基于代码将要得到echod 的知识而在代码的其他地方进行任何特殊的准备/修改。
顺便提及,POSIX shell命令规范echo承认它在实现时是不可移植的,并且包含有关该主题的注释:
除非-n(作为第一个参数)和转义序列都被省略,否则不可能在所有POSIX系统上移植使用echo。
可以移植printf实用程序来模拟echo实用程序的任何传统行为,如下所示(假定IFS具有其标准值或未设置):
本书的POSIX.1-2008中具有历史意义的System V回声和XSI实现要求等同于:
printf "%b\n" "$*"BSD回声等效于:
if [ "X$1" = "X-n" ] then shift printf "%s" "$*" else printf "%s\n" "$*" fi鼓励新的应用程序使用printf代替echo。
(添加了强调)。
也就是说,在GNU系统上,存在替代方法:请求符合标准的行为。
$ POSIXLY_CORRECT=1 /bin/echo -e
-e
echo -e可移植。它说-n必须避免,并且必须避免转义序列。echo -e避免两者。但是,正如您在答案的最后部分所指出的那样,在GNU系统上,echo默认情况下完全不需要遵循POSIX,并且POSIX仅记录了跨POSIX系统的可移植性。
-e链接到的规范部分。您能否提供包含该链接或引用的链接?
-e也没有提到的用途,因此-e也是便携式的(同样,在POSIX系统中)。公平地说,您所引用的内容是有信息的,但是规范性文本说的是同一件事:“如果第一个操作数为-n,或者任何操作数包含<backslash>字符,则结果是实现定义的。”
echo需要发出所有参数,而没有标准相反定义的行为。因此,与POSIX规范涵盖的几乎所有其他命令行工具不同,它echo实际上为未给出的参数指定行为:打印它们。没有在不违反规范的情况下添加新标志的空间。
OPTIONS黑白显示的部分:Implementations shall not support any options。
随着GNU echo的-e与字符的ASCII码:
$ /bin/echo -e '\055'e
-e
055是其的八进制ASCII编号-(请参阅man ascii快速参考)。
/bin/echo确实是POSIX指定的。但是,它对八进制转义序列的解释是对基线规范的XSI扩展。
-e但是,鉴于这是扩展,是否有办法强制使用纯POSIX行为echo?我认为,这将消除所有的不确定性。
POSIXLY_CORRECT=1将导致GNU的POSIX兼容行为/bin/echo。
虽然明显的,标准的和推荐的解决方案是使用printf,但是echo根据实现的不同,实现起来可能非常棘手(-n尽管不那么棘手)。
echo小号POSIX 需要 echo -e输出-e<newline>。所以只是
echo -e
那里。echo在这方面符合POSIX 的(大多数在其他方面都不符合POSIX,在涉及POSIX规范时几乎无用echo)包括:
echo内置函数(在运行时或构建时,如Apple macOS的)。(该选项可以调用是否如还可以启用或时或在环境中)。bashxpg_echoposix/bin/shset -o posix; shopt -s xpg_echoposixshPOSIXLY_CORRECTSHELLOPTS=posix/bin/echo认证的UNIX系统(AIX,MacOS的,的Solaris至少),最BSD系统的echo的内置dash,ksh88,Bourne shell的,CSH,tcsh的,豪华,RC,ES,akangaecho(/bin/echo在GNU系统上)POSIXLY_CORRECT在环境中时。echo内置选项mksh和其他pdksh派生posix选项时。echo的内置yash时$ECHO_STYLE是未设置或之一SYSV,XSI,BSD,DASH,RAW-e包括echo研究的Unix V8(它来自哪里),GNU,busybox的,在中echo的内置bash,zsh,pdksh和衍生物,fish一些ash基础的炮弹像BusyBox的sh或sh一些BSD系统的,最近的版本ksh93(在某些系统上,并与一些值$PATH)与它们的默认设置,yash与$ECHO_STYLE一个GNU或ZSH:
echo -e '-e\n\c'
支持的实现-e始终支持-n,因此:
echo -ne '-e\n'
也会工作。
zshecho我知道的是唯一支持选项终止标记(-)的实现。
echo - -e
使用使其成为唯一echo可以输出任意数据的类Bourne外壳程序(也因为它是唯一在变量和内置参数中支持NUL字节的外壳)echo -E - "$data")
除了NUL字节问题外,其他可以输出任意数据的实现是FreeBSD或macOS /bin/echo,您可以在其中执行以下操作:
/bin/echo "$data
\c"
(在该实现中,\c仅在最后识别,并且不支持其他转义序列)。
和yash的:
ECHO_STYLE=RAW echo "$data"
(尽管请注意,yash变量只能保存文本,因此在语言环境中不是任意字节序列,在这些语言环境中,并非所有字节序列都可以形成有效字符,就像使用UTF-8作为其charap的字符一样)。
使用-n,避免换行:
$ echo -n - && echo e
-e
zsh,其中-的选项分隔符结束或所有echo不支持的实现-n(那些支持-e也支持-n虽然)
echo通常是内置的shell,但通常也有/usr/bin/echo。该-e不是POSIX,但购的,例如在bash。请详细说明“它们仍然无法正常工作”的含义。预期的行为是什么?