在不同的shell中使用“ echo -e”转义序列


20

我只是注意到,Linux上的Shell中-e似乎不存在该echo命令的标志。这是一个混乱的设置还是“正常”的?

以一些代码为例:

#!/bin/sh
echo -e "\e[3;12r\e[3H"

印刷品:

-e \e[3;12r\e[3H

这以前工作!我猜有些stty命令非常错误,现在不再起作用。有人建议我sh实际上是正义的bash


没有“ Linux shell”这样的东西。例如,Debian上的软件包提供shell echo内置功能/bin/shdash(该操作系统可以将Linux或FreeBSD作为其内核)。
斯特凡Chazelas

这就是为什么我在需要脚本时才将转义字符放在脚本中的原因。

Answers:


20

因为你使用的sh,而不是bash,然后echo命令在sh没有选项-e。从sh联机帮助页:

echo [-n] args...
            Print the arguments on the standard output, separated by spaces.
            Unless the -n option is present, a newline is output following the
            arguments.

而且它也没有\e

        If any of the following sequences of characters is encountered
        during output, the sequence is not output.  Instead, the specified
        action is performed:

        \b      A backspace character is output.

        \c      Subsequent output is suppressed.  This is normally used at
                the end of the last argument to suppress the trailing new
                line that echo would otherwise output.

        \f      Output a form feed.

        \n      Output a newline character.

        \r      Output a carriage return.

        \t      Output a (horizontal) tab character.

        \v      Output a vertical tab.

        \0digits
                Output the character whose value is given by zero to three
                octal digits.  If there are zero digits, a nul character
                is output.

        \\      Output a backslash.

        All other backslash sequences elicit undefined behaviour.

5
有几个sh实现支持echo -e,在编译时bash可以告诉不支持echo -e。这只是特定SH(可能dash)不支持-e,而该特定bash一样。
斯特凡Chazelas

17

-e不是POSIX(实际上,POSIX echo通常不接受任何选项(尽管允许支持-n),请参见此处),并且/bin/sh在您的系统上似乎是POSIX shell。-e是某些Shell所接受的扩展,但是您不应该依赖它,它不是可移植的。理想情况下,使用printf或切换为使用具有的外壳echo -e

另请参阅\e以下注释中的注意事项,应将其替换为\033

printf '\033[3;12r\033[3H'

3
正如gnouc所指出的,两者sh都不识别\e。使用\033
rici

4

请注意,您几乎可以在几乎任何外壳中的任何时间通过键入type echo或来确定将调用哪个“ echo” which echo。通常是内置的shell。因此,这取决于安装了哪个“ echo”以及所使用的外壳。


4
which echo不应使用,因为which通常是外部二进制文件,因此它可能不会告诉您是否使用内置函数。type很好,但是。
克里斯·

1
很好发现,尽管在我的主外壳(zsh)上,它是内置的(如type which或所示which which)。;)
piojo
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.