如何用echo打印'-e'?


8

我知道这echo -e不是一个普通的命令。我已经尝试过了echo '-e'echo \-e但是他们仍然无法正常工作。


1
“不是普通的命令行”是什么意思?echo通常是内置的shell,但通常也有/usr/bin/echo。该-e不是POSIX,但购的,例如在bash。请详细说明“它们仍然无法正常工作”的含义。预期的行为是什么?
maxschlepzig 2014年

我想使用echo打印-e。有什么建议么?
Highlights Factory

3
考虑使用printf,它更可移植。
2014年

1
奇怪的是,echo -- -e它也不起作用。按照惯例(至少使用GNU实用程序),双破折号表示选项的结尾,其余部分保留为文字参数。
Wil Cooley 2014年

6
echo再次疯狂。如果人们只会使用printf而永不回头。
延斯

Answers:


9
  • 与换行符

    echo -en '-e\n'
  • 没有换行符

    echo -e '-e\c'
  • 周围有空格:

    echo '-e '
    echo ' -e'
  • 使用退格键(感谢Joseph R.):

    echo -e ' \b-e'

    (它确实输出SPC BS-e LF,但是当发送到-eBS 渲染的终端时,将光标向左移动一列,从而导致-覆盖SPC)

bashecho内置行为可能取决于bash版本。这也取决于环境(POSIXLY_CORRECTSHELLOPTSBASHOPTS变量),选项(posixxpg_echo),构建选项和argv[0]shVS bash)。在这里测试了GNU bash 4.2.53(1),默认构建,默认选项,空环境,调用为bash。也可以使用zsh 5.0.5


+1也echo -e 'x\b-e'
约瑟夫

2
为什么这些丑陋的,难以理解的“变通办法”得到了好评?查尔斯·达菲(Charles Duffy)的正确答案是:使用printf并彻底忘记此类问题。
延斯2014年

7
Jens:因为OP询问如何使用echo命令进行操作。不需要态度。
ctc 2014年

1
echo -e ' \b-e'输出space-backspace-dash-e。仅显示在终端中,它会给您错觉,即破折号e。
斯特凡Chazelas

1
@CharlesDuffy,echo -e "\0-e"不输出NUL-dash-e。这只是终端忽略NUL字符(甚至用完全无效被发送到某些终端(即不支持流量控制),以给他们时间做其他长之类的东西回车。参见下部分延误和填充terminfo(5)。)
斯特凡Chazelas

25

最好的解决方案不是使用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

有趣的是,POSIX注释确实表示echo -e可移植。它说-n必须避免,并且必须避免转义序列。echo -e避免两者。但是,正如您在答案的最后部分所指出的那样,在GNU系统上,echo默认情况下完全不需要遵循POSIX,并且POSIX仅记录了跨POSIX系统的可移植性。
2014年

@hvd,我看不到-e链接到的规范部分。您能否提供包含该链接或引用的链接?
查尔斯·达菲

只是缺少提及而已。:)列出了不是便携式的,-e也没有提到的用途,因此-e也是便携式的(同样,在POSIX系统中)。公平地说,您所引用的内容是有信息的,但是规范性文本说的是同一件事:“如果第一个操作数为-n,或者任何操作数包含<backslash>字符,则结果是实现定义的。”
2014年

2
@hvd,相反。要按照指定的方式执行,echo需要发出所有参数,而没有标准相反定义的行为。因此,与POSIX规范涵盖的几乎所有其他命令行工具不同,它echo实际上为未给出的参数指定行为:打印它们。没有在不违反规范的情况下添加新标志的空间。
查尔斯·达菲

2
@hvd,...有关此问题,请参见以OPTIONS黑白显示的部分:Implementations shall not support any options
查尔斯·达菲

9

随着GNU echo-e与字符的ASCII码:

$ /bin/echo -e '\055'e
-e

055是其的八进制ASCII编号-(请参阅man ascii快速参考)。


1
/bin/echo确实是POSIX指定的。但是,它对八进制转义序列的解释是对基线规范的XSI扩展。
Charles Duffy 2014年

@CharlesDuffy确实,我误会了。+1为printf(也是我的第一个想法)。-e但是,鉴于这是扩展,是否有办法强制使用纯POSIX行为echo?我认为,这将消除所有的不确定性。
muru

2
其实,是!导出POSIXLY_CORRECT=1将导致GNU的POSIX兼容行为/bin/echo
查尔斯·达菲

+1谢谢,很高兴知道如何保持脚本的可移植性和“独立于Linux的自制软件”(即,还在工作的专业工作站上工作)。
语法错误2014年

@Kusalananda忘记了这一点。
muru

3

虽然明显的,标准的和推荐的解决方案是使用printf,但是echo根据实现的不同,实现起来可能非常棘手(-n尽管不那么棘手)。

POSIX.2017兼容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的内置dashksh88,Bourne shell的,CSH,tcsh的,豪华,RC,ES,akanga
  • GNU echo/bin/echo在GNU系统上)POSIXLY_CORRECT在环境中时。
  • 启用了echo内置选项mksh和其他pdksh派生posix选项时。
  • 所述echo的内置yash$ECHO_STYLE是未设置或之一SYSVXSIBSDDASHRAW

支持的实现 -e

包括echo研究的Unix V8(它来自哪里),GNU,busybox的,在中echo的内置bashzshpdksh和衍生物,fish一些ash基础的炮弹像BusyBox的shsh一些BSD系统的,最近的版本ksh93(在某些系统上,并与一些值$PATH)与它们的默认设置,yash$ECHO_STYLE一个GNUZSH

echo -e '-e\n\c'

支持的实现-e始终支持-n,因此:

echo -ne '-e\n'

也会工作。

sh

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的字符一样)。


2

使用-n,避免换行:

$ echo -n - && echo e
-e

在将无法正常工作zsh,其中-的选项分隔符结束或所有echo不支持的实现-n(那些支持-e也支持-n虽然)
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.