我知道这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,但是当发送到-e
BS 渲染的终端时,将光标向左移动一列,从而导致-
覆盖SPC)
bash
的echo
内置行为可能取决于bash版本。这也取决于环境(POSIXLY_CORRECT
,SHELLOPTS
和BASHOPTS
变量),选项(posix
,xpg_echo
),构建选项和argv[0]
(sh
VS 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"
……意味着您无需基于代码将要得到echo
d 的知识而在代码的其他地方进行任何特殊的准备/修改。
顺便提及,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的)。(该选项可以调用是否如还可以启用或时或在环境中)。bash
xpg_echo
posix
/bin/sh
set -o posix; shopt -s xpg_echo
posix
sh
POSIXLY_CORRECT
SHELLOPTS=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'
也会工作。
zsh
echo
我知道的是唯一支持选项终止标记(-
)的实现。
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。请详细说明“它们仍然无法正常工作”的含义。预期的行为是什么?