在bash中如何输出字面字符串“-e”(仅此而已)?

7

我该如何使用echo输出字面字符串-e而不是其他内容?

我正在试图更好地理解shell参数的转义。

以下命令无法正常工作:

echo -e # prints nothing
echo '-e' # prints nothing
echo "-e" # prints nothing
echo \-e # prints nothing
echo \\-e # prints \-e
echo '\-e' # prints \-e
echo "'-e'" # prints '-e' (with quotes)
echo -- -e # prints -- -e

我找不到一个既不包含引号又不包含前导斜杠的选项。


printf '%s\n' -e?它不使用echo,但会打印出您想要的结果。 - Jonathan Leffler
4个回答

6
如何在bash中输出字面字符串“-e”(仅此而已)?
printf '%s\n' '-e'
printf -- '-e\n'

echo手册中,-e是一个选项:

-e
启用反斜杠转义字符的解析

bash内置命令中:

echo ...
如果给出了-e选项,则启用对以下反斜杠转义字符的解释。
...
echo不解释--表示选项结束。

因此,echo -e会使echo将-e解释为标志并打印空白换行符。 要打印-e,您基本上必须使用printf(或者您可以使用允许这样做的echo实现)。我不认为使用bash echo内置命令只能打印-e

printf更具可移植性。有些实现的echo不接受-e参数,但它可能有效。在网络上,您可以找到各种关于echo可移植性问题的网站


3
 echo -e '\x2de'

虽然不易读懂,但它确实可以工作


3

我假设真正的问题是为什么:

C#或Java函数永远不会根据你调用它的方式 foo(4)foo(2+2)foo((int)16/4) 而表现出不同的行为,因为这些信息在函数运行时就已经消失了。它可以知道你传递了什么,但无法知道你是如何传递的。

出于同样的原因,一个命令永远不会根据你如何转义其参数而表现出不同的行为。引号和转义是一种“how”,而结果字符串参数是“what”。

以下是每个尝试的等效 execlp 调用(echo 是 bash 内置的,但行为相同):

#    v-- How you passed it            v-- What you passed
echo -e     # execlp("echo", "echo", "-e", 0);   # prints nothing
echo '-e'   # execlp("echo", "echo", "-e", 0);   # prints nothing
echo "-e"   # execlp("echo", "echo", "-e", 0);   # prints nothing
echo \-e    # execlp("echo", "echo", "-e", 0);   # prints nothing
echo \\-e   # execlp("echo", "echo", "\\-e", 0); # prints \-e
echo '\-e'  # execlp("echo", "echo", "\\-e", 0); # prints \-e
echo "'-e'" # execlp("echo", "echo", "'-e'", 0); # prints '-e' (with quotes)
echo -- -e  # execlp("echo", "echo", "--", "-e", 0);   # prints -- -e

正如您所看到的,how并不会对输出产生任何影响。最终结果取决于what。这就是为什么无论进行多少转义,都无法达到预期效果的原因。


有道理。我想我没有真正考虑过 echo 接收到的内容 :-) 在这种情况下,我猜 echo 简单地没有实现一种逃避潜在标志的方法,而其他应用程序则手动支持 -- 处理这种情况? - mpen
1
没错。它不能使用普通约定,因为出于历史原因 POSIX 不允许这样做,由于这个和其他历史可移植性问题,建议使用 printf - that other guy

0
另一种方法是使用 awk、Bash C 风格字符串和 'here string' :
$ awk '1' <<< $'-e' 
-e

如果您的目标是不使用引号:这将能够正常工作。

$ awk '1' <<< -e
-e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接