Czy ktoś mógłby wyjaśnić, co dzieje się za kulisami ucieczki postaci w powłoce Linux? Próbowałem następujących rzeczy i korzystałem z wyszukiwarki Google, bez żadnego zrozumienia, co się dzieje (i jak):
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!
Jestem tam całkowicie zagubiony, więc na przykład, dlaczego trzy odwrotne ukośniki dają tylko jeden ukośnik? Spodziewałbym się: dwie pierwsze uciekną do jednej, trzecia nie znajdzie nic do ucieczki, więc pozostanie ukośnikiem (linia w pierwszym eksperymencie), ale dzieje się tak, że trzecia po prostu znika.
Dlaczego dostaję jeden odwrotny ukośnik od czterech \\\\ Hello
? Spodziewałbym się, że każda para da jeden ukośnik -> dwa ukośniki odwrotne.
I dlaczego potrzebuję trzech odwrotnych ukośników w ostatnim przypadku, aby uciec \ n? co dzieje się w tle ucieczki, aby to zdobyć? i czym różni się od \\n
przypadku?
Doceniam każde wyjaśnienie tego, co dzieje się w poprzednich liniach.
echo -e
zachowanie nie jest w żaden sposób zdefiniowane w standardach - patrz pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . Dane wyjściowe są całkowicie zdefiniowane w implementacji, jeśli dosłownie występuje gdziekolwiek dosłowny ukośnik odwrotny, a jedyną dozwoloną opcją jest-n
(co oznacza, że implementacja zgodna ze standardami będzieecho -e
drukować-e
na wyjściu).echo -e
nie jest bezpieczne:echo
zachowa się zgodnie ze standardem, jeśli obie opcjeposix
ixpg_echo
opcje wykonawcze są włączone, lub jeśli zostaną skompilowane z równoważnymi opcjami kompilacji.printf
Zamiast tego należy zastosować bezpieczną praktykę - patrz sekcje WYKORZYSTANIE APLIKACJI i WYNIKI powyższego linku, opisujące sposóbprintf
działania w zastępstwieecho
.Odpowiedzi:
Jest tak dlatego
bash
iecho -e
razem. Odman 1 bash
Chodzi o to, że podwójny ukośnik odwrotny nie zawsze jest wyjątkowy.
Istnieją różne implementacje
echo
, jest to wbudowanebash
; ważne jest tutaj to zachowanie:Teraz możemy dekodować:
echo -e "\ Hello!"
- nic specjalnegobash
, nic specjalnegoecho
;\
gorset.echo -e "\\ Hello!"
- pierwszy\
mówi,bash
aby traktować drugi\
dosłownie;echo
dostaje\ Hello!
i działa jak wyżej.echo -e "\\\ Hello!"
- pierwszy\
mówi,bash
aby traktować drugi\
dosłownie;echo
dostaje\\ Hello!
i (z powodu-e
) rozpoznaje\\
jako\
.echo -e "\\\\ Hello!"
- pierwszy\
mówi,bash
aby traktować drugi\
dosłownie; trzeci mówi to samo o czwartym;echo
dostaje\\ Hello!
i (z powodu-e
) rozpoznaje\\
jako\
.echo -e "\\\\\ Hello!"
- pierwszy\
mówi,bash
aby traktować drugi\
dosłownie; trzeci mówi to samo o czwartym; ostatni nie jest wyjątkowy;echo
dostaje\\\ Hello!
i (z powodu-e
) rozpoznaje początkową\\
jako\
, ostatnia\
pozostaje nienaruszona.I tak dalej. Jak widać, do czterech kolejnych odwrotnych ukośników daje jeden wynik. Dlatego potrzebujesz (przynajmniej) dziewięciu z nich, aby zdobyć trzy. 9 = 4 + 4 + 1.
Teraz z
\n
:echo -e "\n Hello!"
- nie ma w tym nic specjalnegobash
, echo dostaje ten sam ciąg i (z tego powodu-e
) interpretuje\n
jako nowy wiersz.echo -e "\\n Hello!"
-bash
interpretuje\\
jako\
;echo
dostaje,\n Hello!
a wynik jest taki sam jak powyżej.echo -e "\\\n Hello!"
-bash
interpretuje początkową\\
jako\
;echo
dostaje\\n Hello!
i (z powodu-e
) interpretuje\\
jako literał,\
który należy wydrukować.Wyniki byłyby różne z
'
zamiast"
(ze względu na różnebash
zachowanie) lub bez-e
(inneecho
zachowanie).źródło
-e
ocenianie tekstu już osądzonego przez bash, prawda? jeśli jest to poprawne, usuwa to zamieszanie. Czy mógłbyś wspomnieć, jak sięsed
zachowuje? czy ma własną technikę ucieczki? więc mam na myśli, czy zachowuje się jak echo-e
?sed
. Możesz jednak zadać inne pytanie (sed
tylko o ), najpierw zrób własne badania.sed
będzie postępować zgodnie z tymi samymi podstawowymi zasadami: bash zinterpretuje wiersz poleceń zgodnie z jego regułami, analizując (a może usuwając) cytaty i zmiany znaczenia. Wynik, który zostanie przekazany dosed
, który interpretuje je zgodnie z jego zasadami uciekających. BTW, możesz to uprościć, używając ciągu pojedynczego cudzysłowubash
, ponieważ nie wymaga to interpretacji interpretacji eny (przez bash) - bash usuwa pojedyncze cudzysłowy i przekazuje to, co jest w nich bezpośrednio, do polecenia.echo -e "\\\n Hello!"
wszelki wypadek. Tutaj bash zrobi ucieczkę, i stanie się\\n
, potem-e
ucieknie powstałe dwa odwrotne ukośniki,\\n
a potem staną się\n
. teraz, kto interpretuje,\n
aby uczynić go nową linią? Zwykle w przypadkuecho -e "\n Hello!"
bash nic nie robi i-e
interpretuje\n
jako nową linię. ale w pierwszej z wymienionych sytuacji proces interpretacji został wykonany przed przystąpieniem\n
do interpretacji. Czy mógłbyś to wyjaśnić?sed
co pomieszało mnie zeszłej nocy (może zrobiłem coś złego wczoraj), ale teraz spróbowałem ponownie to samo zecho -e
ised
, i dostałem to samo, co z wyjątkiem, dzięki!