Как напечатать «-e» с помощью echo?

Как напечатать «-e» с помощью echo?

Я знаю, что echo -eэто не обычная команда. Я пробовал echo '-e', echo \-eно они все равно не работают.

решение1

Лучшее решение — не использовать echo, а вместо этого использовать printf.

printf '%s\n' -e

Это работает с произвольными переменными:

var=-e
printf '%s\n' "$var"

...это означает, что вам не нужно выполнять какую-либо специальную подготовку/модификацию где-либо еще в вашем коде, исходя из знания того, что значение будет echod.


Кстати,спецификация команд оболочки POSIX дляechoпризнает, что в том виде, в котором он реализован, он непереносим, ​​и содержит примечание по этому поводу:

Невозможно переносимо использовать echo во всех системах POSIX, если не опущены ни -n (в качестве первого аргумента), ни escape-последовательности.

Утилиту printf можно использовать переносимо для эмуляции любого традиционного поведения утилиты echo следующим образом (предполагается, что IFS имеет стандартное значение или не установлен):

Историческое эхо System V и требования к реализациям XSI в этом томе POSIX.1-2008 эквивалентны:

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

решение2

  • с новой строкой

    echo -en '-e\n'
    
  • без новой строки

    echo -e '-e\c'
    
  • с пробелами вокруг:

    echo '-e '
    echo ' -e'
    
  • с помощью клавиши backspace (спасибо Джозефу Р.):

    echo -e ' \b-e'
    

    (он выводит SPC BS - e LF, но при отправке на терминал, который отображается как -eBS, перемещает курсор назад на один столбец влево, что приводит -к перезаписи SPC)

Поведение встроенной bashфункции echoможет зависеть от версии bash. Оно также зависит от окружения ( POSIXLY_CORRECT, SHELLOPTSи BASHOPTSпеременных), опций ( posix, xpg_echo), опций сборки и argv[0]( shvs bash). Здесь протестировано с GNU bash 4.2.53(1), сборкой по умолчанию, опциями по умолчанию, пустой средой, вызванной как bash. Работает также с zsh 5.0.5.

решение3

С помощью GNU echoс -eкодами ASCII для символов:

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

055— восьмеричное число ASCII для -(см. man asciiдля краткой справки).

решение4

Используйте -n, чтобы избежать новой строки:

$ echo -n - && echo e
-e

Связанный контент