В этом случае попробуйте перезапустить dbus:
service dbus restart
\
— это оператор кавычек оболочки. \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
сee
)и trte\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
)).
Все это связано с тем, как оболочка анализирует команду, и мало общего с самим 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
интерпретировать все управляющие последовательности.