Может кто-нибудь объяснить, что происходит за кулисами в экранировании персонажей в оболочке Linux? Я попробовал следующее и много гуглил, но безуспешно понял, что (и как) происходит:
root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"
Hello!
root@sv01:~# echo -e "\\n Hello!"
Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!
Я там полностью потерялся, так, например, почему три обратные косые черты дают только одну обратную косую черту? Я ожидаю: первые два будут сброшены на один, третий не найдет ничего, что можно избежать, поэтому он останется косой чертой (строка в первом эксперименте), но происходит то, что третий просто исчезает.
Почему я получаю одну обратную косую черту из четырех \\\\ Hello
? Я ожидаю, что каждая пара даст одну обратную косую черту -> две обратных косых черты.
И почему мне нужно три обратных слеша в последнем случае, чтобы избежать \ n? что происходит на фоне побега, чтобы получить это? а чем он отличается от \\n
дела?
Я ценю любое объяснение того, что происходит в предыдущих строках.
echo -e
в любом случае поведение не определяется стандартами - см. pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . Выходные данные полностью определяются реализацией, если во входных данных есть буквальная обратная косая черта, и единственный допустимый параметр - это-n
(что означает, что реализация, соответствующая стандартам, будет иметьecho -e
печать-e
на своем выходе).echo -e
она небезопасна:echo
будет вести себя в соответствии со стандартом, если включены оба параметраposix
иxpg_echo
параметры времени выполнения, или если они скомпилированы с эквивалентными параметрами времени сборки. Безопасной практикой является использованиеprintf
вместо этого - см. Разделы ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ и ОБОСНОВАНИЕ вышеупомянутой ссылки, описывающие, как заставитьprintf
действовать в качестве заменыecho
.Ответы:
Это потому
bash
и вecho -e
совокупности. Изman 1 bash
Дело в том, что обратный слэш с двойными кавычками не всегда особенный.
Существуют различные реализации
echo
в целом, это встроенныйbash
; главное здесь это поведение:Теперь мы можем расшифровать:
echo -e "\ Hello!"
- ничего особенногоbash
, ничего особенногоecho
;\
остается.echo -e "\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально;echo
получает\ Hello!
и действует как выше.echo -e "\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально;echo
получает\\ Hello!
и (из-за-e
) это признает\\
как\
.echo -e "\\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально; третий говорит то же самое о четвертом;echo
получает\\ Hello!
и (из-за-e
) это признает\\
как\
.echo -e "\\\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально; третий говорит то же самое о четвертом; последний не особенный;echo
получает\\\ Hello!
и (из-за-e
) распознает начальный\\
как\
, последний\
остается неизменным.И так далее. Как видите, до четырех последовательных обратных слешей дают один результат. Вот почему вам нужно (по крайней мере) девять из них, чтобы получить три. 9 = 4 + 4 + 1.
Теперь с
\n
:echo -e "\n Hello!"
- в этом нет ничего особенногоbash
, echo получает ту же строку и (из-за-e
) интерпретирует ее\n
как новую строку .echo -e "\\n Hello!"
-bash
интерпретирует\\
как\
;echo
получает\n Hello!
и результат такой же, как указано выше.echo -e "\\\n Hello!"
-bash
интерпретирует начальное\\
как\
;echo
получает\\n Hello!
и (из-за-e
) это интерпретирует\\
как литерал,\
который должен быть напечатан.Результаты будут отличаться
'
вместо"
(из-за разногоbash
поведения) или без-e
(из-за разногоecho
поведения).источник
-e
судит текст, уже оцененный bash, это правильно? если это правильно, это устраняет путаницу. Не могли бы вы упомянуть, какsed
ведет себя? у него есть своя сборка в технике побега? так я имею в виду это ведет себя как эхо с-e
?sed
. Вы можете задать еще один вопрос (sed
только о ), просто сначала проведите собственное исследование.sed
будет следовать тем же основным принципам: bash будет интерпретировать командную строку в соответствии с ее правилами, анализируя (и, возможно, удаляя) кавычки и экранируя. Результат , который получает передаетсяsed
, который интерпретирует его в соответствии с его вылетающих правилами. Кстати, вы можете упростить это, используя строку в одинарных кавычкахbash
, поскольку в ней не выполняется интерпретация escape-кода (посредством bash) - bash удаляет одинарные кавычки и передает то, что внутри них, непосредственно команде.echo -e "\\\n Hello!"
всякий случай. Здесь bash сбежит , и он станет\\n
, затем-e
избежит двух приведенных в результате обратных наклонных черт,\\n
и тогда они станут\n
. Теперь, кто интерпретирует,\n
чтобы сделать это новой строкой? Обычно, в случаеecho -e "\n Hello!"
, bash ничего не делает и-e
интерпретирует\n
как новую строку. но в первой упомянутой ситуации процесс интерпретации был сделан до того,\n
как получить интерпретацию. Не могли бы вы объяснить это, пожалуйста?sed
чем меня смутило прошлой ночью (возможно, я сделал что-то не так вчера), но теперь я попробовал снова то же самое сecho -e
иsed
, и я получил то же самое, что и исключено, спасибо!