Escape-последовательности с «эхо-е» в разных оболочках

20

Я только что заметил, что, похоже, флаг -eне существует для echoкоманды в моей оболочке в Linux. Это просто неправильная настройка или это "нормально"?

Некоторый код в качестве примера:

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

Печать:

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

Это работало раньше! Я думаю, что некоторые sttyкоманды пошли ужасно неправильно, и теперь это больше не работает. Кто-то предположил, что мой shбыл на самом деле просто bash.

BrainStone
источник
Нет такой вещи как «оболочка Linux» . Там же, например , встроенный в оболочку , как это предусмотрено в пакете на Debian (операционная система , которая может иметь Linux или FreeBSD в качестве его ядра). echo/bin/shdash
Стефан Шазелас
И именно поэтому я просто помещаю escape-символы в свой сценарий, когда они мне нужны.

Ответы:

20

Поскольку вы использовали sh, а не bash, то echoкоманда в shне имеет опции -e. С shmanpage:

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.
cuonglm
источник
5
shПоддержка нескольких реализаций echo -e, во время компиляции bashможно сказать не поддерживать echo -e. Просто этот конкретный sh (возможно dash) не поддерживает, в -eто время как этот конкретныйbash делает.
Стефан Шазелас
17

-eэто не POSIX (на самом деле POSIX echo обычно не принимает никаких опций (хотя разрешено поддерживать -n), см. здесь ), и /bin/shв вашей системе это оболочка POSIX. -eЭто расширение принято в некоторых оболочках, но вы не должны полагаться на него, оно не переносимо. В идеале, используйте printfили переключитесь на использование оболочки, которая имеет echo -e.

Также смотрите предостережения \eв комментариях ниже, которые следует заменить на \033.

printf '\033[3;12r\033[3H'
Крис Даун
источник
3
как указывает gnouc, shтоже не распознает \e. Использование\033
Ричи
4

Обратите внимание, что в любое время и практически в любой оболочке вы можете выяснить, какой «echo» будет вызываться, набрав type echoили which echo. Обычно это встроенная оболочка. Так что это зависит от того, какой "эхо" установлен и на какой оболочке вы используете.

piojo
источник
4
which echoне должен использоваться, он, скорее всего, не скажет вам, используете ли вы встроенную функцию, потому что whichобычно это внешний двоичный файл. typeэто хорошо, хотя.
Крис Даун
1
Хорошо заметный, хотя на моей основной оболочке (zsh) это встроенный (как показывает type whichили which which). ;)
piojo