Имеет ли значение echo -e, когда кавычки не используются?

В этом случае попробуйте перезапустить dbus:

service dbus restart
0
30.07.2020, 20:13
2 ответа

\— это оператор кавычек оболочки. \xпохож на 'x'в том, что он удаляет специальное значение x(, за исключением случаев, когда xявляется символом новой строки, который он удаляет вместо ).

Так:

echo -e \tr\t\e\\re\e

похоже на:

echo -e 't'r't''e''\'re'e'

Ни один из t, r, eне является специальным в синтаксисе оболочки. \- единственный специальный там. По сути, это эквивалентно:

echo -e trte'\'ree

Или:

echo -e 'trte\ree'

Ваша реализация echo, по-видимому, является одной из тех, которые принимают опцию -e, указывающую интерпретировать escape-последовательности ANSI C, поэтому она преобразует \rв символ возврата каретки, который является управляющим символом, который при отправленный на терминал, говорит ему переместить курсор обратно в начало строки, поэтому вы видите eete(, который частично перезаписывается trteсeetrte\reeбез.

Если вы хотите, чтобы аргумент, содержащий \tr\t\e\\re\e, был передан в echo -e, чтобы он выводил <TAB>r<TAB><ESC>\e<ESC>, вам нужно было бы заключать в кавычки/экранировать символы обратной косой черты, чтобы они не интерпретировались оператором как оператор цитирования. оболочка с любой из:

echo -e '\tr\t\e\\re\e'
echo -e \\tr\\t\\e\\\\re\\e
echo -e "\\tr\\t\\e\\\\re\\e" # (\ is still special within "..." to escape
                              # the few characters that are still special
                              # to the shell within double quotes)
echo -e $'\\tr\\t\\e\\\\re\\e' # (\ is not a quoting operator in $'...'
                               # but has its own special meaning there
                               # similar to that it has for echo)

Или вы могли бы сделать:

echo $'\\tr\\t\\e\\\\re\\e'

Где на этот раз $'...'расширяет эти \t, \e, \r, \\в TAB, ESC, CR, \ соответственно, поэтому echoполучает аргумент, содержащий <TAB>r<TAB><ESC>\e<ESC>, который без -eваш echoбудет отображаться как -как (, хотя обратите внимание, что это не относится ко всем реализациям echo, так как многие интерпретируют -eпо умолчанию (, что с некоторыми может быть отключается с помощью-E)).

2
20.08.2021, 10:42

Все это связано с тем, как оболочка анализирует команду, и мало общего с самим echo. Возьмите свой первый пример:

echo -e \tr\t\e\\re\e

Поскольку обратная косая черта появляется вне кавычек, оболочка интерпретирует эти обратные косые черты как управляющие метки, которые удаляют любое специальное (для оболочки )значение символа, следующего за обратной косой чертой. Оболочка разбирает эту строку кода на три слова :echo, -eи trte\ree. Первое слово становится командой для выполнения, а два последних становятся ее аргументами; echoвидит только проанализированные аргументы. Поскольку была задана опция -e, команда echoбудет интерпретировать escape-последовательности как обычно, но в строке trte\ree, потому что это то, что ей передала оболочка.

Заключение второго аргумента в одинарные кавычки не позволяет оболочке интерпретировать символ \, позволяя передать его дословно в echo. Таким образом, с этим:

echo -e '\tr\t\e\\re\e'

оболочка вызовет echoс первым аргументом -eи вторым аргументом \tr\t\e\\re\e. Теперь задача echoинтерпретировать все управляющие последовательности.

3
20.08.2021, 10:42

Теги

Похожие вопросы