Уникнути послідовності з "ехо -е" в різних оболонках


20

Я щойно помітив, що, здається, прапор -eне існує для echoкоманди в моїй оболонці в Linux. Це просто заплутане налаштування чи це "нормально"?

Деякі коди як приклад:

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

Друкує:

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

Це працювало раніше! Я здогадуюсь, що деякі sttyкоманди пішли жахливо неправильно, і тепер це вже не працює. Хтось припустив, що моя shнасправді справедлива bash.


Немає такого поняття, як "оболонка Linux" . Там же, наприклад , вбудований в оболонку , як це передбачено в пакеті на Debian (операційна система , яка може мати Linux або FreeBSD в якості його ядра). echo/bin/shdash
Стефан Шазелас

І саме тому я просто вкладаю втечу персонажів у свій сценарій, коли вони мені потрібні.

Відповіді:


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.

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
rici

4

Зауважте, що в будь-який час і майже в будь-якій оболонці ви можете зрозуміти, яке "відлуння" буде викликано, набравши type echoабо which echo. Зазвичай це вбудована оболонка. Отже, це залежить від того, який "ехо" встановлений і на якій оболонці ви використовуєте.


4
which echoйого не слід використовувати, він, ймовірно, не скаже вам, чи використовуєте ви вбудований, оскільки whichце зазвичай зовнішній двійковий файл. typeце добре, хоча.
Кріс Даун

1
Добре помічений, хоча на моїй головній оболонці (zsh) - це вбудований (як виявив type whichабо which which). ;)
piojo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.